- 締切済み
オイラー法のCプログラムについて
x1[i+1]=x1[i]+x2[i]*t x2[i+1]=x2[i]+(-2ab*x2[i]-a^2*x1[i]+a^2*c)*t 上式を次のようなプログラムで表したのですが、出力される値が全て0になってしまいます。 もし原因が分かる方が居られましたらよろしくお願いします。 #include <stdio.h> int main(void) { double x1i = 0.0,x2i = 0.0; /*x1[i] x2[i]*/ double xa,xb; /*x1[i+1] x2[i+1]*/ double a; double b; double t = 0.05; double c = 1.0; scanf("%f" ,&a); scanf("%f", &b); while(t < 20){ xa = x1i + x2i * t; xb = x2i + ((-2 * b * a * x2i) - (a * a * x1i) + a * a * c) * t; x1i = xa; x2i = xb; t += 0.05; printf("%lf %lf \n", x1i,t); } return 0; }
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- f272
- ベストアンサー率46% (8467/18126)
#1です。 そういうことではなくて double t = 0.05; からはtが時間幅のように見えるが t += 0.05; からはtが時刻のように見える。 通常はx[i+1]=x[i]+x'[i]*dtでdtは時間幅のように計算するものだけれど,本当に式は意図通りなの?ということ。 あとは#2さんの言うようにaやbが意図通りに読まれているかどうかの確認です。
- kmee
- ベストアンサー率55% (1857/3366)
scanfの解説やマニュアルを良く読みましょう。 また、コンパイラの警告レベルを上げてコンパイルすれば、警告を出してくれるかもしれません。 (gccなら-Wall オプションを指定する、等) printfには不要なのにつけてあって、scanfには必須なのについてないものがあります。
- f272
- ベストアンサー率46% (8467/18126)
本当に x1[i+1]=x1[i]+x2[i]*t x2[i+1]=x2[i]+(-2ab*x2[i]-a^2*x1[i]+a^2*c)*t でよいのかどうかが気になるが,それはさておき a=0にすればx1iはすべて0になるよね。
補足
書き忘れで申し訳ないのですが dx1/dt =x2 , dx2/dt = -a^2*x1-2ab*x2+a^2*c にオイラー法を用いたもので、a,b=1を想定しています。
お礼
時間と時間幅を同一にしていたのが主な原因のようでした。 そこを直したところ上手くいきました。 回答ありがとうございました。