|
>どこが間違っているのか分かりません。間違っている所を教えてくださいお願いします。
刻み値dtが大きすぎると思います。それから、ループ変数に
xを使うのも変です。ループ変数は別に取るべきです。そうで
ないと、xに刻み値dtを加算した値が無視されてしまいます。
double dy(double x, double y, double z) {
return z; /* dy/dx = z */
}
double dz(double x, double y, double z) {
return -1.25 * y - 0.25 * z + 0.5; /* dz/dx = -1.25y-0.25z+0.5 */
}
int main(void)
{
int i;
double x, y, z;
double k[4], l[4];
double dt = 0.05;
double xs = 0.0; /* xの初期値の定義 */
double ys = 0.0; /* yの初期値の定義 */
double zs = 0.1; /* y'の初期値の定義 */
x = xs;
y = ys;
z = zs;
for (i = 0; i <= 100; i++) {
k[0] = dy(x, y, z); /* kの値を求める */
l[0] = dz(x, y, z);
k[1] = dy(x + dt / 2, y + k[0]*dt/2,z+l[0]*dt/2);
l[1] = dz(x + dt / 2, y + k[0]*dt/2,z+l[0]*dt/2);
k[2] = dy(x + dt / 2, y + k[1]*dt/2,z+l[1]*dt/2);
l[2] = dz(x + dt / 2, y + k[1]*dt/2,z+l[1]*dt/2);
k[3] = dy(x + dt / 2, y + k[2]*dt/2,z+l[2]*dt/2);
l[3] = dz(x + dt / 2, y + k[2]*dt/2,z+l[2]*dt/2);
x += dt;
y += (dt / 6) * (k[0] + 2 * k[1] + 2 * k[2] + k[3]);
z += (dt / 6) * (l[0] + 2 * l[1] + 2 * l[2] + l[3]);
printf("%f %f \n", x, y);
}
return 0;
}
|