python - 用于编写与 odeint 一起使用的方程的循环
问题描述
我有一个初值问题需要解决;微分方程来自一个看起来像这样的字典:
eqs = {'a': array([-1., 2., 4., 0., ...]),
'b': array([ 1., -10., 0., 0., ...]),
'c': array([ 0., 3., -4., 0., ...]),
'd': array([ 0., 5., 0., -0., ...]),
...}
微分方程da/dt
为-1*[a]+2*[b]+4*[c]+0*[d]
....
使用上面的字典,我编写了一个函数dXdt
:
def dXdt (X, t):
sys_a, sys_b, sys_c, sys_d,... = eqs['a'], eqs['b'], eqs['c'], eqs['d'],...
dadt = sys_a[0]*X[0]+sys_a[1]*X[1]+sys_a[2]*X[2]+sys_a[3]*X[3]+...
dbdt = sys_b[0]*X[0]+sys_b[1]*X[1]+sys_b[2]*X[2]+sys_b[3]*X[3]+...
dcdt = sys_c[0]*X[0]+sys_c[1]*X[1]+sys_c[2]*X[2]+sys_c[3]*X[3]+...
dddt = sys_d[0]*X[0]+sys_d[1]*X[1]+sys_d[2]*X[2]+sys_d[3]*X[3]+...
...
return [dadt, dbdt, dcdt, dddt, ...]
初始条件为:
X0 = [1, 0, 0, 0, ...]
解决方案如下:
X = integrate.odeint(dXdt, X0, np.linspace(0,10,11))
这适用于小型系统,我可以在其中手动编写方程式。但是,我有一个系统有大约 150 个微分方程,并且我需要自动化我的写作方式dXdt
,with scipy.integrate.odeint
给定字典eqs
。有没有办法这样做?
解决方案
任何时候任何事情都遵循简单的线性模式,您可以使用迭代或理解来表达它。如果你有多个这样的模式,你可以嵌套它们。所以这:
sys_a, sys_b, sys_c, sys_d,... = eqs['a'], eqs['b'], eqs['c'], eqs['d'],...
dadt = sys_a[0]*X[0]+sys_a[1]*X[1]+sys_a[2]*X[2]+sys_a[3]*X[3]+...
dbdt = sys_b[0]*X[0]+sys_b[1]*X[1]+sys_b[2]*X[2]+sys_b[3]*X[3]+...
dcdt = sys_c[0]*X[0]+sys_c[1]*X[1]+sys_c[2]*X[2]+sys_c[3]*X[3]+...
dddt = sys_d[0]*X[0]+sys_d[1]*X[1]+sys_d[2]*X[2]+sys_d[3]*X[3]+...
...
[dadt, dbdt, dcdt, dddt, ...]
可以简单地表示为:
[sum(eqs[char][i] * X[i] for i in range(len(X))) for char in eqs.keys()]
推荐阅读
- java - 检查 Java 正则表达式中的特定字符
- javascript - 获取 FormData 的原始 POST 正文字符串
- reactjs - ReactJS 无法访问 setState 中的响应对象
- javascript - 我的问题是关于在 Javascript 中将文本框值存储在数组中并将它们求和
- reactjs - For...in 循环在发送到 Firestore 时添加键而不是值
- python-hypothesis - 如何在假设中定义策略以生成一对相似的递归对象
- python-3.x - 取整数列表的平均值
- c# - C#如何分区并行foreach循环以迭代我的列表
- python - 如果发生特定异常,重新运行 try 块的简单方法?
- eclipse - 无法从 Eclipse 中以开发模式启动 Chrome