『Python数値計算ノート』ではアフィリエイトプログラムを利用して商品を紹介しています。

【力学】自由落下運動のシミュレーション

自由落下運動

物体に重力のみが作用して生じる運動を 自由落下運動 (free fall) とよびます。地球上での落下運動も自由落下とよぶことがありますが、空気抵抗を受けるので、厳密には自由落下ではありません。
 
自由落下は力学で最も初歩的な問題なので、高校の物理学の教科書でも取り上げられますが、特殊な環境 (真空) で観測される現象であることに注意してください。自由落下の方程式を解いて得られる速度やエネルギーの値は、日常で観察する落下運動とは大きく異なります。

自由落下の運動方程式

次のような状況を想像してみましょう。
近未来の課外授業で宇宙船に乗って月を訪れました。
下図にあるように、月の上空からボールを落として運動を観察します。
自由落下運動の座標設定
ボールを落とした高度を基点として、鉛直下向きに $y$ 軸をとっています。
月の重力加速度を $g$ で表すとき、ボールには $y$ 軸の正方向に $mg$ の力が働きます。
月には大気がないので空気抵抗はなく、運動方程式は
 \[m\frac{d^2 y}{dt^2}=mg\tag{1}\]
という単純な形で表せます。方程式 (1) の両辺から $m$ を落とすと、速度の時間変化 (加速度) を表す式を得ます:
 \[\frac{d^2 y}{dt^2}=g\tag{2}\]
この式を見ただけでも、地球上の落下運動とは様子が全く異なることが予測できます。
右辺にブレーキを表す項はないので、毎秒 $g$ [m/s] だけ速度が単調増加し続けます。ある程度の高さがあれば、ボールが月面に激突する衝撃でクレーターをつくることもできるでしょう。
 
ボールの速度と位置の時間変化を表す具体的な式を求めてみましょう。方程式 (2) の両辺を積分すると速度を得ます。
 \[\frac{dy}{dt}=gt+C\tag{3}\]
