python求解微分方程组_python – SymPy / SciPy:求解具有不同变量的常微分方程组...
我是SymPy和Python的新手,我目前正在使用Python 2.7和SymPy 0.7.5,其目標是:
a)從文本文件中讀取微分方程組
b)解決系統(tǒng)問題
我已經(jīng)閱讀了this question和this other question,它們幾乎就是我要找的,但我還有一個額外的問題:我事先并不知道方程組的形式,所以我無法在腳本中使用def創(chuàng)建相應(yīng)的函數(shù)與this example一樣.整個事情必須在運行時進行管理.
所以,這里是我的代碼的一些片段.假設(shè)我有一個包含以下內(nèi)容的文本文件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系統(tǒng)的初始條件,為了使用scipy.integrate.odeint,我必須將系統(tǒng)轉(zhuǎn)換為Python可讀的函數(shù),如:
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] ])
有沒有一種很好的方法在運行時創(chuàng)建它?例如,將函數(shù)寫入另一個文件,然后將新創(chuàng)建的文件作為函數(shù)導(dǎo)入? (也許我在這里很傻,但請記住我對Python比較新:-D)
我已經(jīng)通過sympy.utilities.lambdify.lambdify看到它可以將符號表達式轉(zhuǎn)換為lambda函數(shù),但我想知道這是否可以幫助我… lambdify當(dāng)時似乎與一個表達式一起使用,而不是系統(tǒng).
提前感謝您的任何建議:-)
編輯:
經(jīng)過極少的修改,沃倫的答案完美無瑕.我有l(wèi)istOfSymbols中所有符號的列表;此外,它們的顯示順序與odeint將使用的數(shù)據(jù)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’做了一個例外.再次感謝!
總結(jié)
以上是生活随笔為你收集整理的python求解微分方程组_python – SymPy / SciPy:求解具有不同变量的常微分方程组...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用视频替换直播影像用视频替换直播影像怎么
- 下一篇: 异地备份与云备份如何选择异地备份与云备份