振り子の運動を用いた常微分方程式解法のベンチマーク#

振り子の角度 \(\theta\) に関する運動方程式

\[ \ddot{\theta} = -\sin{\theta} \]

に対して常微分方程式のソルバーを適用し,計算時間と誤差を測定した.

ステップ幅の自動調整付きのソルバーに対するベンチマーク結果#

以下の公式を用い,ステップ幅の自動調整機能 [11] 付きで実装したソルバーについてベンチマークを行った.

  • Runge-Kutta 法

    • 陽的公式

      • RKF45:RKF (Runge-Kutta-Fehlberg) 45 公式 [12]

      • DOPRI5:DOPRI5 公式 [13]

      • ARK4(3)-ERK:ARK4(3)6L[2]SA-ERK 公式 [14]

    • 半陰的公式

      • Tanaka1:田中 Formula1 公式 [15]

      • Tanaka2:田中 Formula2 公式 [15]

      • SDIRK4:4 次の SDIRK (Singly Diagonally Implicit Runge-Kutta) 法 [13]

      • ARK4(3)-ESDIRK:ARK4(3)6L[2]SA-ESDIRK 公式 [14]

      • ARK5(4)-ESDIRK:ARK5(4)6L[2]SA-ESDIRK 公式 [14]

      • ESDIRK45c:ESDIRK45c 公式 [16]

    • 陰的公式

      • LobattoIIIC4:Lobatto IIIC 4 次の公式 [13]

      • LobattoIIIC6:Lobatto IIIC 6 次の公式 [13]

      • RadauIIA3:Radau IIA 3 次の公式 [13]

      • RadauIIA5:Radau IIA 5 次の公式 [13]

  • Rosenbrock 法

    • ROS3w 公式:ROS3w 公式 [17]

    • ROS34PRw 公式:ROS34PRw 公式 [18]

    • ROS34PW3 公式:ROS34PW3 公式 [17]

    • RODASP 公式:RODASP 公式 [19]

    • RODASPR 公式:RODASPR 公式 [18]

  • 平均ベクトル場法 [20]

    • AVF2:2 次の解法

    • AVF3:3 次の解法

    • AVF4:4 次の解法

時刻 \(t=0\) における初期値をもとに時刻 \(t=10\) における解を求める時間と精度を測定した.

Hide code cell source

from num_anal_plots.show_plot_in_jupyter import show_plot_in_jupyter

show_plot_in_jupyter("ode-pendulum-movement-auto-step-all-work-error", version=2)

ステップ幅固定のソルバーに対するベンチマーク結果#

以下の公式を用い,固定のステップ幅による数値解法を実装したソルバーについてベンチマークを行った.

  • Runge-Kutta 法

    • 陽的公式

      • RK4:古典的な 4 次の Runge-Kutta 法 [12]

    • 陰的公式

      • LobattoIIIC4:Lobatto IIIC 4 次の公式 [13]

      • LobattoIIIC6:Lobatto IIIC 6 次の公式 [13]

      • RadauIIA3:Radau IIA 3 次の公式 [13]

      • RadauIIA5:Radau IIA 5 次の公式 [13]

  • シンプレクティック積分法

    • 陽的公式

      • LeapFrog:Leap-frog 法 [21]

      • Forest4[21] における 4 次の公式

  • AVF (Average Vector Field) 法 [20]

    • AVF2:2 次の解法

    • AVF3:3 次の解法

    • AVF4:4 次の解法

時刻 \(t=0\) における初期値をもとに時刻 \(t=100\) における解を求める時間と精度を測定した.

Hide code cell source

from num_anal_plots.show_plot_in_jupyter import show_plot_in_jupyter

show_plot_in_jupyter("ode-pendulum-movement-fixed-step-work-error", version=1)

環境#

  • CPU: Intel(R) Core(TM) i7-9750H CPU @ 2.60GHz

  • コンパイラ:Clang 21.1.8

ソースコード#

numerical-collection-cpp リポジトリ [1] のコミット aada5a2ffd442f3ce90121ac78fac102a17b602d 時点のものを使用した.