python求解微分方程组_python – SymPy / SciPy:求解具有不同变量的常微分方程组...
我是SymPy和Python的新手,我目前正在使用Python 2.7和SymPy 0.7.5,其目標是:
a)從文本文件中讀取微分方程組
b)解決系統問題
我已經閱讀了this question和this other question,它們幾乎就是我要找的,但我還有一個額外的問題:我事先并不知道方程組的形式,所以我無法在腳本中使用def創建相應的函數與this example一樣.整個事情必須在運行時進行管理.
所以,這里是我的代碼的一些片段.假設我有一個包含以下內容的文本文件system.txt:
dx/dt = 0.0387*x - 0.0005*x*y
dy/dt = 0.0036*x*y - 0.1898*y
我所做的是:
# imports
import sympy
import scipy
import re as regex
# define all symbols I am going to use
x = sympy.Symbol('x')
y = sympy.Symbol('y')
t = sympy.Symbol('t')
# read the file
systemOfEquations = []
with open("system.txt","r") as fp :
for line in fp :
pattern = regex.compile(r'.+?\s+=\s+(.+?)$')
expressionString = regex.search(pattern,line) # first match ends in group(1)
systemOfEquations.append( sympy.sympify( expressionString.group(1) ) )
此時,我仍然堅持使用systemOfEquation列表中的兩個符號表達式.如果我可以從另一個文件中讀取ODE系統的初始條件,為了使用scipy.integrate.odeint,我必須將系統轉換為Python可讀的函數,如:
def dX_dt(X,t=0):
return array([ 0.0387*X[0] - 0.0005*X[0]*X[1],-0.1898*X[1] + 0.0036*X[0]*X[1] ])
有沒有一種很好的方法在運行時創建它?例如,將函數寫入另一個文件,然后將新創建的文件作為函數導入? (也許我在這里很傻,但請記住我對Python比較新:-D)
我已經通過sympy.utilities.lambdify.lambdify看到它可以將符號表達式轉換為lambda函數,但我想知道這是否可以幫助我… lambdify當時似乎與一個表達式一起使用,而不是系統.
提前感謝您的任何建議:-)
編輯:
經過極少的修改,沃倫的答案完美無瑕.我有listOfSymbols中所有符號的列表;此外,它們的顯示順序與odeint將使用的數據X列的順序相同.所以,我使用的功能是
def dX_dt(X,t):
vals = dict()
for index,s in enumerate(listOfSymbols) :
if s != time :
vals[s] = X[index]
vals[time] = t
return [eq.evalf(subs=vals) for eq in systemOfEquations]
我只是在我的具體問題中對變量’time’做了一個例外.再次感謝!
總結
以上是生活随笔為你收集整理的python求解微分方程组_python – SymPy / SciPy:求解具有不同变量的常微分方程组...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用视频替换直播影像用视频替换直播影像怎么
- 下一篇: python函数模块化教程_【软件测试教