振幅
を指定して、単振り子の運動
と、
同じ初期条件を課した単振動の運動
を計算する。
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 では、
桂田 祐史