私はsympyとscipyで作業してきましたが、連立微分方程式(非線形の1次)のシステムを解く方法を見つけたり、理解したりできません。
それでは、連立微分方程式を解く方法はありますか?
方程式は次の形式です。
V11'(s) = -12*v12(s)**2
v22'(s) = 12*v12(s)**2
v12'(s) = 6*v11(s)*v12(s) - 6*v12(s)*v22(s) - 36*v12(s)
v11(s)、v22(s)、v12(s)の初期条件あり。
Scipyを使用したODEの数値解については、 scipy.integrate.solve_ivp
、 scipy.integrate.odeint
または scipy.integrate.ode を参照してください。
SciPyクックブック にいくつかの例が示されています(「常微分方程式」のセクションまでスクロールしてください)。
すでに述べたSciPyメソッドodeint
とode
に加えて、 _solve_ivp
_ が新しくなり、多くの場合より便利になりました。 _[v11, v22, v12]
_を配列v
としてエンコードする完全な例:
_from scipy.integrate import solve_ivp
def rhs(s, v):
return [-12*v[2]**2, 12*v[2]**2, 6*v[0]*v[2] - 6*v[2]*v[1] - 36*v[2]]
res = solve_ivp(rhs, (0, 0.1), [2, 3, 4])
_
これにより、間隔_(0, 0.1)
_でシステムが初期値_[2, 3, 4]
_で解かれます。結果には、_res.t
_として独立変数(表記ではs)があります。
_array([ 0. , 0.01410735, 0.03114023, 0.04650042, 0.06204205,
0.07758368, 0.0931253 , 0.1 ])
_
これらの値は自動的に選択されました。 _t_eval
_を指定して、ソリューションを必要なポイントで評価することができます(例:t_eval=np.linspace(0, 0.1)
)。
従属変数(探している関数)は_res.y
_にあります。
_array([[ 2. , 0.54560138, 0.2400736 , 0.20555144, 0.2006393 ,
0.19995753, 0.1998629 , 0.1998538 ],
[ 3. , 4.45439862, 4.7599264 , 4.79444856, 4.7993607 ,
4.80004247, 4.8001371 , 4.8001462 ],
[ 4. , 1.89500744, 0.65818761, 0.24868116, 0.09268216,
0.0345318 , 0.01286543, 0.00830872]])
_
Matplotlibでは、このソリューションはplt.plot(res.t, res.y.T)
としてプロットされます(前述のように_t_eval
_を指定した場合、プロットはよりスムーズになります)。
最後に、システムに1より高い次数の方程式が含まれる場合、 1次システムへの簡約 を使用する必要があります。