web-dev-qa-db-ja.com

Pythonで連立微分方程式を解く方法はありますか?

私は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)の初期条件あり。

18
faceforest

Scipyを使用したODEの数値解については、 scipy.integrate.solve_ivpscipy.integrate.odeint または scipy.integrate.ode を参照してください。

SciPyクックブック にいくつかの例が示されています(「常微分方程式」のセクションまでスクロールしてください)。

13

すでに述べたSciPyメソッドodeintodeに加えて、 _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_を指定した場合、プロットはよりスムーズになります)。

plot of solution

最後に、システムに1より高い次数の方程式が含まれる場合、 1次システムへの簡約 を使用する必要があります。

3
user6655984