鉛直投げ上げの数値解法
はじめに
高校物理で最初の方に習う物体の鉛直投げ上げをオイラー法で解く方法について記す。数値計算を使わなくても簡単に解ける問題であるが、数値計算の超基本的な考え方を確認するにはよいと思われる。解析解と数値解法を示し、解析解と数値解を比較してみる。
鉛直投げ上げの解析解
位置をz [m]、時刻をt[秒]とし、物体を鉛直(真上)に初速度 [m/s]で投げ上げたときの時刻tにおける物体の位置zを知りたいとする。重力による物体にかかる加速度は [m/s]とする(真上方向を正として)。物体へかかる空気抵抗は無視するとして、物体の位置の時刻の関係は次の微分方程式で表される。
これは変数分離形の微分方程式であり、初期条件を下記として、
数値解
オイラー法
雑に説明すれば、時刻tから僅かな時間が経過した時刻の位置zを予想するのに、本来の値は時刻tに従い連続的に変化するが微小時間の間だけは一定値とみなして位置zの近似解を得る方法である。具体的には以下の通りにして時刻と時刻の位置zを関係付ける。
なお、これは式変形すれば下記の形となり、の極限を取れば微分の定義そのものである。
初期(時刻)の位置z(0)がわかっていれば、それを用いて経過後の位置z(0+)を算出し、さらにそれから経過後の位置z(0+)を算出する、という形で順に位置zの近似値を計算していくことができる。
解析解と数値解の比較
Pythonを用いて計算した。ソースコードは下記リンク先にある。
cemodeling/vertical_throw.ipynb at master · nakamura-13/cemodeling · GitHub
初期速度[m/s]、重力加速度[m/s2]、微小時間を0.1秒として計算した結果を下グラフに示す。横軸は時刻、縦軸は位置である。約4秒後に位置z=0に戻ってくる計算結果となる。青い線が数値解であるが、あくまで近似であるため微妙にずれが生じている。
微小時間を短くすれば解析解に近づく。下図は微小時間を0.01秒にした結果だが、数値解はほぼ解析解に一致している。微小時間を小さくしているため精度が改善する一方で、計算量は増加する。
終わりに
非常に簡単な問題について数値解法を適用したが、より現実的で複雑な問題(大体は連立偏微分方程式)においても基本は同じなので、超基本的な考え方を知る上では役に立つと思う。