Chapter 3
高次の Runge-Kutta 法
2次より高次の RK 法は同じように



といふうにm+1行m列の行列の形(Stetter の行列表現)で高次の RK 法を紹介していきます。
3.1 2次の RK 法
先ほどやったやつですがこの行列で表すと

また、さきほどの場合は

となります。
3.1.1 3次の RK 法

が3次の RK 法です。もちろん係数は代表的なものであって、これが唯一ではありません。ただ、3次はあまり使われませ ん。それは手間や精度などを考慮すると4次のほうがお得だからです。
3.2 4次の RK 法
4次では例えば

のようなものが有名です。4次の RK 法はかなりよく使われるものです。ためしにこれであの


/*四次RK法*/
#include <stdio.h> #include <math.h> int main(void){ double x =1; double kx[5] ={0}; double u =0; double ku[5] ={0}; double y =0; double ky[5] ={0}; double v =1; double kv[5] ={0}; double h; int k,t; for(k=0;k < 100; k++){ for(t=0;t <=3;t++){ if(t<=2) h=0.1; else h=0.2; ku[t+1] =- (x+h *kx[t]) / sqrt((y+h *ky[t])*(y+h*ky[t])+(x+h *kx[t])*(x+h *kx[t])); kx[t+1] = u+h *ku[t]; kv[t+1] = -(y+h *ky[t]) / sqrt((y+h *ky[t])*(y+h*ky[t])+(x+h *kx[t])*(x+h *kx[t])); ky[t+1] = v+h *kv[t]; } u =u+(ku[1]+2*ku[2]+2*ku[3]+ku[4])*0.2/6; x =x+(kx[1]+2*kx[2]+2*kx[3]+kx[4])*0.2/6; v =v+(kv[1]+2*kv[2]+2*kv[3]+kv[4])*0.2/6; y =y+(ky[1]+2*ky[2]+2*ky[3]+ky[4])*0.2/6; if(k%2==0) printf("%f %f\n",x,y); } return 0; } |
です。この結果が
です。点の位置はほぼ理論値と一致していますね。確かにこの4次の RK 法がよく使われる理由がわかっていただける かと思います。