首页 > 解决方案 > 用于编写与 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 个微分方程,并且我需要自动化我的写作方式dXdtwith scipy.integrate.odeint给定字典eqs。有没有办法这样做?

标签: pythonscipyodeint

解决方案


任何时候任何事情都遵循简单的线性模式,您可以使用迭代或理解来表达它。如果你有多个这样的模式,你可以嵌套它们。所以这:

    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()]

推荐阅读