[SciPy] 14. solve_ivpを使った空気抵抗とマグヌス効果を考慮した斜方投射の常微分方程式解法

matplotlib

はじめに

この記事では、空気抵抗とマグヌス効果を考慮した斜方投射問題を解くために、SciPyのsolve_ivp関数を使用する方法を解説します。以下の内容を取り上げます:

  • 空気抵抗とマグヌス効果を含む物理モデルの数学的定式化
  • 常微分方程式を解くためのsolve_ivp関数の使い方
  • 複雑な物理系のPythonによる実装方法
  • 結果の可視化と物理的解釈

物理学の知識とPythonプログラミングを組み合わせた実践的な例を通して、数値計算の基本を学びましょう。

マグヌス効果とは

マグヌス効果(Magnus effect)とは、回転している物体が流体中を移動する際に、回転方向と相対的な流れの方向によって物体に働く力のことです。物理学者ハインリヒ・マグヌスにちなんで名付けられました。

簡単に言えば、回転するボールが飛行中に「曲がる」現象の物理的な説明です。この効果は以下のように説明されます:

  • 回転するボールの周りの空気の流れが、回転方向によって非対称になる
  • 回転方向と同じ向きの側では空気の流れが速くなり、反対側では遅くなる
  • ベルヌーイの原理により、流れが速い側は圧力が低く、遅い側は圧力が高くなる
  • この圧力差により、ボールには回転軸に垂直な方向に力(マグヌス力)が働く

スポーツでは以下のような現象として観察されます:

  • 野球のカーブボール:投手が与える回転によって軌道が曲がる
  • サッカーのカーブシュート:キッカーが与える回転によってボールが曲がる
  • ゴルフのスライスやフック:クラブがボールに与える回転により飛球が曲がる
  • 卓球のスピン:ラケットの角度と動きによってボールに様々な回転が与えられる

コード

解説

モジュールのインポート

バージョン

初期値の設定

初期値v0を設定します。位置(x,y)=(0,10)から速度(vx,vy)=(10,10)で物体を打ち上げる条件としました。

定数を定義

ここで、mは質量、kは抗力係数、gは重力加速度です。sはマグヌス効果の係数であり、wは回転ベクトルで(0,0,1)と設定しました。

関数の定義

微分方程式を定義します。運動の第2法則から以下の式が導かれます。

\[m \cdot u” = F + mg\]

空気抵抗による力は F = -ku’ で表されます。また、マグヌス効果による力は、角速度ベクトル ω=(0,0,1) とすると、s(−ωvy, ωvx, 0) となります。これらを運動方程式に変換すると、以下のようになります。

\[u_x” = -\frac{k}{m} u_x’ -\frac{s}{m} u_y’ \]

\[u_y” = -\frac{k}{m} u_y’ +\frac{s}{m} u_x’+ g\]

solve_ivpで解く

t_spanは時間の(開始、終了)を表し、tは実際の計算に使用する時間配列です。t_evalにtを指定しますが、省略した場合はsolve_ivpが自動的に適切な時間間隔で計算を行います。その他のパラメータはargs=(k,s,w)のように引数として渡します。v0は初期条件を表します。

solve_ivp(f, t_span, v0, t_eval=t, args=(k,s,w))を呼び出して微分方程式を解きます。

計算が正常に完了したかどうかは、返り値のmessage属性で確認できます。

結果の表示

ここでは「ind = solved_data.y[1]>=0」という条件でyが正の値のみを抽出して表示しています。解析結果のデータは「solved_data.y[0][ind]」のような形式で取得できます。

マグヌス係数s=1の場合のxとyの関係は以下のようになります。

sを変えた時の変化

マグヌス係数sの値を[0, 0.5, 1, 1.5]と変化させて計算した結果は以下のようになります。

コードをダウンロード(.pyファイル)

コードをダウンロード(.ipynbファイル)

アニメーションによる結果の可視化

matplotlibのFuncAnimationを使用して、結果をアニメーションで可視化した例については、下記記事で詳しく解説しています。

[matplotlib animation] 99. マグヌス効果を考慮した斜方投射のシミュレーション - FuncAnimationによる可視化
空気抵抗とマグヌス効果を考慮した斜方投射シミュレーションを、matplotlibのFuncAnimationで視覚化する方法を紹介します。回転するボールの軌道変化をアニメーションで表現し、物理法則に基づいた動きを観察できるコンテンツです。

参考

solve_ivp — SciPy v1.16.1 Manual
IPython Cookbook - 12.3. Simulating an ordinary differential equation with SciPy
IPython Cookbook,
http://ayapin-film.sakura.ne.jp/Gnuplot/Docs/samples
マグヌス効果 - Wikipedia

コメント