logo

明示的なルンゲ=クッタ法 📂数値解析

明示的なルンゲ=クッタ法

概要

微分方程式ソルバー、ルンゲ=クッタ法を紹介する。よく使われる 4次ルンゲ=クッタ法 RK4についての詳しい説明は、別記事にて発表されている。

ビルドアップ

次のように与えられる常微分方程式を考える。yyttに対する函数であり、^{\prime}ttに対する微分を意味する。 y=f(t,y),tt0,y(t0)=y0 y^{\prime} = f(t,y),\quad t \ge t_{0},\quad y(t_{0}) = y_{0} これをtnt_{n}からtn+1=tn+ht_{n+1} = t_{n} + hまで積分すると(混乱を避けるため積分変数をttの代わりにτ\tauにしよう)、 tntn+1ydτ=tntn+1f(τ,y)dτ \int_{t_{n}}^{t_{n+1}}y^{\prime}d\tau = \int_{t_{n}}^{t_{n+1}} f(\tau,y)d\tau 左辺を整理してτtn+hτ\tau \equiv t_{n} + h\tauに置き換えると次の式を得る。 [y(τ)]tntn+1=tntn+1f(τ,y)dτ \big[y(\tau)\big]_{t_{n}}^{t_{n+1}} = \int_{t_{n}}^{t_{n+1}} f(\tau,y)d\tau y(tn+1)=y(tn)+tntn+1f(τ,y)dτ=y(tn)+h01f(tn+hτ,y(tn+hτ))dτ \Downarrow \\ y(t_{n+1}) = y(t_{n}) + \int_{t_{n}}^{t_{n+1}} f(\tau,y)d\tau = y(t_{n}) + h\int_{0}^{1} f\big(t_{n} + h\tau,y(t_{n} + h\tau)\big)d\tau

今、後置きの積分を和として近似して次の式を得る。

y(tn+1)=y(tn)+hj=1νbjf(tn+cjh,y(tn+cjh)),n=0,1,2,(1) y(t_{n+1}) = y(t_{n}) + h\sum_{j=1}^{\nu} b_{j} f\big(t_{n} + c_{j}h,y(t_{n} + c_{j}h)\big),\quad n=0,1,2,\cdots \tag{1}

これは、yn=y(tn)y_{n} = y(t_{n})を知っているとき、yn+1=y(tn+1)y_{n+1} = y(t_{n+1})を知ることができる近似式である。もちろん、右辺には未知数であるy(tn+cjh)y(t_{n} + c_{j}h)が含まれているので、これも近似する必要がある。式が複雑なので、次のようにj=1,2,,νj = 1,2,\dots,\nuについて表記しよう。

ξj=y(tn+cjh) \xi_{j} = y(t_{n} + c_{j}h)

まずc1=0c_{1} = 0としておこう。するとξ1=yn\xi_{1} = y_{n}なので、既知の値である。ここで多段階法を適用してξj\xi_{j}たちを次のように逐次的に近似するとしよう。

ξ2=y(tn+c2h)=yn+ha2,1f(tn+c1h,yn+c1h)=yn+ha2,1f(tn,yn)(c1=0)=yn+ha2,1f(tn,ξ1)(ξ1=yn)ξ3=y(tn+c3h)=yn+ha3,1f(tn+c1h,yn+c1h)+ha3,2f(tn+c2h,yn+c2h)=yn+ha3,1f(tn,ξ1)+ha3,2f(tn+c2h,ξ2)ξν=yn+hj=1n1aν,jf(tn+cjh,ξj) \begin{align*} \xi_{2} &= y(t_{n} + c_{2}h) \\ &= y_{n} + h a_{2,1}f(t_{n} + c_{1}h, y_{n} + c_{1}h) \\ &= y_{n} + h a_{2,1}f(t_{n}, y_{n}) & (\because c_{1} = 0)\\ &= y_{n} + h a_{2,1}f(t_{n}, \xi_{1}) & (\because \xi_{1}=y_{n}) \\[2em] \xi_{3} &= y(t_{n} + c_{3}h) \\ &= y_{n} + h a_{3,1}f(t_{n} + c_{1}h, y_{n} + c_{1}h) + h a_{3,2}f(t_{n} + c_{2}h, y_{n} + c_{2}h) \\ &= y_{n} + h a_{3,1}f(t_{n}, \xi_{1}) + h a_{3,2}f(t_{n} + c_{2}h, \xi_{2}) \\ &\vdots \\ \xi_{\nu} &= y_{n} + h\sum_{j=1}^{n-1}a_{\nu,j} f(t_{n} + c_{j}h, \xi_{j}) \end{align*}

