java常微分方程数值解,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'做了一个例外 . 再次感谢! :-)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值