常微分方程式の数値解法

常微分方程式の数値解法 (じょうびぶんほうていしきのすうちかいほう、英: Numerical methods for ODEs) は、数値解析において常微分方程式を数値的に解く技術の総称である。 これまで様々な自然現象 (物理現象など) を記述するために多くの常微分方程式が作られ、多くの数学者たちがその解法を探求してきたが、フックス型微分方程式などを除いて、手計算だけで厳密に解ける常微分方程式は多くない。そのため多くの研究者たちが常微分方程式を数値的に解く技術について研究をしてきた。最も標準的な手法はルンゲ・クッタ法であり、MATLABにはode45として搭載されている。しかしこれは万能なソルバーとは言えない。例えばパンルヴェ方程式やリッカチ方程式などは非線形性によって精度の良い計算ができず、数値実験結果だけを見ていると間違った結論 (幻影解) にたどり着く危険がある。そのため[要出典]、 線型多段法 リープ・フロッグ法 オイラー法の進化系 後退オイラー法 (en) en:semi-implicit Euler method en:Euler–Maruyama method (確率微分方程式に特化した解法) en:exponential integrator (行列指数関数を使う解法) 狙い撃ち法 en:Bulirsch–Stoer algorithm シンプレクティック数値積分法 テイラー級数を用いる方法 などの新しい解法に関する研究が進められている。 N {\displaystyle N} 個の変数 y = ( y 1 , ⋯ , y N ) ∈ R N {\displaystyle y=(y_{1},\cdots ,y_{N})\in \mathbb {R} ^{N}} に関する1階常微分方程式、すなわち [ t 0 , b ] × R N {\displaystyle [t_{0},b]\times \mathbb {R} ^{N}} （またはその開集合）で定義されたベクトル値連続関数 f ( t , y ) = ( f 1 ( t , y ) , ⋯ , f N ( t , y ) ) {\displaystyle f(t,y)=(f_{1}(t,y),\cdots ,f_{N}(t,y))} により定まる次の方程式 d y d t = f ( t , y ) {\displaystyle {\frac {dy}{dt}}=f(t,y)} について考える。その初期値問題 (initial-value problem) とは、初期条件 y ( t 0 ) = y 0 {\displaystyle y(t_{0})=y_{0}} を満たす関数 y ( t ) {\displaystyle y(t)} を求めることである。関数 f {\displaystyle f} が第2引数についてリプシッツ連続であるとき、すなわち定数 L {\displaystyle L} が存在し ‖ f ( t , y 1 ) − f ( t , y 2 ) ‖ ≤ L ‖ y 1 − y 2 ‖ {\displaystyle \left\|f(t,y_{1})-f(t,y_{2})\right\|\leq L\|y_{1}-y_{2}\|} （ ‖ ⋅ ‖ {\displaystyle \|\cdot \|} は R N {\displaystyle \mathbb {R} ^{N}} のノルム）を満たすとき、その初期値問題には解が一意に存在する（ピカール・リンデレフの定理）。本節では常微分方程式の初期値問題を数値的に解くことについて議論する。 例として、電気回路の研究から導かれたファン・デル・ポール振動子について考える。その運動方程式は d 2 x d t 2 − μ ( 1 − x 2 ) d x d t + x = 0 {\displaystyle {\frac {d^{2}x}{dt^{2}}}-\mu (1-x^{2}){\frac {dx}{dt}}+x=0} であり、これは2階の常微分方程式であるものの、 v = d x / d t {\displaystyle v=dx/dt} とおくと d x d t = v ,     d v d t = − x + μ ( 1 − x 2 ) v {\displaystyle {\frac {dx}{dt}}=v,\ \ {\frac {dv}{dt}}=-x+\mu (1-x^{2})v} という上述の形に帰着できる。 区間 [ t 0 , t ] {\displaystyle [t_{0},t]} の厳密解を y ( t ) {\displaystyle y(t)} とする。一段法として知られるクラスの数値解法では、離散化した時刻 t i = t 0 + i h {\displaystyle t_{i}=t_{0}+ih} ( h = ( t − t 0 ) / n {\displaystyle h=(t-t_{0})/n} ) での厳密解 y ( t i ) {\displaystyle y(t_{i})} の近似値 η i {\displaystyle \eta _{i}} を η i + 1 = η i + h Φ ( t i , η i ; h ) {\displaystyle \eta _{i+1}=\eta _{i}+h\Phi (t_{i},\eta _{i};h)} という漸化式によって定める。関数 Φ {\displaystyle \Phi } の選択が数値積分スキームを選択することに対応する。離散化した時刻の差分 h = t i + 1 − t i {\displaystyle h=t_{i+1}-t_{i}} を刻み幅あるいはステップサイズと呼ぶ。なお、ここでは時間ステップ h = t i + 1 − t i {\displaystyle h=t_{i+1}-t_{i}} は一定としたが、これを動的に決定する適応刻み（英語版）という手法もある。 厳密解 y ( t ) {\displaystyle y(t)} から差分商 Δ ( t , η ; h ) = { y ( t + h ) − η h h ≠ 0 f ( t , η ) h = 0 {\displaystyle \Delta (t,\eta ;h)={\begin{cases}{\frac {y(t+h)-\eta }{h}}&h\neq 0\\f(t,\eta )&h=0\end{cases}}} を導入するとき、数値積分スキーム Φ {\displaystyle \Phi } の局所離散化誤差 (local discretization error) は Δ ( t , η ; h ) − Φ ( t , η ; h ) {\displaystyle \Delta (t,\eta ;h)-\Phi (t,\eta ;h)} により定義される。整合性のために h → 0 {\displaystyle h\to 0} の極限で局所離散化誤差（厳密にはその上限）は 0 に収束することが要求される。さらに、この極限で局所離散化誤差が Δ ( t , η ; h ) − Φ ( t , η ; h ) = O ( h p ) {\displaystyle \Delta (t,\eta ;h)-\Phi (t,\eta ;h)=O(h^{p})} を満足するとき、この積分スキーム Φ {\displaystyle \Phi } は p {\displaystyle p} 次精度であるという。 一方、 t {\displaystyle t} を固定して n → ∞ {\displaystyle n\to \infty } とするとき、大域離散化誤差 (global discretization error) e ( t ; h n ) = η ( t ; h n ) − y ( t ) ,     h n = t − t 0 n {\displaystyle e(t;h_{n})=\eta (t;h_{n})-y(t),\ \ h_{n}={\frac {t-t_{0}}{n}}} が 0 に収束するならば、その積分スキームは収束するという。 p {\displaystyle p} 次精度 ( p > 0 {\displaystyle p>0} ) の1段法を十分に滑らかな関数 f {\displaystyle f} に適用するとき、そのスキームは収束し大域離散化誤差は e ( t ; h n ) = O ( h n p ) {\displaystyle e(t;h_{n})=O(h_{n}^{p})} のように振る舞うことが保証されている、すなわち大域離散化誤差のオーダーは局所離散化誤差のオーダーに等しい。この結果はすべての整合的な一段法が h → 0 {\displaystyle h\to 0} で漸近的に安定であることを意味するものの、ただし現実的に可能な h {\displaystyle h} で1段法が安定であることは必ずしも保証されない（#安定性節を参照）。 積分スキーム Φ {\displaystyle \Phi } としては以下のものが知られている。 オイラー法: Φ ( t , η ; h ) = f ( t , η ) {\displaystyle \Phi (t,\eta ;h)=f(t,\eta )} とするもの。これは1次精度のスキームである。 ホイン法（英語版）: Φ ( t , η ; h ) = [ f ( t , η ) + f ( t + h , η + h f ( t , η ) ) ] / 2 {\displaystyle \Phi (t,\eta ;h)=[f(t,\eta )+f(t+h,\eta +hf(t,\eta ))]/2} とするもの。これは2次精度のスキームであり、関数 f {\displaystyle f} の評価を2回必要とする。 古典的ルンゲ＝クッタ法: これは4次精度のスキームであり、関数 f {\displaystyle f} の評価を4回必要とする。 このうち古典的ルンゲ＝クッタ法は適用可能範囲の広さやプログラミングの容易さのために広く用いられている（ただし Press らは著書において計算速度の観点から古典的ルンゲ＝クッタ法に否定的に言及している）。 一段法は η i + 1 {\displaystyle \eta _{i+1}} の値を η i {\displaystyle \eta _{i}} だけから定めるものであったが、より多くのステップでの値 η i − 1 {\displaystyle \eta _{i-1}} , ..., η i − r + 1 {\displaystyle \eta _{i-r+1}} を使う積分スキームは多段法 (multistep method) と呼ばれる。この場合、最初の η 0 {\displaystyle \eta _{0}} , ..., η r − 1 {\displaystyle \eta _{r-1}} はこのスキームでは定めることができず、1段法などの他の方法を用いる必要がある。多段法としてはアダムス・バッシュフォース法や、それを応用する予測子修正子法などがある（これはどちらも η i + 1 {\displaystyle \eta _{i+1}} が η i − r + 1 {\displaystyle \eta _{i-r+1}} , ..., η i {\displaystyle \eta _{i}} の線型関数として定まるため、線型多段法と呼ばれる）。 数値積分スキームの安定性はしばしばそれを初期値問題 d y d t = λ y ,     y ( 0 ) = 1 {\displaystyle {\frac {dy}{dt}}=\lambda y,\ \ y(0)=1} （ λ {\displaystyle \lambda } は複素数の定数）に適用することで定量化される。問題のスキームを一定の刻み幅 h {\displaystyle h} で適用することで得られる数列 { y n } n = 0 , 1 , ⋯ {\displaystyle \{y_{n}\}_{n=0,1,\cdots }} について、それが極限 n → ∞ {\displaystyle n\to \infty } で 0 に収束するような h λ {\displaystyle h\lambda } がなす複素平面上の領域を絶対安定領域と呼ぶ。もとの初期値問題の厳密解は y ( t ) = e λ t {\displaystyle y(t)=e^{\lambda t}} であり、これは R e { λ } < 0 {\displaystyle \mathrm {Re} \{\lambda \}<0} のとき t → ∞ {\displaystyle t\to \infty } で 0 に収束する。そこである積分スキームの絶対安定領域が左半平面を含むとき、そのスキームはA-安定 (A-stable) であるという。 関数 f ( t , y ) {\displaystyle f(t,y)} が大きな値を取り積分スキームによっては極端に時間刻み幅 h {\displaystyle h} を小さくする必要がある場合、その常微分方程式は硬い方程式と呼ばれる。この場合には十分に安定なスキームを用いる必要が生じる。これはしばしば y i + 1 {\displaystyle y_{i+1}} を陰関数的に y i {\displaystyle y_{i}} 等から定める陰解法によって実現される。 解析対象となる微分方程式が何らかの特別な性質を持つとき、汎用の数値積分法ではなく、その性質を尊重するように構成された数値解法を用いることがあり、そのような手法は構造保存型解法または幾何学的数値解法と呼ばれる。例えば古典力学（ハミルトン力学）において時間発展はシンプレクティック写像であり、エネルギー（ハミルトニアン）等の保存量が存在する。この場合にはシンプレクティック数値積分法というハミルトン系にのみ適用可能な数値解法が存在し、良好な性質を持つことが知られている。 常微分方程式 d y d x = f ( x , y ) {\displaystyle {\frac {dy}{dx}}=f(x,y)} の解 y ( x ) {\displaystyle y(x)} で, a ≠ b {\displaystyle a\neq b} に対する境界条件 r ( y ( a ) , y ( b ) ) = c {\displaystyle r(y(a),y(b))=c} を満足するものを求める問題を境界値問題 (boundary-value problem) と呼ぶ。初期値問題と異なり、境界値問題では複数の解が存在すること、あるいは解が存在しないことがあり得る。また、スツルム＝リウヴィル型微分方程式のように常微分方程式にパラメータ λ {\displaystyle \lambda } が含まれ、境界値問題に解が存在するようにパラメータ λ {\displaystyle \lambda } を同時に定める問題もある。 これらの問題を数値的に解く最も単純な方法が狙い撃ち法 (shooting method) である。一方の端点（例えば x = a {\displaystyle x=a} ）において初期条件 y ( a ) {\displaystyle y(a)} を適当に定めて微分方程式をもう一方の端点 x = b {\displaystyle x=b} まで解き、境界条件を満たすように未定の初期条件（および固有値）を適切に選ぶ。これはニュートン法などの関数の根を求めるアルゴリズム（これはしばしば逐次反復を伴う）を常微分方程式の数値解法と組み合わせることを意味する。ただし初期条件によっては区間 [ a , b ] {\displaystyle [a,b]} 全体で定義された解が存在しないことがあり、そのために改良された手法がある。あるいは有限要素法 (finite element method) などの手法も用いられる。 高精度に解く技術が追求されている一方で、「計算機で解の存在を検証する」という研究もおこなわれている。このような研究が必要となるのは、近似解が求まったとしてもそれが幻影解である危険性があるからである。偏微分方程式ではすでに幻影解が報告されているので、常微分方程式でも警戒が必要である。偏微分方程式の時と同様に関数解析学的な手法も考えられるが、関数解析学に頼らない手法 (例えば狙い撃ち法、スペクトル法やアフィン演算など) に基づく研究が主流であり、欧米などの海外のみならず日本国内でも研究されている。また、爆発解 (英: Blow-up solution) に特化した精度保証付き解法も探求されている。 ローレンツ方程式 レスラー方程式 ダフィング方程式 COSY INFINITY INTLAB: MATLAB/GNU Octaveを使用する区間演算ライブラリであり、version 11 からODEソルバー (AWA toolbox と Taylor model toolbox の二つ) が搭載された。 kv C++による区間演算ライブラリであり、ODEソルバーを搭載している。 kv - GitHub CAPD C++による区間演算ライブラリであり、力学系への応用のために開発された en:Chebfun