我正在尝试使用scipy中的odeint求解一个二阶ODE。我遇到的问题是函数隐式地与二阶项相耦合,如简化的代码片段所示(请忽略示例中的假物理内容):
import numpy as np
from scipy.integrate import odeint
def integral(y,t,F_l,mass):
dydt = np.zeros_like(y)
x, v = y
F_r = (((1-a)/3)**2 + (2*(1+a)/3)**2) * v # 'a' implicit
a = (F_l - F_r)/mass
dydt = [v, a]
return dydt
y0 = [0,5]
time = np.linspace(0.,10.,21)
F_lon = 100.
mass = 1000.
dydt = odeint(integral, y0, time, args=(F_lon,mass))
在这种情况下,我意识到可以通过代数方法解出隐式变量,但在我的实际场景中,在
F_r
和对a
的评估之间有很多逻辑,代数运算失败了。我相信可以使用MATLAB的ode15i函数来解决DAE,但我尽可能地避免这种情况。
我的问题是 - 是否有一种方法可以在Python(首选scipy)中解决隐式ODE函数(DAE)?以及是否有更好的方式来表达上述问题以解决它?
作为最后的手段,从上一个时间步骤传递
a
可能是可接受的。如何在每个时间步骤后将dydt [1]
传回函数?