Euler法のプログラムを Runge-Kutta法を用いるように書き換えるのは簡単である。
rk1ex1.c |
/* * rk1ex1.c (Runge-Kutta method for Malthusian model) */ #include <stdio.h> double k = 1.0; int main(void) { int i, N; double t, x, dt, k1, k2, k3, k4; double f(double, double), x0; double Tmax; // 初期値 x0 = 1.0; // 最終時刻 Tmax = 1.0; // 時間刻み printf("# N: "); scanf("%d", &N); dt = Tmax / N; // 初期値 t = 0.0; x = x0; printf("# t x\n"); printf("%f %f\n", t, x); // Runge-Kutta 法 for (i = 0; i < N; i++) { k1 = dt * f(x, t); k2 = dt * f(x + k1/2, t + dt / 2); k3 = dt * f(x + k2/2, t + dt / 2); k4 = dt * f(x + k3, t + dt); x += (k1 + 2 * k2 + 2 * k3 + k4) / 6; t = (i + 1) * dt; printf("%f %20.14f\n", t, x); } return 0; } double f(double x, double t) { return k * x; } |
cc でコンパイル&実行 |
% cc rk1ex1.c
% ./a.out # N: 100 # t x 0.000000 1.000000 中略 1.000000 2.718282 % |
解曲線の図を描くための手順は Euler 法のときと同様 (データファイルの名前を変えるくらい) なので省略する。
問5 2.718282 は小数点以下6位までしか表示していないが、 小数点以下15位まで表示するように C プログラムを書き直して実行せよ (printf() の書式の選び方の問題, 「浮動小数点数の入出力と四則演算」)。 そうすると 2.718281828234403 となる。 この2.718281828234403 の誤差はいくらか。 を変えることで誤差がどのように変わるか調べよ (両側対数目盛でプロットすることを勧める, 「対数グラフを描く」)。