🐍ルンゲクッタ法を実演できるpythonライブラリは?

FORTRANライブラリodepackのlsodaを使って常微分方程式系を解く。
剛体または非剛体の一次方程式系の初期値問題を解く:

https://docs.scipy.org/doc/scipy/reference/generated/scipy.integrate.odeint.html#scipy.integrate.odeint

常微分方程式系の初期値問題を解く。
この関数は,初期値が与えられた常微分方程式系を数値積分する.
dy / dt = f(t, y)
y(t0) = y0
ここでtは1次元独立変数(時間)、y(t)はN次元ベクトル値関数(状態)、N次元ベクトル値関数f(t, y)は微分方程式を決定する。目標は、初期値y(t0)=y0が与えられたときに、微分方程式をほぼ満足するy(t)を求めることである。
いくつかのソルバは複素領域での積分をサポートしていますが、剛性ODEソルバの場合、右辺は複素微分可能でなければならない(Cauchy-Riemann方程式[11]を満たす)ことに注意してください。複素数領域の問題を解くには、y0に複素数データ型を渡します。実部と虚部に分けて問題を書き直すことも可能です。

https://docs.scipy.org/doc/scipy/reference/generated/scipy.integrate.solve_ivp.html#scipy.integrate.solve_ivp

RK45' (デフォルト): 5(4)次の陽解法ルンゲクッタ法[1]。誤差は4次法の精度を仮定して制御されますが、ステップは5次の正確な公式を用いて行われます(局所的な外挿が行われます)。密な出力には4次補間多項式が使用される[2]。複素数領域で適用可能。

非剛性問題には陽解法ルンゲクッタ法('RK23', 'RK45', 'DOP853')を、剛性問題には陰解法('Radau', 'BDF')を用いるべきである[9]。ルンゲクッタ法の中で、高精度(rtolとatolの値が小さい)で解くには、'DOP853'を推奨します。
よくわからない場合は、まず'RK45'を実行してみてください。異常に多くの反復をしたり、発散したり、失敗したりする場合は、問題が硬い可能性が高いので、'Radau' または 'BDF' を使うべきです。'LSODA'も普遍的な良い選択ですが、古いFortranコードをラップしているので、作業にはやや不便かもしれません。
ソルバーを実装するOdeSolverから派生した任意のクラスを渡すこともできます。

ルンゲクッタ法(特に一般的な4次のルンゲクッタ法)を実装するためのPythonライブラリとして、最も一般的に使用されるのはscipyライブラリの一部であるscipy.integrateモジュールです。このモジュールは、常微分方程式(ODE)の数値解法を提供しており、ルンゲクッタ法を含む多くの解法が利用できます。

scipy.integrateモジュールの中のodeint関数やsolve_ivp関数は、ルンゲクッタ法を利用して常微分方程式を解くのに特に適しています。solve_ivpはより新しく、柔軟なAPIを提供しており、様々な種類のルンゲクッタ法(例えばRK45, RK23など)を選択できます。

PyTorchを使用して微分方程式を解くことは可能です。PyTorchは主にディープラーニング用のライブラリとして知られていますが、その自動微分機能は微分方程式の解法にも応用できます。特に、ニューラルネットワークを利用した微分方程式の解法、一般に「ニューラル常微分方程式(Neural ODE)」と呼ばれる手法が近年注目されています。

ニューラル常微分方程式では、微分方程式の解をニューラルネットワークモデルで近似します。微分方程式の解が持つべき特性(例えば、初期条件を満たすこと、方程式を満足すること)を損失関数に組み込み、ニューラルネットワークを訓練してこの損失関数を最小化します。PyTorchの自動微分機能が、このプロセスを容易にします。

一方で、PyTorchを使って従来の数値解法(例えばルンゲクッタ法など)を実装することも可能です。PyTorchのテンソル演算と自動微分機能を利用して、微分方程式の数値解法のアルゴリズムを実装できます。ただし、このアプローチは一般的な数値解法専用ライブラリ(例えばSciPy)よりも柔軟性は高いものの、実装が複雑になる可能性があります。

ニューラルネットワークを用いた微分方程式の解法は、特に複雑な方程式や解析的に解けない方程式に対して有効ですが、ニューラルネットワークモ

デルの設計や訓練には専門的な知識が必要です。また、ニューラルネットワークに基づく解法は近似解であることに注意が必要です。そのため、解の精度や解法の適用範囲について慎重に検討する必要があります。

具体的には、PyTorchを使って微分方程式を解く際には、次のようなステップが含まれます:

  1. 微分方程式の定義: 解きたい微分方程式を定義します。

  2. ニューラルネットワークモデルの設計: 微分方程式の解を近似するためのニューラルネットワークを設計します。

  3. 損失関数の定義: 微分方程式の解が満たすべき条件を表す損失関数を定義します。これには、微分方程式自体と初期条件や境界条件が含まれます。

  4. モデルの訓練: 損失関数を最小化するようにニューラルネットワークを訓練します。PyTorchの最適化アルゴリズム(例:Adam, SGD)を使用します。

  5. 解の評価: 訓練されたモデルを使用して微分方程式の解を評価し、必要に応じて解の品質を分析します。

このアプローチは、特にデータ駆動型の問題や、解析的な解が得られない複雑な非線形微分方程式に対して有効です。しかし、従来の数値解法と比較して、訓練プロセスが計算コストが高い場合があります。また、解の品質はモデルの設計や訓練プロセスに大きく依存します。

RK45' (デフォルト): 5(4)次の陽解法ルンゲクッタ法[1]。誤差は4次法の精度を仮定して制御されますが、ステップは5次の正確な公式を用いて行われます(局所的な外挿が行われます)。密な出力には4次補間多項式が使用される[2]。複素数領域で適用可能。
RK23': 3(2)次の陽解法ルンゲクッタ法 [3]。誤差は2次法の精度を仮定して制御されるが、ステップは3次の正確な公式を用いて取られる(局所的な外挿が行われる)。密な出力には3次エルミート多項式が使用される。複素数領域で適用可能。
DOP853': 8次の陽解法ルンゲクッタ法 [13].元々Fortranで書かれた "DOP853 "アルゴリズムのPython実装[14]。7次までの正確な補間多項式が密な出力に使用されます。複素数領域に適用可能。
Radau」: 次数5の Radau IIA ファミリーの陰解法ルンゲクッタ法 [4]。誤差は3次精度の埋め込み式で制御される。コロケーション条件を満たす3次多項式が密な出力に使用されます。
BDF」: 微分近似のための後方微分式に基づく陰的多段階可変次数(1~5)法[5]。実装は[6]に記載されているものに従う。準定数ステップスキームを使用し、NDF修正により精度を向上。複素数領域で適用可能。
LSODA」: 自動剛性検出とスイッチングを備えたAdams/BDF法 [7], [8]。ODEPACKのFortranソルバーのラッパーです。

https://docs.scipy.org/doc/scipy/reference/generated/scipy.integrate.solve_ivp.html#scipy.integrate.solve_ivp


いいなと思ったら応援しよう!

あたり帳簿
お願い致します