#define MAXN (1000)
double x[MAXN+1];
...
x[0] = x0;
t = a;
for (j = 0; j < N; j++) {
x[j+1] = x[j] + h * f(t,x[j]);
t += h;
}
|
double x; // 配列でなくて良い。
...
x = x0;
t = a;
for (j = 0; j < N; j++) {
x += h * f(t,x);
t += h; // t = a + (j+1)*h の方が良いかも。
}
|
| test-euler.c |
/* test-euler.c -- 微分方程式の初期値問題を Euler 法で解く */
#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;
}
|
| コンパイル&実行 |
cc test-euler.c ./a.out分割数
確認用にいくつかの
分割数 |