モデリングと数値計算(主に化学工学向け)

化学反応、移動現象のモデリングと数値計算の話

鉛直投げ上げの数値解法

はじめに

高校物理で最初の方に習う物体の鉛直投げ上げをオイラー法で解く方法について記す。数値計算を使わなくても簡単に解ける問題であるが、数値計算の超基本的な考え方を確認するにはよいと思われる。解析解と数値解法を示し、解析解と数値解を比較してみる。

鉛直投げ上げの解析解

位置をz [m]、時刻をt[秒]とし、物体を鉛直(真上)に初速度v_0 [m/s]で投げ上げたときの時刻tにおける物体の位置zを知りたいとする。重力による物体にかかる加速度は-g [m/s^2]とする(真上方向を正として)。物体へかかる空気抵抗は無視するとして、物体の位置の時刻の関係は次の微分方程式で表される。

f:id:schemer1341:20200705214627p:plain:h50

これは変数分離形の微分方程式であり、初期条件を下記として、

f:id:schemer1341:20200705214928p:plain:h24
次のように解ける。
f:id:schemer1341:20200705222113p:plain:h55
f:id:schemer1341:20200705222137p:plain:h55
f:id:schemer1341:20200705222159p:plain:h55
これが時刻tにおける物体の位置zを表す解析解である。高校物理ではこの式が脈絡なく出てくるため、高校生の時はかなり混乱したものです。

数値解

オイラー

雑に説明すれば、時刻tから僅かな時間が経過した時刻t+\Delta tの位置zを予想するのに、本来dz/dtの値は時刻tに従い連続的に変化するが微小時間\Delta tの間だけは一定値とみなして位置zの近似解を得る方法である。具体的には以下の通りにして時刻t+\Delta tと時刻tの位置zを関係付ける。

f:id:schemer1341:20200705231357p:plain:h55

なお、これは式変形すれば下記の形となり、\Delta t\rightarrow 0の極限を取れば微分の定義そのものである。

f:id:schemer1341:20200705232003p:plain:h55

初期(時刻t=0)の位置z(0)がわかっていれば、それを用いて\Delta t経過後の位置z(0+\Delta t)を算出し、さらにそれから\Delta t経過後の位置z(0+2\Delta t)を算出する、という形で順に位置zの近似値を計算していくことができる。

解析解と数値解の比較

Pythonを用いて計算した。ソースコードは下記リンク先にある。

cemodeling/vertical_throw.ipynb at master · nakamura-13/cemodeling · GitHub

初期速度v_0=20[m/s]、重力加速度g=9.8[m/s2]、微小時間を0.1秒として計算した結果を下グラフに示す。横軸は時刻、縦軸は位置である。約4秒後に位置z=0に戻ってくる計算結果となる。青い線が数値解であるが、あくまで近似であるため微妙にずれが生じている。

f:id:schemer1341:20200705235541p:plain

微小時間を短くすれば解析解に近づく。下図は微小時間を0.01秒にした結果だが、数値解はほぼ解析解に一致している。微小時間を小さくしているため精度が改善する一方で、計算量は増加する。

f:id:schemer1341:20200706000654p:plain

終わりに

非常に簡単な問題について数値解法を適用したが、より現実的で複雑な問題(大体は連立偏微分方程式)においても基本は同じなので、超基本的な考え方を知る上では役に立つと思う。