運動量保存則は、エネルギー保存則と並ぶ力学の基本原理です。特に衝突問題においてその威力を発揮し、物体間の複雑な相互作用を、衝突前後の運動量の関係だけで記述できます。
運動量保存則は、ニュートンの第3法則から直接導かれます。本記事では、導出から弾性衝突・非弾性衝突の解法、反発係数の概念まで解説し、Pythonで衝突シミュレーションを行います。
本記事の内容
- 力積と運動量の関係
- 運動量保存則の導出
- 弾性衝突と非弾性衝突の解法
- 反発係数の定義と物理的意味
- Pythonによる衝突シミュレーション
前提知識
この記事を読む前に、以下の記事を読んでおくと理解が深まります。
力積と運動量
運動量の定義
物体の運動量 $\bm{p}$ は、質量 $m$ と速度 $\bm{v}$ の積で定義されます。
$$ \bm{p} = m\bm{v} $$
力積
ニュートンの第2法則 $\bm{F} = d\bm{p}/dt$ を時間積分すると、
$$ \int_{t_1}^{t_2} \bm{F}\, dt = \bm{p}_2 – \bm{p}_1 = \Delta\bm{p} $$
左辺を 力積 $\bm{J}$ と呼びます。
$$ \bm{J} = \int_{t_1}^{t_2} \bm{F}\, dt = \Delta\bm{p} $$
力積は運動量の変化量に等しいという関係です。
運動量保存則の導出
2つの物体A, Bからなる系を考えます。AがBに及ぼす力を $\bm{F}_{AB}$、BがAに及ぼす力を $\bm{F}_{BA}$ とします。
それぞれの運動方程式は、
$$ \begin{align} \frac{d\bm{p}_A}{dt} &= \bm{F}_{BA} + \bm{F}_A^{\text{ext}} \\ \frac{d\bm{p}_B}{dt} &= \bm{F}_{AB} + \bm{F}_B^{\text{ext}} \end{align} $$
ここで $\bm{F}^{\text{ext}}$ は外力です。両式を足すと、
$$ \frac{d}{dt}(\bm{p}_A + \bm{p}_B) = (\bm{F}_{BA} + \bm{F}_{AB}) + (\bm{F}_A^{\text{ext}} + \bm{F}_B^{\text{ext}}) $$
ニュートンの第3法則より $\bm{F}_{AB} = -\bm{F}_{BA}$ なので内力は打ち消し合い、外力がゼロならば、
$$ \boxed{\frac{d}{dt}(\bm{p}_A + \bm{p}_B) = \bm{0} \quad \Rightarrow \quad \bm{p}_A + \bm{p}_B = \text{const.}} $$
これが 運動量保存則 です。外力が作用しない系では、全運動量は時間によらず一定です。
1次元衝突問題
問題設定
質量 $m_1$, $m_2$ の2物体が速度 $v_1$, $v_2$ で1次元上で衝突するとします。衝突後の速度を $v_1’$, $v_2’$ とします。
運動量保存則より、
$$ m_1 v_1 + m_2 v_2 = m_1 v_1′ + m_2 v_2′ $$
未知数が2つ($v_1’$, $v_2’$)に対して方程式が1つなので、もう1つの条件が必要です。
反発係数
反発係数(はねかえり係数)$e$ を次のように定義します。
$$ e = -\frac{v_1′ – v_2′}{v_1 – v_2} = \frac{\text{衝突後の相対速度}}{\text{衝突前の相対速度}} $$
$e$ の値に応じて衝突の種類が分類されます。
| $e$ の値 | 衝突の種類 | 特徴 |
|---|---|---|
| $e = 1$ | 完全弾性衝突 | 運動エネルギーが保存 |
| $0 < e < 1$ | 非弾性衝突 | 運動エネルギーの一部が失われる |
| $e = 0$ | 完全非弾性衝突 | 衝突後に一体となって運動 |
完全弾性衝突 ($e = 1$)
運動量保存 + $e = 1$ の条件から、
$$ \begin{cases} m_1 v_1 + m_2 v_2 = m_1 v_1′ + m_2 v_2′ \\ v_1 – v_2 = -(v_1′ – v_2′) \end{cases} $$
これを $v_1’$, $v_2’$ について解くと、
$$ \begin{align} v_1′ &= \frac{(m_1 – m_2)v_1 + 2m_2 v_2}{m_1 + m_2} \\ v_2′ &= \frac{(m_2 – m_1)v_2 + 2m_1 v_1}{m_1 + m_2} \end{align} $$
完全非弾性衝突 ($e = 0$)
$v_1′ = v_2′ = v’$ となるので、
$$ v’ = \frac{m_1 v_1 + m_2 v_2}{m_1 + m_2} $$
この場合、失われる運動エネルギーは、
$$ \Delta K = \frac{1}{2}\frac{m_1 m_2}{m_1 + m_2}(v_1 – v_2)^2 $$
Pythonでの実装
反発係数を変化させた衝突シミュレーションを実装し、衝突前後の速度とエネルギーの変化を可視化します。
import numpy as np
import matplotlib.pyplot as plt
def collision_1d(m1, m2, v1, v2, e):
"""1次元衝突の衝突後速度を計算"""
v1_after = ((m1 - e * m2) * v1 + (1 + e) * m2 * v2) / (m1 + m2)
v2_after = ((m2 - e * m1) * v2 + (1 + e) * m1 * v1) / (m1 + m2)
return v1_after, v2_after
# パラメータ
m1, m2 = 2.0, 1.0 # 質量 [kg]
v1, v2 = 3.0, -1.0 # 初速 [m/s]
# 反発係数を変化させる
e_values = np.linspace(0, 1, 100)
v1_after_list = []
v2_after_list = []
ke_ratio_list = []
KE_before = 0.5 * m1 * v1**2 + 0.5 * m2 * v2**2
for e in e_values:
v1a, v2a = collision_1d(m1, m2, v1, v2, e)
v1_after_list.append(v1a)
v2_after_list.append(v2a)
KE_after = 0.5 * m1 * v1a**2 + 0.5 * m2 * v2a**2
ke_ratio_list.append(KE_after / KE_before)
# 可視化
fig, axes = plt.subplots(1, 2, figsize=(14, 5))
# 衝突後の速度
axes[0].plot(e_values, v1_after_list, 'b-', linewidth=2, label=f'$v_1\'$ ($m_1$={m1} kg)')
axes[0].plot(e_values, v2_after_list, 'r-', linewidth=2, label=f'$v_2\'$ ($m_2$={m2} kg)')
axes[0].axhline(y=0, color='gray', linestyle='--', alpha=0.5)
axes[0].set_xlabel('Coefficient of Restitution $e$')
axes[0].set_ylabel('Velocity after collision [m/s]')
axes[0].set_title('Post-Collision Velocities vs. $e$')
axes[0].legend()
axes[0].grid(True)
# 運動エネルギーの比
axes[1].plot(e_values, ke_ratio_list, 'g-', linewidth=2)
axes[1].set_xlabel('Coefficient of Restitution $e$')
axes[1].set_ylabel('$K_{after} / K_{before}$')
axes[1].set_title('Kinetic Energy Ratio vs. $e$')
axes[1].grid(True)
plt.tight_layout()
plt.show()
左図では反発係数 $e$ の増加に伴い衝突後速度がどう変化するかがわかります。右図では $e = 1$ のときのみ運動エネルギーが完全に保存され、$e < 1$ ではエネルギーが失われることが確認できます。
まとめ
本記事では、運動量保存則と衝突問題について解説しました。
- 力積は運動量の変化量に等しい: $\bm{J} = \Delta\bm{p}$
- 外力がなければ系の全運動量は保存される
- 反発係数 $e$ により衝突が分類され、$e = 1$ が完全弾性衝突、$e = 0$ が完全非弾性衝突
- 完全弾性衝突では運動エネルギーも保存されるが、非弾性衝突ではエネルギーの一部が失われる
次のステップとして、以下の記事も参考にしてください。