振り子の初期角度(x)、重力加速度(g)、線の長さ(l)、および時間ステップ(h)を前提として、振り子の動きの微分方程式を解こうとしています。私はオイラー法を使用してこれを試しましたが、すべて問題ありません。しかし今、私はGSLに実装されたルンゲクッタ法を使用することになっています。gslマニュアルから学習して実装しようとしましたが、1つの問題で立ち往生しています。振り子は止まりたくありません。最初の角度を1radから始めたとしましょう。すでに何回スイングしても、常に1radでピーク傾斜があります。これが私がGSLにそれを与えるために使用する方程式と関数です:
x''(t) + g/l*sin(x(t)) = 0
それを変換する:
x''(t) = -g/l*sin(x(t))
と分解:
y(t) = x'(t)
y'(t) = -g/l*sin(x(t))
これがコードスニペットです。それでも不十分な場合は、プログラム全体を投稿できます(長すぎません)が、どこかに問題がある可能性があります。
int func (double t, const double x[], double dxdt[], void *params){
double l = *(double*) params;
double g = *(double*) (params+sizeof(double));
dxdt[0] = x[1];
dxdt[1] = -g/l*sin(x[0]);
return GSL_SUCCESS;
}
パラメータg
とl
は関数に正しく渡されます。すでに確認しました。