/* ************************************************************************ * ルンゲ・クッタ法による1次元運動方程式の解法 * * 速度に比例する抵抗がある強制振動子 * ************************************************************************ t:時間、x:位置、v:速度、dt:時間の刻み幅 t0、x0、v0:初期値 tlim:時間の最大値 alpha:速度に比例する抵抗の係数 omega:強制力の振動数 f0:強制力の振幅 物体の質量 m=1 ばね定数 k=1 */ #include #include #define N 2 /* 方程式の数 */ double alpha, omega, f0; main() { void rungen(double t, double x[], double dt); double f(double t, double x[], int i); double t, x[N], v0, dt, h; double pi,tlim; int j; /* 出力ファイルの指定 */ FILE *output; output = fopen("osc.dat","w"); /* 強制力の振動数、強制力の振幅 */ printf("Input: omega f0\n"); scanf("%lf%lf", &omega, &f0); printf("omega=%g\t f0=%g\n", omega, f0); /* 速度に比例する抵抗の係数 */ printf("Input: alpha\n"); scanf("%lf", &alpha); printf("alpha=%g\n", alpha); /* 時間の刻み幅 */ printf("Input: dt\n"); scanf("%lf", &dt); printf("dt=%g\n", dt); /* 初期値 */ t = 0; v0 = 1.0; x[0] = 0.0; /* 初期位置 */ x[1] = v0; /* 初期速度 */ fprintf(output, "%f\t%f\t%f\n", t, x[0], x[1]); pi=3.1415926535897932385; tlim=20.0*pi; while(t <= tlim) { /* ルンゲ・クッタ法ルーチンを呼び出す */ rungen(t, x, dt); t += dt; fprintf(output, "%f\t%f\t%f\n", t, x[0], x[1]); } printf("data stored in osc.dat\n"); fclose(output); } /*-----------------------end of main program--------------------------*/ /* Runge-Kutta法 */ void rungen(double t, double x[], double dt) { double f(double t, double x[], int i); double h=dt/2.0, t1[N], t2[N], t3[N], /* Runge-Kutta法のための */ k1[N], k2[N], k3[N],k4[N]; /* 一時変数 */ int i; for (i=0; i