$C$ は積分定数です。ボールの初速度が $0$ であるという条件
 \[v(0)=y'(0)=0\tag{4}\]
を使って $C$ を求めることができます。すなわち、
 \[0+C=0\tag{5}\]
より $C=0$ です。したがって、式 (3) は
 \[\frac{dy}{dt}=gt\tag{6}\]
となります。さらに (6) を積分することによって、高度を表す式を得られます。
 \[y=\frac{1}{2}gt^2+D\tag{7}\]
最初にボールを置いた高さが基準点 $y=0$ であるという条件を使って積分定数 $D$ を求められます。すなわち、
 \[0+D=0\tag{8}\]
より $D=0$ です。したがって、式 (7) は
 \[y=\frac{1}{2}gt^2\tag{9}\]
となります。横軸に経過時間 $t$ [s] をとって、速度 $v$ [m/s] と落下距離 $y$ [m] の時間変化をプロットしてみます。月面付近の重力加速度は $g=1.62$ [m/s2]です。

# File_Mechanics_01

# In[1]

import numpy as np
import matplotlib.pyplot as plt

# 月面付近の重力加速度
g = 1.62

# 落下時間
t = np.linspace(0, 30, 65)

# 落下速度
v = g * t

# 落下距離
y = g * t**2 / 2

# 描画領域の作成
# Figureに2×1個のサブプロットを格納
# Figureのサイズは4×6
# x軸を共有する
# サブプロットの上下間隔は0.25
fig, ax = plt.subplots(2, 1, figsize=(4, 6), sharex="col",
                       gridspec_kw=dict(hspace=0.25))

# 速度の時間変化をプロット
ax[0].set_title("Velocity vs time", fontsize=14)
ax[0].grid()
ax[0].set_xlim(0, max(t))
ax[0].set_ylim(0, max(v))
ax[0].set_ylabel("v [m/s]", fontsize=14, labelpad=8)
ax[0].plot(t, v, color="blue")

# 高度の時間変化をプロット
ax[1].set_title("Position vs time", fontsize=14)
ax[1].grid()
ax[1].set_ylim(0, max(y))
ax[1].set_xlabel("t [s]", fontsize=14, labelpad=8)
ax[1].set_ylabel("y [m]", fontsize=14, labelpad=8)
ax[1].plot(t, y, color="darkgreen")

plt.show()

Python自由落下運動のグラフ (時間と速度、時間と落下距離)
グラフを見ると、落下開始から $30$ 秒を経過すると速度は約 $50$ m/s に達します。正確に計算すると $48.6$ m/s です:

# In[2]

# 落下開始から30秒経過後の速度
print("30秒経過後の速度: {0:.2f}[m/s]".format(max(v)))

# 30秒経過後の速度: 48.60[m/s]

# 時速に換算すると $174.96$ [km/h] です:

# In[3]

# 落下開始から30秒経過後の速度[km/h]
print("30秒経過後の速度: {:.2f}[km/h]".format(max(v)*3.6))

# 30秒経過後の速度: 174.96[km/h]

地球における直径 $5$ cm の雹 (ひょう) の落下速度が時速 $115$ km/h であることを知るならば、速度の大きさを実感できるでしょう (少し先の記事で学びますが、空気抵抗を受けながら落下する物体は、ある一定速度に達すると、それ以上速度を増加させません)。しかも、雹が $10$ km 前後の高度から落下してくるのに対して、このボールは距離換算で約 $730$ m を降下したに過ぎません。
 
月面上の重力加速度が地球上の値よりもずっと小さいことを思い出してください。それでも僅か数十秒で地球上における落下速度を上回ります。

落下距離と速度

今度は月面上で物体が $y$ [m] 落下したときに物体が得ている速度を計算してみましょう。速度は加速度 $g$ に落下時間 $t$ を掛けて計算できます ($v=gt$)。上で求めた時間と落下距離との関係式
 \[y=\frac{1}{2}gt^2\tag{9}\]
を使うと、$y$ と $g$ で表された落下時間 $t$ の式
 \[t=\sqrt{\frac{2y}{g}}\tag{10}\]
を得ます。したがって、落下速度 $v$ を $y$ と $g$ で表すと
 \[v=gt=\sqrt{2gy}\tag{11}\]
となります。横軸に $y$, 縦軸に $v$ をプロットしてみます。

# In[4]

# 落下距離と速度
y = np.linspace(0, 1e4, 65)
v = np.sqrt(2 * g * y)

# 描画領域を作成
fig, ax = plt.subplots(figsize=(8, 4))

# 高度の時間変化をプロット
ax.set_title("Velocity vs position", fontsize=14)
ax.grid()
ax.set_xlim(0, max(y))
ax.set_ylim(0, max(v))
ax.set_xlabel("y [m]", fontsize=14, labelpad=8)
ax.set_ylabel("v [m/s]", fontsize=14, labelpad=8)
ax.plot(y, v, color="blue")

plt.show()

Matplotlib 速度 vs 落下距離のグラフ
$5$ km の落下で約 $127$ m/s、$10$ km の落下で $180$ m/s の速度に達します。

# In[5]

# 5km落下したときの速度[m/s]
v_5 = np.sqrt(2 * g * 5000)
print(" 5km落下したときの速度: {:.2f}[m/s]".format(v_5))

# 10km落下したときの速度[m/s]
print("10km落下したときの速度: {:.2f}[m/s]".format(max(v)))

# 5km落下したときの速度: 127.28[m/s]
# 10km落下したときの速度: 180.00[m/s]

 時速換算すると、それぞれ $458$ [km/h], $648$ [km/h] です:

# In[6]

# 10km落下したときの速度[km/h]
print(" 5km落下したときの速度: {:.2f}[km/h]".format(3.6*v_5))

# 10km落下したときの速度[km/h]
print("10km落下したときの速度: {:.2f}[km/h]".format(3.6*max(v)))

# 5km落下したときの速度: 458.21[km/h]
# 10km落下したときの速度: 648.00[km/h]

時速 $650$ km で落下してくるボールが地面に衝突する威力は大変なものだろうと想像はできますが、速度だけでは他の現象と比較して具体的にどれほどの威力があるかを定量的に知ることはできません。そこで、エネルギーとよばれる保存量を導入すると、たとえば野球選手が投げるボールと比較できるようになります。次回記事ではエネルギーの観点で自由落下現象を分析してみます。

コメント

  1. HNaito より:

    下記は誤植と思われますので、ご確認ください。
    In[1] プログラムで、y = (g * t)**2 / 2 → y = g * t**2 / 2
    Position vs time のグラフも変わります。
    In[3] プログラムの下の文で、約 1.2 km → 約 730 m

    • あとりえこばと より:

      申し訳ないです。大きなミスでした。
      In[1] のコードと Position vs time のグラフを直しておきました。
      本当にありがとうございます。m(_ _)m

  2. あとりえこばと より:

    【AI連載小説】科学とコードの交差点(56)
    「自由落下運動をPythonでシミュレーションしてみよう」
     
    Pythonサークルのメンバーである開誠、明信、馬締美純は、自由落下の物理学的なシミュレーションについて議論していました。コンピュータ画面を囲み、ノートパソコンを操作しながらアイディアを出し合っています。

    開誠:「自由落下のシミュレーション、どうすればいいか考えてみよう。」
    美純(手帳を広げながら):「まず、自由落下の基本的な方程式を考える必要があるわね。」
    明信(キーボードを叩きながら):「そうだ。自由落下では、物体の垂直方向の運動方程式は y=gt^2/2 だな」

    import matplotlib.pyplot as plt
    import numpy as np
    
    def free_fall_simulation(time):
        g = 9.8  # 重力加速度 (m/s^2)
        y = 0.5 * g * time**2
        return y
    
    # 時間の範囲を設定
    time_range = np.linspace(0, 5, 100)
    
    # シミュレーションの結果を取得
    vertical_positions = [free_fall_simulation(t) for t in time_range]
    
    # グラフの描画
    plt.plot(time_range, vertical_positions)
    plt.title("Free Fall Simulation")
    plt.xlabel("Time (s)")
    plt.ylabel("Vertical Position (m)")
    plt.grid(True)
    plt.show()

    美純(グラフを見ながら):「これで自由落下のシミュレーションができるわね」
    明信:「時間に対する垂直位置の変化がわかるね。これで初速度や空気抵抗の影響も考えられる」
    開誠:「そうだな。また、他の物体や条件を加えてさらに複雑なシミュレーションも考えられるよ」