振幅 を指定して、単振り子の運動 と、 同じ初期条件を課した単振動の運動 を計算する。 Runge-Kutta 法のようなアルゴリズムを用いても良いが、 ここは GSL (GNU Scientific Library) のテストをかねて、 Jacobi の楕円関数を使って計算した。
/* * furiko.c --- 単振り子の運動 * θ=2 arcsin (k sn(√g/l t,k)) */ #include <stdio.h> #include <math.h> #include <gsl/gsl_specfunc.h> int main() { double g,l,omega,theta0,k; int i,n; double t,dt,sn,cn,dn; g = 9.8; l = 1.0; omega = sqrt(g / l); scanf("%lf", &theta0); k = sin(theta0 / 2); dt = 0.01; for (i = 0; i <= 1000; i++) { t = i * dt; gsl_sf_elljac_e(omega * t, k*k, &sn, &cn, &dn); printf("%f %f %f\n", t, 2 * asin(k * sn), 2 * k * sin(omega * t)); } return 0; }
MacPorts で GSL をインストールした場合のコンパイル |
gcc -I/opt/local/include furiko.c -L/opt/local/lib -lgsl |
Mathematica ではこんな感じ |
g=9.8; l=1; omega=Sqrt[g/l]; theta=1; k=Sin[theta/2]; Plot[{2k Sin[omega t], 2ArcSin[k JacobiSN[omega t,k^2]]}, {t,0,10}] |
注意: これまで GSL では、
桂田 祐史