我正在尝试使用 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
失败。
我相信 DAE 可以使用 MATLAB 的ode15i函数来解决,但如果可能的话,我会尽量避免这种情况。
我的问题是-有没有办法解决python中的隐式ODE函数(DAE)(最好是scipy)?有没有更好的方法来提出上述问题?
a
作为最后的手段,从前一个时间步长通过是可以接受的。我怎么能dydt[1]
在每个时间步之后传回函数?