ルンゲ=クッタ法
ルンゲ=クッタ法(Runge-Kutta method)とは、数値解析において常微分方程式の近似解を求める一連の方法である。この技法は1900年頃に数学者 C. Runge と M.W. Kutta によって発展された。
目次 |
[編集] 古典的な4次ルンゲ=クッタ法
一般に用いられているルンゲ=クッタ法は4次のルンゲ=クッタ法(RK4)と呼ばれるものである。
初期値問題を次のように設定する。
次に、RK4ではこの問題に対して次式を与える。
ここで、
である。すなわち、次の値(yn+1)は、現在の値(yn)に間隔(h)と推定された勾配の積を加えたものである。その勾配は次の4つの勾配の重み付け平均で求める。
- k1は初期値における勾配である。
- k2は区間の中央における勾配であり、勾配k1を用いてtn + h/2におけるyの値をオイラー法により決定したものである。
- k3は区間の中央における勾配を再計算したものであり、k2の値から決められたyの値を用いる。
- k4は区間の最後における勾配であり、k3の値から決められたyの値を用いる。
これら4つの平均を取るには、中央の勾配に対して大きな重み付けを与える。
RK4は4次の方法である。すなわち、厳密解とRK4のテイラー展開が4次の項まで一致する(したがって全体の推定誤差はh5のオーダーになる)。
[編集] 陽的ルンゲ=クッタ法
陽的ルンゲ=クッタ法は前述したRK4の一般化である。次式で与えられる。
ここで、
(注:これらの式は差分を含んでいるが、異なる書式による等価の定義である。)
個々の問題としては、整数s(段数)と、係数aij (for 1 ≤ j < i ≤ s), bi (for i = 1, 2, ..., s) および ci (for i = 2, 3, ..., s)を与える必要がある。それらのデータはRunge-Kutta tableauとして、記憶を助ける配置として知られている。:
| 0 | ||||||
| c2 | a21 | |||||
| c3 | a31 | a32 | ||||
![]() |
![]() |
![]() |
||||
| cs | as1 | as2 | ![]() |
as,s − 1 | ||
| b1 | b2 | ![]() |
bs − 1 | bs |
ルンゲ=クッタ法は次のように一貫したものである、
私達があるオーダーpを持つ方法を必要とする場合、切断誤差が O(hp+1)となる付随する条件がある。切断誤差自体の定義からこれらを得ることができる。例えば、2次の方法はb1 + b2 = 1, b2c2 = 1/2, and b2a21 = 1/2であれば2次のオーダーを持つ。
[編集] 例
RK4をこの枠組みに当てはめると、その tableauは:
| 0 | |||||
| 1/2 | 1/2 | ||||
| 1/2 | 0 | 1/2 | |||
| 1 | 0 | 0 | 1 | ||
| 1/6 | 1/3 | 1/3 | 1/6 |
ところで、最も単純なルンゲ=クッタ法は(前方)オイラー法であり、公式yn + 1 = yn + hf(tn,yn)で与えられる。これは1段の陽的ルンゲ=クッタ法から構成される。対応するtableauは:
| 0 | ||
| 1 |
2次の方法による例は中間値法により与えられる。
対応するtableauは:
| 0 | |||
| 1/2 | 1/2 | ||
| 0 | 1 |
[編集] 誤差と収束性
関数fがp階連続偏微分可能であるならば、p次RK法から得られた近似解と厳密解の局所誤差にはステップ幅をパラメータとした誤差限界が存在する。
しかし、この誤差限界はpが高次になると意味を成さなくなる。そのため、ステップ幅の選定には様々な補外法が提案されている。
[編集] 用法
2段の陽的ルンゲ=クッタ法の例を示す。
| 0 | |||
| 2/3 | 2/3 | ||
| 1/4 | 3/4 |
次の初期値問題を解くものとする。
ステップの値をh=0.025.とする。
tableauは、方法の定義のもとで同等な対応をする方程式をもたらす。:
| t0 = 1 | |||
| y0 = 1 | |||
| t1 = 1.025 | |||
| u1 = y0 = 1 | f(t0,u1) = 2.557407725 | u2 = y0 + 2 / 3hf(t0,u1) = 1.042623462 | |
| y1 = y0 + h(1 / 4f(t0,u1) + 3 / 4f(t0 + 2 / 3h,u2) = 1.066869388 | |||
| t2 = 1.05 | |||
| u1 = y1 = 1.066869388 | f(t1,u1) = 2.813524695 | u2 = y1 + 2 / 3hf(t1,u1) = 1.113761467 | |
| y2 = y1 + h(1 / 4f(t1,u1) + 3 / 4f(t1 + 2 / 3h,u2) = 1.141332181 | |||
| t3 = 1.075 | |||
| u1 = y2 = 1.141332181 | f(t2,u1) = 3.183536647 | u2 = y2 + 2 / 3hf(t2,u1) = 1.194391125 | |
| y3 = y2 + h(1 / 4f(t2,u1) + 3 / 4f(t2 + 2 / 3h,u2) = 1.227417567 | |||
| t4 = 1.1 | |||
| u1 = y3 = 1.227417567 | f(t3,u3) = 3.796866512 | u2 = y3 + 2 / 3hf(t3,u1) = 1.290698676 | |
| y4 = y3 + h(1 / 4f(t3,u1) + 3 / 4f(t3 + 2 / 3h,u2) = 1.335079087 | |||
数値解は下線を付した値に対応する。yiの再計算を避けるためにf(ti,u1)を計算する。
















![y' = (\tan{y})+1,\quad y(1)=1,\ t\in [1, 1.1]](http://upload.wikimedia.org/wikipedia/ja/math/f/1/c/f1ca09fda8c7fed17cced9169ce5d451.png)


