D:/git/sphinx/tkProg/source/tiny_simulations/double_pendulum.py

プログラムの動作

このプログラムは、カオス的な挙動を示すことで知られる「二重振り子(Double Pendulum)」の物理シミュレーションを行い、その運動をリアルタイムのアニメーションとして可視化することを目的としています。 初期条件として設定された角度や角速度に基づき、非線形な連立微分方程式を数値計算によって解くことで、複雑で直感的には予測困難な振り子の動きを画面上でシミュレートします。

原理

二重振り子の運動はラグランジュ力学を用いて定式化されます。上部の振り子の角度を \(\theta_1\)、下部の振り子の角度を \(\theta_2\)、それぞれの角速度を \(\dot{\theta}_1, \dot{\theta}_2\) とします。

プログラム内では状態ベクトルを \(state = [\theta_1, \theta_2, \dot{\theta}_1, \dot{\theta}_2]\) と定義し、微小時間における変化を計算します。 角度の差を \(\delta = \theta_2 - \theta_1\) と置いたとき、上部および下部の振り子の角加速度(\(\ddot{\theta}_1, \ddot{\theta}_2\))は以下の連立方程式から求められます。

\[ \ddot{\theta}_1 = \frac{m_2 L_1 \dot{\theta}_1^2 \sin\delta \cos\delta + m_2 g \sin\theta_2 \cos\delta + m_2 L_2 \dot{\theta}_2^2 \sin\delta - (m_1 + m_2) g \sin\theta_1}{(m_1 + m_2) L_1 - m_2 L_1 \cos^2\delta} \]
\[ \ddot{\theta}_2 = \frac{-m_2 L_2 \dot{\theta}_2^2 \sin\delta \cos\delta + (m_1 + m_2) g \sin\theta_1 \cos\delta - (m_1 + m_2) L_1 \dot{\theta}_1^2 \sin\delta - (m_1 + m_2) g \sin\theta_2}{\frac{L_2}{L_1} \left( (m_1 + m_2) L_1 - m_2 L_1 \cos^2\delta \right)} \]

ここで、\(g\) は重力加速度、\(m_1, m_2\) は各振り子の質量、\(L_1, L_2\) は各振り子の長さです。

これらの微分方程式は、scipy.integrate.odeint 関数を用いた数値積分によって解かれます。求まった時間ごとの角度データ \(\theta_1, \theta_2\) は、以下の式でデカルト座標(X-Y座標)に変換され、描画に使用されます。

\[ x_1 = L_1 \sin\theta_1 \]
\[ y_1 = -L_1 \cos\theta_1 \]
\[ x_2 = x_1 + L_2 \sin\theta_2 \]
\[ y_2 = y_1 - L_2 \cos\theta_2 \]

必要な非標準ライブラリとインストール方法

本プログラムを実行するためには、数値計算およびグラフ描画用の外部ライブラリが必要です。以下のコマンドを実行してインストールしてください。

pip install numpy matplotlib scipy

必要な入力ファイル

このプログラムは、コード内部で直接初期条件や物理パラメータ(質量、長さ、初期角度など)を定義しているため、外部の入力ファイルやデータセットは必要ありません。

生成される出力ファイル

本プログラムは計算結果をGUIウィンドウ上にアニメーションとして直接表示(plt.show())しますが、外部へのファイル出力(GIF画像や動画ファイルの保存、ログファイルの書き出しなど)は行いません。そのため、生成される出力ファイルはありません。

コマンドラインでの使用例 (Usage)

特別なコマンドライン引数は必要ありません。ターミナルまたはコマンドプロンプトから以下のコマンドを実行することで、スクリプトを起動できます。

python double_pendulum.py

コマンドラインでの具体的な使用例

実際にコマンドラインから実行する際の手順と結果は以下の通りです。

python double_pendulum.py

上記コマンドを実行すると、即座に数値積分が開始され、計算が完了すると matplotlib の描画ウィンドウが立ち上がります。ウィンドウ内では、二重振り子が物理法則に従って動くアニメーションが再生され、画面の左上にはシミュレーション経過時間(例: time = 1.5s)がリアルタイムに表示されます。ユーザーはウィンドウを閉じるまで、二重振り子特有のカオス的な運動を観察することができます。