【发布时间】:2026-02-02 16:00:01
【问题描述】:
我正在尝试使用 scipy 中的 odeint 解决二阶 ODE。我遇到的问题是函数隐式耦合到二阶项,如简化的 sn-p 所示(请忽略示例的假装物理):
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] 传递回函数?
【问题讨论】:
-
你也可以看看DAE Tools。
标签: python scipy constraints ode numerical-integration