これで(1)(1)の右辺の値yny_{n}f(tn,ξ1)f(t_{n}, \xi_{1})f(tn+c2h,ξ2)f(t_{n} + c_{2}h, \xi_{2})\dotsf(tn+cj1h,ξj1)f(t_{n} + c_{j-1}h, \xi_{j-1})全てを求めたことになる。明示的ルンゲ=クッタexplicit Runge-Kutta, ERKメソッドとは、yn+1y_{n+1}の値をyny_{n}f(tn,ξ1)f(t_{n}, \xi_{1})f(tn+c2h,ξ2)f(t_{n} + c_{2}h, \xi_{2})\dotsf(tn+cj1h,ξj1)f(t_{n} + c_{j-1}h, \xi_{j-1})の線形結合として近似して得る方法を言う。

定義

明示的ルンゲ=クッタ法とは、与えられたyny_{n}に対してyn+1y_{n+1}を次のように近似する方法である。

yn+1=yn+hj=1νbjf(tn+cjh,ξj),n=0,1,2,(2) y_{n+1} = y_{n} + h\sum_{j=1}^{\nu} b_{j} f(t_{n} + c_{j}h, \xi_{j}),\quad n=0,1,2,\cdots \tag{2}

ここで、各ξj\xi_{j}は、

ξ1=ynξ2=yn+ha2,1f(tn,ξ1)ξ3=yn+ha3,1f(tn,ξ1)+ha3,2f(tn+c2h,ξ2)ξν=yn+hi=1ν1aν,if(tn+cih,ξi) \begin{align*} \xi_{1} &= y_{n} \\ \xi_{2} &= y_{n} + ha_{2,1}f(t_{n}, \xi_{1}) \\ \xi_{3} &= y_{n} + ha_{3,1}f(t_{n}, \xi_{1}) + ha_{3,2}f(t_{n} + c_{2}h, \xi_{2}) \\ \vdots & \\ \xi_{\nu} &= y_{n} + h\sum_{i=1}^{\nu-1}a_{\nu, i}f(t_{n} + c_{i}h, \xi_{i}) \end{align*}

この時ν×ν\nu \times \nu 行列 A=[aj,i]A = [a_{j,i}]ルンゲ=クッタ行列RK matrixと言う。式の中で空いている成分は00である。

A=[aj,i]=[a2,1a3,1a3,2aν,1aν,2aν,ν1] A = [a_{j,i}] = \begin{bmatrix} \\ a_{2,1} & \\ a_{3,1} & a_{3,2} \\ \vdots & \\ a_{\nu,1} & a_{\nu,2} & \cdots & a_{\nu,\nu-1} & \end{bmatrix}

また、以下のb\mathbf{b}c\mathbf{c}をそれぞれRKウェイトRK weightsRKノードRK nodesと言う。

b=[b1b2bν]andc=[c1c2cν] \mathbf{b} = \begin{bmatrix} b_{1} \\ b_{2} \\ \vdots \\ b_{\nu} \end{bmatrix} \quad \text{and} \quad \mathbf{c} = \begin{bmatrix} c_{1} \\ c_{2} \\ \vdots \\ c_{\nu} \end{bmatrix}

また、(2)(2)が**ν\nu ステージ**ν\nu stagesを持つと言い、このような方法をν\nuステージ(またはν\nu次)ルンゲ=クッタ法と言う。

説明

定義により、RK行列は明らかに下三角行列である。

上記の方法に従って、ξj\xi_{j}ξ1\xi_{1}からξν\xi_{\nu}まで逐次的に計算することができる。結果として(2)(2)を計算でき、yn+1y_{n+1}が得られる。これを繰り返して、次のステップでのyyの値yn+2y_{n+2}yn+3y_{n+3}\dotsを求めることができる。

RK法では、係数aj,ia_{j,i}bjb_{j}cjc_{j}求めるものではなく、選んで使用するものである。係数はcAbt\begin{array}{c|c} \mathbf{c} & A \\ \hline & \mathbf{b}^{t} \end{array}のような形で表記され、これをRKテーブルRK tableauxと言う。よく使われるRK4のRKテーブルは次のようである。

012121201210010016131316 \begin{array}{c|cccc} 0 & \\[0.5em] \frac{1}{2} & \frac{1}{2} \\[0.5em] \frac{1}{2} & 0 & \frac{1}{2} \\[0.5em] 1 & 0 & 0 & 1 \\[0.5em] \hline {\displaystyle {\color{white}\dfrac{0}{0}}} & \frac{1}{6} & \frac{1}{3} & \frac{1}{3} & \frac{1}{6} \end{array}

参考