我一直在研究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).
我有一个同意写的ODE系统:
from sympy.parsing.sympy_parser import parse_expr
xs = symbols('x1 x2')
ks = symbols('k1 k2')
strs = ['-k1 * x1**2 + k2 * x2', 'k1 * x1**2 - k2 * x2']
syms = [parse_expr(item) for item in strs]
Run Code Online (Sandbox Code Playgroud)
我想这转换成向量量值函数,接受的x值,第k值的1D numpy的阵列的一维阵列numpy的,返回在那些点评估的方程的一个一维阵列numpy的.签名看起来像这样:
import numpy as np
x = np.array([3.5, 1.5])
k = np.array([4, 2])
xdot = my_odes(x, k)
Run Code Online (Sandbox Code Playgroud)
我想要这样的东西的原因是给这个功能scipy.integrate.odeint,所以它需要快.
尝试1:潜艇
当然,我可以写一个包装器subs:
def my_odes(x, k):
all_dict = dict(zip(xs, x))
all_dict.update(dict(zip(ks, k)))
return np.array([sym.subs(all_dict) for sym in syms])
Run Code Online (Sandbox Code Playgroud)
但这是超级慢的,特别是对于我的真实系统,它更大,并且运行了很多次.我需要将此操作编译为C代码.
尝试2:theano
我可以通过sympy …