有没有办法在python中求解耦合微分方程组?

fac*_*est 17 python numpy sympy scipy enthought

我一直在研究sympy和scipy,但是找不到或弄清楚如何求解耦合微分方程组(非线性,一阶).

那么有没有办法解决耦合微分方程?

方程的形式如下:

V11'(s) = -12*v12(s)**2
v22'(s) = 12*v12(s)**2
v12'(s) = 6*v11(s)*v12(s) - 6*v12(s)*v22(s) - 36*v12(s)
Run Code Online (Sandbox Code Playgroud)

初始条件为v11(s),v22(s),v12(s).

War*_*ser 13

对于具有scipy的ODE的数值解,请参阅函数scipy.integrate.odeint或类scipy.integrate.ode.

SciPy Cookbook中给出了一些例子(向下滚动到"常微分方程"部分).


小智 10

除了SciPy的方法odeintode那些已经提到的,它现在有solve_ivp哪些是新的,往往更方便。一个完整的例子,编码[v11, v22, v12]为一个数组v

from scipy.integrate import solve_ivp
def rhs(s, v): 
    return [-12*v[2]**2, 12*v[2]**2, 6*v[0]*v[2] - 6*v[2]*v[1] - 36*v[2]]
res = solve_ivp(rhs, (0, 0.1), [2, 3, 4])
Run Code Online (Sandbox Code Playgroud)

这在(0, 0.1)具有初始值的区间上求解系统[2, 3, 4]。结果具有自变量(符号中的 s)为res.t

array([ 0.        ,  0.01410735,  0.03114023,  0.04650042,  0.06204205,
        0.07758368,  0.0931253 ,  0.1       ])
Run Code Online (Sandbox Code Playgroud)

这些值是自动选择的。可以提供t_eval在所需点评估解决方案:例如,t_eval=np.linspace(0, 0.1)

因变量(我们正在寻找的函数)在res.y

array([[ 2.        ,  0.54560138,  0.2400736 ,  0.20555144,  0.2006393 ,
         0.19995753,  0.1998629 ,  0.1998538 ],
       [ 3.        ,  4.45439862,  4.7599264 ,  4.79444856,  4.7993607 ,
         4.80004247,  4.8001371 ,  4.8001462 ],
       [ 4.        ,  1.89500744,  0.65818761,  0.24868116,  0.09268216,
         0.0345318 ,  0.01286543,  0.00830872]])
Run Code Online (Sandbox Code Playgroud)

使用 Matplotlib,这个解决方案被绘制为plt.plot(res.t, res.y.T)(如果我t_eval如上所述提供,该图会更平滑)。

解决方案图

最后,如果系统涉及高于 1 阶的方程,则需要使用归约到一阶系统