ルンゲ=クッタ法
出典: フリー百科事典『ウィキペディア(Wikipedia)』
ルンゲ=クッタ法(Runge-Kutta method)とは、数値解析において常微分方程式の近似解を求める一連の方法である。この技法は1900年頃に数学者C. RungeとM. W. Kuttaによって発展された。
目次 |
[編集] 古典的な4次ルンゲ=クッタ法
一般に用いられているルンゲ=クッタ法は4次のルンゲ=クッタ法(RK4)と呼ばれるものである。
初期値問題を次のように設定する。
次に、RK4ではこの問題に対して次式を与える。
ここで、
である。
このようにして、次のステップの値(yn+1)が、現在の値(yn)とその間隔(h)の積から見積もられた勾配から求められる。その勾配は重み付け平均である。
- k1は初期値における勾配である。
- k2は区間の中央における勾配であり、勾配k1を用いてtn + h/2におけるyの値をオイラー法により決定したものである。
- k3は区間の中央における勾配を再計算したものであり、k2の値から決められたyの値を用いる。
- k4は区間の最後における勾配であり、k3の値から決められたyの値を用いる。
これら4つの平均を取るには、中央の勾配に対して大きな重み付けを与える。
RK4は4次の方法であり、全体の推定誤差がh4のオーダーになることを意味する。
[編集] イクスプリシットルンゲ=クッタ法
イクスプリシット(またはエクスプリシット)ルンゲ=クッタ法は前述した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 |
[編集] 用法
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)を計算する。