编写与 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()]