reidai5-1.c |
/* * reidai5-1.c -- 微分方程式の初期値問題を Euler 法で解く * http://nalab.mind.meiji.ac.jp/~mk/program/ode_prog/reidai5-1.c */ #include <stdio.h> #include <math.h> int main(void) { /* 開始時刻と終了時刻 */ double a = 0.0, b = 1.0; /* 変数と関数の宣言 */ int N, j; double t,x,h,x0,f(double, double); /* 初期値 */ x0 = 1.0; /* 区間の分割数 N を入力してもらう */ printf("N="); scanf("%d", &N); /* 小区間の幅 */ h = (b-a) / N; /* 開始時刻と初期値のセット */ t=a; x=x0; printf("t=%f, x=%f\n", t, x); /* Euler 法による計算 */ for (j = 0; j < N; j++) { x += h * f(t,x); t += h; printf("t=%f, x=%f\n", t, x); } return 0; } /* 微分方程式 x'=f(t,x) の右辺の関数 f の定義 */ double f(double t, double x) { return x; } |
このプログラムをコンパイルして12 実行すると、分割数 を尋ねてきますので、色々な値を入力して試してみ て下さい。各時刻 における の値( ) を画面に 出力します。
確認用にいくつかの の値に対する場合の、 の値を書いてお きます。 の場合 , の場合 , の場合 , の場合 , .
分割数 が大きくなるほど、真の値 に近付いていくはずです。