我正在尝试使用来自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))
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我意识到可以代数求解隐式变量,但是在我的实际场景中,逻辑之间存在很多逻辑F_r,a并且代数运算的评估失败。
我相信可以使用MATLAB的ode15i函数来解决DAE ,但我尝试尽可能避免这种情况。
我的问题是-有办法解决python(最好是scipy)中的隐式ODE函数(DAE)吗?有没有更好的方法解决以上问题呢?
作为最后的选择,可以接受上a一个时间步长。dydt[1]每个时间步长后如何传递回函数?