scipy の odeint を使用して 2 次 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]
各時間ステップの後に関数に戻すにはどうすればよいですか?