总体而言,我对SymPy和Python还不熟悉,目前我正在使用Python 2.7和SymPy 0.7.5,目标是:
a) 从文本文件中读取微分方程组
b) 解决系统问题
我已经读过this question和{a2},它们几乎都是我要找的,但是我还有一个额外的问题:我事先不知道方程组的形式,所以我不能像this example那样在脚本中使用def来创建相应的函数。整个过程必须在运行时进行管理。在
下面是我的一些代码片段。假设我有一个文本文件系统.txtdx/dt = 0.0387*x - 0.0005*x*y
dy/dt = 0.0036*x*y - 0.1898*y
我要做的是:
^{pr2}$
此时,我只能使用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将使用的数据列的顺序相同。所以,我使用的函数是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'做了一个例外。再次感谢!:-)