gpt4 book ai didi

python - 求解隐式 ODE(微分代数方程 DAE)

转载 作者:太空狗 更新时间:2023-10-30 02:45:43 27 4
gpt4 key购买 nike

我正在尝试使用 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_ra 的求值之间有很多逻辑> 并且代数运算失败。

我相信可以使用 MATLAB 的 ode15i 解决 DAE功能,但我尽可能避免这种情况。

我的问题是 - 有没有办法解决 python 中的隐式 ODE 函数 (DAE)(最好是 scipy)?是否有更好的方法来解决上述问题?

作为最后的手段,从上一个时间步传递 a 可能是可以接受的。我如何在每个时间步后将 dydt[1] 传递回函数?

最佳答案

很旧,但值得更新,因此它可能对偶然发现此问题的任何人都有用。目前 python 中可以解决隐式 ODE 的包非常少。GEKKO ( https://github.com/BYU-PRISM/GEKKO ) 是软件包之一,专门针对混合整数、非线性优化问题进行动态优化,但也可以用作通用 DAE 求解器。

上述“假装物理学”问题可以在 GEKKO 中按如下方式解决。

m= GEKKO()
m.time = np.linspace(0,100,101)
F_l = m.Param(value=1000)
mass = m.Param(value =1000)
m.options.IMODE=4
m.options.NODES=3
F_r = m.Var(value=0)
x = m.Var(value=0)
v = m.Var(value=0,lb=0)
a = m.Var(value=5,lb=0)
m.Equation(x.dt() == v)
m.Equation(v.dt() == a)
m.Equation (F_r == (((1-a)/3)**2 + (2*(1+a)/3)**2 * v))
m.Equation (a == (1000 - F_l)/mass)
m.solve(disp=False)
plt.plot(x)

enter image description here

关于python - 求解隐式 ODE(微分代数方程 DAE),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23578596/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com