2

振り子の初期角度(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;
    }

パラメータglは関数に正しく渡されます。すでに確認しました。

4

1 に答える 1

6

Barton Chittendenがコメントで述べたように、振り子は摩擦がない状態で動き続けるはずです。これは予想されます。

オイラー法を使用すると速度が低下して停止する理由については、微妙で興味深い主題に触れています。(理想的な、摩擦のない)物理的な振り子には、システム内のエネルギーが節約されるという特性があります。さまざまな統合スキームにより、そのプロパティがさまざまな程度で保持されます。一部の統合スキームでは、システム内のエネルギーが増加し、振り子が徐々に高くなります。他の人と一緒に、エネルギーが失われ、振り子が停止します。これらのいずれかが発生する速度は、メソッドの順序に部分的に依存します。より正確な方法は、多くの場合、よりゆっくりとエネルギーを失います。

さまざまな積分スキームのシステムの総エネルギー(ポテンシャル+運動エネルギー)をプロットすることで、これを簡単に観察できます。

最後に、シンプレクティック法と呼ばれる、このようなシステムの特定の保存量を保存する積分法の魅力的なサブフィールドがあります。

于 2012-04-25T20:45:45.963 に答える