ルンゲクッタ法の更新式
一般に,(1)の時間発展を計算したい場合,手軽に使用できるのが古典的なルンゲクッタ法だ.
dtdx=f(x,t)
これを用いると,hを時間ステップ幅として次のように計算を進めることができる.
k1=f(x,t)k2=f(x+2hk1,t+2h) k3=f(x+2hk2,t+2h)k4=f(x+hk3,t+h)
Δx=6h(k1+2k2+2k3+k4)
ルンゲクッタ法の利点は,4次精度の近似を行いつつも更新式が非常にシンプルに表されている点だ.4次精度を得たいだけであれば,それを実現するようなスキームはいくらでも作り出すことが出来るので,ルンゲクッタ法の重要なポイントは手順のシンプルさにあると言ってもいいだろう.今回は,(2)の表記は与えられているものとして,これが4次精度を実現出来ているということを確認してみたい.
4次精度の意味
まず4次精度ということの意味はなんだろうか.ある点(x0,t0)の周りで(3)と近似したとき,そのままの形で,点(x0,t0)でのテイラー展開(4)と4次の項まで一致すれば文句なしだが,そんなことはない.(3)のhについての微係数が4次まで一致するのである.(あるいは(3)をhについてテイラー展開し直したものが(4)と4次の項まで一致するといってもいい.)
x~=x0+6h(k1+2k2+2k3+k4)
x=x0+dtdxh+21dt2d2xh2+61dt3d3xh3+241dt4d4xh4+O(h5)
x~のhに関する微分を見てみよう.
dhdx~=61(k1+2k2+2k3+k4)+6h[dhdk1+2dhdk2+2dhdk3+dhdk4]dh2d2x~= 31[dhdk1+2dhdk2+2dhdk3+dhdk4]+ 6h[dh2d2k1+2dh2d2k2+2dh2d2k3+dh2d2k4]dh3d3x~= 21[dh2d2k1+2dh2d2k2+2dh2d2k3+dh2d2k4]+ 6h[dh3d3k1+2dh3d3k2+2dh3d3k3+dh3d3k4]dh4d4x~=32[dh3d3k1+2dh3d3k2+2dh3d3k3+dh3d3k4]+ 6h[dh4d4k1+2dh4d4k2+2dh4d4k3+dh4d4k4]
h=0での微係数についてのみ考えたいので,いずれの場合もhの1次の項になっている部分は無視してしまってよい.これらが,dtdx,dt2d2x,dt3d3x,dt4d4xと一致することを示せば,4次精度(より正確には,ルンゲクッタ法1ステップの誤差がO(h5)オーダーであるということ)が確認できたことになる.
ルンゲクッタ法の精度確認
ここからは,地道に4次精度となっていることを確認していこう.まず,実現するべき1~4次の微係数を求めておく.
dtdx=f
dt2d2x=∂t∂f+∂x∂fdtdx=∂t∂f+∂x∂ff
dt3d3x=∂t∂(∂t∂f+∂x∂ff)+∂x∂(∂t∂f+∂x∂ff)f=∂t2∂2f+∂t∂x∂2ff+∂x∂f∂t∂f+∂x∂t∂2ff+∂x2∂2ff2+(∂x∂f)2f=∂t2∂2f+2∂t∂x∂2ff+∂x∂f∂t∂f+∂x2∂2ff2+(∂x∂f)2f
dt4d4x=∂t∂(dt3d3x)+∂x∂(dt3d3x)f=∂t3∂3f+2∂t2∂x∂3ff+2∂t∂x∂2f∂t∂f+∂t∂x∂2f∂t∂f+∂x∂f∂t2∂2f +∂t∂x2∂3ff2+2∂x2∂2f∂t∂ff+2∂t∂x∂2f∂x∂ff+(∂x∂f)2∂t∂f +∂x∂t2∂3ff+2∂t∂x2∂3ff2+2∂t∂x∂2f∂x∂ff+∂x2∂2f∂t∂ff+∂x∂f∂x∂t∂2ff +∂x3∂3ff3+2∂x2∂2f∂x∂ff2+2∂x2∂2f∂x∂ff2+(∂x∂f)3f=∂t3∂3f+3∂t2∂x∂3ff +3∂t∂x2∂3ff2+∂x3∂3ff3 +3∂t∂x∂2f∂t∂f+5∂t∂x∂2f∂x∂ff+3∂x2∂2f∂t∂ff+∂x∂f∂t2∂2f+4∂x2∂2f∂x∂ff2 +(∂x∂f)2∂t∂f+(∂x∂f)3f
次に,k1,k2,k3,k4のhに関する微分を求めていきたいのだが,まず準備としてf(X(h),T(h))の微分を求めておく.
dhdf=(dhdX∂X∂+dhdT∂T∂+∂h∂)f=∂X∂fdhdX+∂T∂fdhdT
dh2d2f=(dhdX∂X∂+dhdT∂T∂+∂h∂)2f=[(dhdX)2∂X2∂2+2dhdXdhdT∂X∂T∂2+(dhdT)2∂T2∂2+∂h∂(dhdX∂X∂)+∂h∂(dhdT∂T∂)]f=[(dhdX)2∂X2∂2+2dhdXdhdT∂X∂T∂2+(dhdT)2∂T2∂2+dh2d2X∂X∂+dh2d2T∂T∂]f
dh3d3f=(dhdX∂X∂+dhdT∂T∂+∂h∂)3f=[(dhdX)3∂X3∂3+3(dhdX)2dhdT∂X2∂T∂3.+3dhdX(dhdT)2∂X∂T2∂3+(dhdT)3∂T3∂3+3dhdXdh2d2X∂X2∂2+3(dhdXdh2d2T+dhdTdh2d2X)∂X∂T∂2+3dhdTdh2d2T∂T2∂2+dh3d3X∂X∂+dh3d3T∂T∂]f
k1はhに依らないので,次の関係が成り立つ.
dhdk1=0
k2に関しては,X=x+2hk1, T=t+2hより,dhdX,dhdTは次のように表される.
dhdX=2k1+2hdhdk1=2f, dhdT=21
これをdhdf, dh2d2f, dh3d3fに代入すれば,k2の微分が得られる.
dhdk2=2f ∂x∂f+21∂t∂f
dh2d2k2=4f2∂x2∂2f+2f∂x∂t∂2f+41∂t2∂2f
dh3d3k2=8f3∂x3∂3f+83f2∂x2∂t∂3f+83f∂x∂t2∂3f+81∂t3∂3f
次にk3に関しては,X=x+2hk2, T=t+2hより,それぞれの微分は次のように表される.
dhdX=2k2+2hdhdk2, dhdT=21
dh2d2X=dhdk2+2hdh2d2k2, dh2d2T=0
dh3d3X=23dh2d2k2+2hdh3d3k2
最終的に必要なのはh=0の時の値なので,その場合に限ってのみk3の微分を求める.
dhdk3∣∣h=0=2k2∂x∂f+21∂t∂f
dh2d2k3∣∣h=0=4k22∂x2∂2f+2k2∂x∂t∂2f+41∂t2∂2f+dhdk2∂x∂f
dh3d3k3∣∣h=0= 8k23∂x3∂3f+83k22∂x2∂t∂3f+83k2∂x∂t2∂3f+81∂t3∂3+23k2dhdk2∂x2∂2f+23dhdk2∂x∂t∂2f+23dh2d2k2∂x∂f
同様にk4に関しては,次のように求めることが出来る.
dhdX=k3+hdhdk3, dhdT=1
dh2d2X=2dhdk3+hdh2d2k3, dh2d2T=0
dh3d3X=3dh2d2k3+hdh3d3k3
dhdk4∣∣h=0=k3∂x∂f+∂t∂f
dh2d2k4∣∣h=0=k32∂x2∂2f+2k3∂x∂t∂2f+∂t2∂2f+2dhdk3∂x∂f
dh3d3k4∣∣h=0=3k33∂x∂3f+3k32∂x2∂t∂3f+3k3∂x∂t2∂3f+∂t3∂3f+6k3dhdk3∂x2∂2f+6dhdk3∂x∂t∂2+3dh2d2k3∂x∂f
これで(やっと)準備が整ったので,係数比較を行っていこう.
1次:
61(k1+2k2+2k3+k4)∣∣h=0=f
2次:
31[dhdk1+2dhdk2+2dhdk3+dhdk4]h=0=31[2(2f∂x∂f+21∂t∂f)+2(2f∂x∂f+21∂t∂f)+f∂x∂f+∂t∂f]=f∂x∂f+∂t∂f
3次:
21[dh2d2k1+2dh2d2k2+2dh2d2k3+dh2d2k4]h=0=21[2(4f2∂x2∂2f+2f∂x∂t∂2f+41∂t2∂2f)+2(4f2∂x2∂2f+2f∂x∂t∂2f+41∂t2∂2f+(2f∂x∂f+21∂t∂f)∂x∂f)+(f2∂x2∂2f+2f∂x∂t∂2f+ ∂t2∂2f+2(2f∂x∂f+21∂t∂f)∂x∂f)]=∂x2∂2f+2f∂x∂t∂2f+∂t2∂2f+f(∂x∂f)2+∂t∂f∂x∂f
4次:
32[dh3d3k1+2dh3d3k2+2dh3d3k3+dh3d3k4]h=0=32[2(8f3∂x3∂3f+83f2∂x2∂t∂3f+83f∂x∂t2∂3f+81∂t3∂3f) +2(8k23∂x3∂3f+83k22∂x2∂t∂3f+83k2∂x∂t2∂3f+81∂t3∂3+23k2dhdk2∂x2∂2f+23dhdk2dxdt∂2f+23dh2d2k2∂x∂f) +(k33∂x∂3f+3k32∂x2∂t∂3f+3k3∂x∂t2∂3f+∂t3∂3f+6k3dhdk3∂x2∂2f+6dhdk3∂x∂t∂2+3dh2d2k3∂x∂f)]=∂t3∂3f+3∂t2∂x∂3ff +3∂t∂x2∂3ff2+∂x3∂3ff3 +3∂t∂x∂2f∂t∂f+5∂t∂x∂2f∂x∂ff+3∂x2∂2f∂t∂ff+∂x∂f∂t2∂2f+4∂x2∂2f∂x∂ff2 +(∂x∂f)2∂t∂f+(∂x∂f)3f
まとめと参考文献
以上で各微係数が一致することが確認できた.途中の式変形をほぼ省略せずに書いているので,何かの参考になれば幸いだ.特にこれと言って式変形の参考にしたものはない.ただ,数値計算一般の参考文献という意味でを挙げておく.手元に置いておくと安心,という書籍のひとつだと思う.