アプリ版:「スタンプのみでお礼する」機能のリリースについて

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;
}

A 回答 (3件)

#1です。


そういうことではなくて
double t = 0.05;
からはtが時間幅のように見えるが
t += 0.05;
からはtが時刻のように見える。
通常はx[i+1]=x[i]+x'[i]*dtでdtは時間幅のように計算するものだけれど,本当に式は意図通りなの?ということ。
あとは#2さんの言うようにaやbが意図通りに読まれているかどうかの確認です。
    • good
    • 0
この回答へのお礼

時間と時間幅を同一にしていたのが主な原因のようでした。
そこを直したところ上手くいきました。
回答ありがとうございました。

お礼日時:2014/11/20 18:49

scanfの解説やマニュアルを良く読みましょう。



また、コンパイラの警告レベルを上げてコンパイルすれば、警告を出してくれるかもしれません。
(gccなら-Wall オプションを指定する、等)



printfには不要なのにつけてあって、scanfには必須なのについてないものがあります。
    • good
    • 0

本当に


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を想定しています。

補足日時:2014/11/19 18:58
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!