C言語の質問です。 x”(t)+(1-sin(t) )・x(t)=0 という運動方程式をシミュレーションしてt-x図を描きたいです。 そこでルンゲクッタ法で計算する以下のコードを書きましたが、tがどれだけ変化してもx=0と出力されてしまいます。 どこを直せばよいかわかりますでしょうか。 #include<stdio.h> #include<math.h> /*Main Program*/ int main(void){ double dt, xmax, xmin, x, f; int i, imax; FILE *fp; /*syoki jyouken 1*/ x = 0.0; /*syoki jyouken 2*/ f = 0.0; /*kizamihaba*/ dt = 0.1; /*kurikaesisuu*/ imax = 300; printf("imax is %d¥n", imax); xmax = 20.0 ; xmin = -20.0; fp=fopen( "duffing.csv", "w"); /*start computational cicle*/ for(i = 0;i<=imax;i++){ double idt, k1x, k1f; double k2x, k2f, k3x, k3f, k4x, k4f; idt = dt * (double)i; //k1 to k4 calculation k1x = dt * f; k1f = dt * x * ( sin( idt) - 1); k2x = dt * (f + k1f / 2.0); k2f = dt * (x + k1x / 2) * ( sin (idt + dt / 2) - 1); k3x = dt * (f + k2f / 2.0); k3f = dt * (x + k2x / 2) * ( sin (idt + dt / 2) )- 1); k4x = dt * (f + k3f); k4f = dt * (x + k3x / 2) * ( sin (idt + dt ) - 1); //4-thorder RKM x = x + (k1x + 2.0*k2x + 2.0*k3x + k4x)/6.0; f = f + (k1f + 2.0*k2f + 2.0*k3f + k4f)/6.0; //syuturyoku if(i%5 == 0){ printf("t = %f. x = %f¥n", idt, x); fprintf(fp, "%f, %f¥n", idt, x); } } return(0); }
C言語関連