编写与 odeint 一起使用的方程式的循环
A loop to write equations to be used with 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()]
我有一个初值问题需要解决;微分方程是从一个看起来像这样的字典中导出的:
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()]