運動方程式 $\bm{F} = m\bm{a}$ はニュートン力学の中核ですが、この式を「知っている」だけでは物理の問題は解けません。大切なのは、具体的な状況に応じて運動方程式を立て、それを微分方程式として解くことです。
本記事では、質点の運動方程式を直交座標系と極座標系の両方で定式化し、放物運動・等速円運動・単振り子という3つの代表的な問題を通じて、方程式の立て方と解き方を丁寧に解説します。最後に Python を使った数値シミュレーションも行います。
本記事の内容
- 運動方程式を「解く」とは何か
- 直交座標系での運動方程式($x$, $y$, $z$ 成分)
- 極座標系での運動方程式($r$, $\theta$ 成分の導出)
- 具体例1: 放物運動(斜方投射の解析解)
- 具体例2: 等速円運動と向心力
- 具体例3: 単振り子の運動方程式(非線形と線形近似)
- Python による斜方投射と単振り子のシミュレーション
前提知識
この記事を読む前に、以下の記事を読んでおくと理解が深まります。
運動方程式を「解く」とは何か
ニュートンの第2法則は、質量 $m$ の質点に合力 $\bm{F}$ が作用するとき、
$$ m\frac{d^2\bm{r}}{dt^2} = \bm{F} $$
と表されます。ここで $\bm{r}(t)$ は質点の位置ベクトルです。
この式は2階常微分方程式ですから、初期位置 $\bm{r}(0) = \bm{r}_0$ と初期速度 $\dot{\bm{r}}(0) = \bm{v}_0$ の2つの初期条件を与えれば、原理的に $\bm{r}(t)$ を一意に決定できます。
つまり「運動方程式を解く」とは、力 $\bm{F}$ と初期条件から質点の位置 $\bm{r}(t)$ を時刻 $t$ の関数として求めることです。解析的に閉じた形で解ける場合もあれば、数値的に解く必要がある場合もあります。
解法の一般的な手順は次のとおりです。
- 座標系の選択: 問題の対称性に合った座標系を選ぶ
- 力の洗い出し: 質点に作用するすべての力を特定する
- 成分への分解: 運動方程式を各座標成分に分解する
- 微分方程式を解く: 解析的または数値的に解く
- 初期条件の適用: 積分定数を初期条件で決定する
座標系の選び方ひとつで、方程式が劇的に簡単になることがあります。直線運動には直交座標系、中心力の問題には極座標系が適しているのです。
直交座標系での運動方程式
定式化
3次元の直交座標系 $(x, y, z)$ では、位置ベクトルは
$$ \bm{r} = x\,\bm{e}_x + y\,\bm{e}_y + z\,\bm{e}_z $$
と表されます。ここで $\bm{e}_x$, $\bm{e}_y$, $\bm{e}_z$ は各軸方向の単位ベクトルです。直交座標系では単位ベクトルの方向が時間によらず一定なので、加速度は単純に各成分の2階時間微分で得られます。
$$ \bm{a} = \frac{d^2\bm{r}}{dt^2} = \ddot{x}\,\bm{e}_x + \ddot{y}\,\bm{e}_y + \ddot{z}\,\bm{e}_z $$
力 $\bm{F}$ も同様に成分分解すると、
$$ \bm{F} = F_x\,\bm{e}_x + F_y\,\bm{e}_y + F_z\,\bm{e}_z $$
運動方程式 $m\bm{a} = \bm{F}$ を成分ごとに書くと、
$$ m\ddot{x} = F_x $$
$$ m\ddot{y} = F_y $$
$$ m\ddot{z} = F_z $$
となります。直交座標系では、$x$, $y$, $z$ 方向の運動方程式が独立に(互いに結合せずに)得られるという利点があります。
極座標系での運動方程式
2次元極座標の定義
中心力の問題など、原点からの距離と角度で記述するのが自然な場合には、極座標 $(r, \theta)$ を使います。直交座標との関係は
$$ x = r\cos\theta, \quad y = r\sin\theta $$
です。
単位ベクトルの時間変化
極座標の肝は、単位ベクトル $\bm{e}_r$(動径方向)と $\bm{e}_\theta$(角度方向)が時間とともに回転する点です。
$$ \bm{e}_r = \cos\theta\,\bm{e}_x + \sin\theta\,\bm{e}_y $$
$$ \bm{e}_\theta = -\sin\theta\,\bm{e}_x + \cos\theta\,\bm{e}_y $$
これらを時間で微分すると、
$$ \frac{d\bm{e}_r}{dt} = (-\sin\theta\,\bm{e}_x + \cos\theta\,\bm{e}_y)\dot{\theta} = \dot{\theta}\,\bm{e}_\theta $$
$$ \frac{d\bm{e}_\theta}{dt} = (-\cos\theta\,\bm{e}_x – \sin\theta\,\bm{e}_y)\dot{\theta} = -\dot{\theta}\,\bm{e}_r $$
速度と加速度の導出
位置ベクトルは $\bm{r} = r\,\bm{e}_r$ なので、速度は積の微分法則で求められます。
$$ \begin{align} \bm{v} = \dot{\bm{r}} &= \dot{r}\,\bm{e}_r + r\,\frac{d\bm{e}_r}{dt} \\ &= \dot{r}\,\bm{e}_r + r\dot{\theta}\,\bm{e}_\theta \end{align} $$
第1項 $\dot{r}\,\bm{e}_r$ は動径方向の速度、第2項 $r\dot{\theta}\,\bm{e}_\theta$ は接線方向の速度です。
加速度はもう一度微分します。
$$ \begin{align} \bm{a} = \dot{\bm{v}} &= \frac{d}{dt}\left(\dot{r}\,\bm{e}_r + r\dot{\theta}\,\bm{e}_\theta\right) \\ &= \ddot{r}\,\bm{e}_r + \dot{r}\,\frac{d\bm{e}_r}{dt} + \dot{r}\dot{\theta}\,\bm{e}_\theta + r\ddot{\theta}\,\bm{e}_\theta + r\dot{\theta}\,\frac{d\bm{e}_\theta}{dt} \\ &= \ddot{r}\,\bm{e}_r + \dot{r}\dot{\theta}\,\bm{e}_\theta + \dot{r}\dot{\theta}\,\bm{e}_\theta + r\ddot{\theta}\,\bm{e}_\theta + r\dot{\theta}(-\dot{\theta}\,\bm{e}_r) \\ &= (\ddot{r} – r\dot{\theta}^2)\,\bm{e}_r + (r\ddot{\theta} + 2\dot{r}\dot{\theta})\,\bm{e}_\theta \end{align} $$
極座標での運動方程式
力を動径方向と角度方向に分解して $\bm{F} = F_r\,\bm{e}_r + F_\theta\,\bm{e}_\theta$ と書くと、$m\bm{a} = \bm{F}$ の各成分は
$$ m(\ddot{r} – r\dot{\theta}^2) = F_r $$
$$ m(r\ddot{\theta} + 2\dot{r}\dot{\theta}) = F_\theta $$
となります。
$r$ 方向の方程式に現れる $-mr\dot{\theta}^2$ は遠心力に対応する項です。回転する座標系から見ると、質点は原点から遠ざかろうとする力を受けているように見えます。
$\theta$ 方向の方程式に現れる $2m\dot{r}\dot{\theta}$ はコリオリの力に対応する項です。これは $r$ が変化しながら回転する質点に現れる見かけの力です。
具体例1: 放物運動(斜方投射)
問題設定
質量 $m$ の質点を、地面($y = 0$)から初速 $v_0$、仰角 $\alpha$ で投射します。空気抵抗は無視し、重力加速度 $g$ のみが鉛直下向きに作用するものとします。
運動方程式の立式
$x$ 軸を水平方向(投射方向)、$y$ 軸を鉛直上向きにとると、作用する力は重力のみなので
$$ F_x = 0, \quad F_y = -mg $$
運動方程式は各成分で
$$ m\ddot{x} = 0 $$
$$ m\ddot{y} = -mg $$
解の導出
$x$ 方向の方程式を解きます。$m$ で割って
$$ \ddot{x} = 0 $$
1回積分すると
$$ \dot{x}(t) = C_1 $$
初期条件 $\dot{x}(0) = v_0\cos\alpha$ より $C_1 = v_0\cos\alpha$ なので
$$ \dot{x}(t) = v_0\cos\alpha $$
もう1回積分して
$$ x(t) = v_0 t\cos\alpha + C_2 $$
初期条件 $x(0) = 0$ より $C_2 = 0$ なので
$$ x(t) = v_0 t\cos\alpha $$
次に $y$ 方向の方程式を解きます。
$$ \ddot{y} = -g $$
1回積分すると
$$ \dot{y}(t) = -gt + C_3 $$
初期条件 $\dot{y}(0) = v_0\sin\alpha$ より $C_3 = v_0\sin\alpha$ なので
$$ \dot{y}(t) = v_0\sin\alpha – gt $$
もう1回積分して
$$ y(t) = v_0 t\sin\alpha – \frac{1}{2}gt^2 + C_4 $$
初期条件 $y(0) = 0$ より $C_4 = 0$ なので
$$ y(t) = v_0 t\sin\alpha – \frac{1}{2}gt^2 $$
軌跡の方程式
$x(t)$ の式から $t = \frac{x}{v_0\cos\alpha}$ を $y(t)$ に代入すると、時刻を消去できます。
$$ \begin{align} y &= v_0 \cdot \frac{x}{v_0\cos\alpha} \cdot \sin\alpha – \frac{1}{2}g\left(\frac{x}{v_0\cos\alpha}\right)^2 \\ &= x\tan\alpha – \frac{g}{2v_0^2\cos^2\alpha}x^2 \end{align} $$
これは $x$ の2次関数であり、放物線を表します。放物運動という名称はここに由来します。
到達距離と最高点
着地時刻は $y(t) = 0$ かつ $t > 0$ から求まります。
$$ v_0 t\sin\alpha – \frac{1}{2}gt^2 = 0 $$
$$ t\left(v_0\sin\alpha – \frac{1}{2}gt\right) = 0 $$
$t \neq 0$ の解は
$$ t_{\text{land}} = \frac{2v_0\sin\alpha}{g} $$
このとき、水平到達距離(飛距離)は
$$ R = x(t_{\text{land}}) = v_0 \cos\alpha \cdot \frac{2v_0\sin\alpha}{g} = \frac{v_0^2 \sin 2\alpha}{g} $$
$\sin 2\alpha$ は $\alpha = 45°$ のとき最大値 1 をとるので、飛距離は $\alpha = 45°$ で最大になります。
最高点の時刻は $\dot{y}(t) = 0$ から
$$ t_{\text{top}} = \frac{v_0\sin\alpha}{g} $$
最高点の高さは
$$ H = y(t_{\text{top}}) = \frac{v_0^2\sin^2\alpha}{2g} $$
具体例2: 等速円運動と向心力
問題設定
質点が半径 $R$ の円上を一定の角速度 $\omega$ で運動しているとします。
極座標での解析
等速円運動では $r = R$(一定)かつ $\dot{\theta} = \omega$(一定)なので、
$$ \dot{r} = 0, \quad \ddot{r} = 0, \quad \ddot{\theta} = 0 $$
極座標の運動方程式に代入すると、
$$ m(0 – R\omega^2) = F_r \quad \Longrightarrow \quad F_r = -mR\omega^2 $$
$$ m(R \cdot 0 + 2 \cdot 0 \cdot \omega) = F_\theta \quad \Longrightarrow \quad F_\theta = 0 $$
$F_r < 0$ は力が原点向き(動径方向内向き)であることを意味します。これが向心力です。
$$ |\bm{F}| = mR\omega^2 = m\frac{v^2}{R} $$
ここで $v = R\omega$ を用いました。
向心力がなくなると、質点は慣性の法則により接線方向に直進します。糸の付いたボールを円運動させているとき、糸を離すとボールが直線的に飛んでいくのはこのためです。
直交座標での確認
直交座標で等速円運動を表すと、
$$ x(t) = R\cos(\omega t), \quad y(t) = R\sin(\omega t) $$
加速度を計算すると
$$ \ddot{x} = -R\omega^2\cos(\omega t), \quad \ddot{y} = -R\omega^2\sin(\omega t) $$
加速度ベクトル $\bm{a} = (\ddot{x}, \ddot{y})$ は常に原点を向いており、その大きさは
$$ |\bm{a}| = R\omega^2 $$
と一定です。極座標で得た結果と一致しています。
具体例3: 単振り子の運動方程式
問題設定
長さ $l$ の質量の無視できる糸の先に質量 $m$ のおもりを吊るし、鉛直面内で振動させます。糸がたるまないとすると、おもりは半径 $l$ の円弧上を運動します。
運動方程式の導出
鉛直下向きからの角度を $\theta$ とすると、おもりの接線方向の加速度は $l\ddot{\theta}$ です。接線方向に作用する力は重力の接線成分 $-mg\sin\theta$(復元力なので負)だけなので、
$$ ml\ddot{\theta} = -mg\sin\theta $$
整理すると
$$ \ddot{\theta} + \frac{g}{l}\sin\theta = 0 $$
これが単振り子の運動方程式です。$\sin\theta$ が含まれているため、この方程式は非線形微分方程式です。一般には初等関数では解けず、楕円積分が必要になります。
微小振動の近似(線形化)
振幅が十分に小さいとき($|\theta| \ll 1$)、テイラー展開
$$ \sin\theta = \theta – \frac{\theta^3}{6} + \cdots \approx \theta $$
を適用すると、運動方程式は
$$ \ddot{\theta} + \frac{g}{l}\theta = 0 $$
と線形化されます。$\omega_0 = \sqrt{g/l}$ と置くと
$$ \ddot{\theta} + \omega_0^2\,\theta = 0 $$
これは単振動の方程式です。一般解は
$$ \theta(t) = A\cos(\omega_0 t + \phi) $$
ここで $A$ は振幅、$\phi$ は初期位相であり、いずれも初期条件によって決まります。
周期は
$$ T = \frac{2\pi}{\omega_0} = 2\pi\sqrt{\frac{l}{g}} $$
となり、質量 $m$ に依存しないという有名な結果が得られます。振り子の等時性と呼ばれるこの性質は、ガリレオ・ガリレイが発見したとされています。
ただし、この結果は微小振動の近似のもとでのみ成り立ちます。振幅が大きくなると周期は長くなり、厳密な解は楕円積分を用いて表されます。
Python による数値シミュレーション
斜方投射の軌跡
まず、斜方投射の解析解を可視化します。複数の投射角度で軌跡を描き、$\alpha = 45°$ で飛距離が最大になることを確認しましょう。
import numpy as np
import matplotlib.pyplot as plt
# パラメータ
v0 = 20.0 # 初速 [m/s]
g = 9.8 # 重力加速度 [m/s^2]
# 複数の投射角度
angles_deg = [15, 30, 45, 60, 75]
plt.figure(figsize=(10, 6))
for alpha_deg in angles_deg:
alpha = np.radians(alpha_deg)
# 着地時刻
t_land = 2 * v0 * np.sin(alpha) / g
t = np.linspace(0, t_land, 300)
# 解析解
x = v0 * t * np.cos(alpha)
y = v0 * t * np.sin(alpha) - 0.5 * g * t**2
# 飛距離
R = v0**2 * np.sin(2 * alpha) / g
plt.plot(x, y, linewidth=2, label=f'$\\alpha = {alpha_deg}°$ (R = {R:.1f} m)')
plt.xlabel('x [m]', fontsize=12)
plt.ylabel('y [m]', fontsize=12)
plt.title('Projectile Motion for Various Launch Angles', fontsize=14)
plt.legend(fontsize=10)
plt.grid(True, alpha=0.3)
plt.xlim(0, None)
plt.ylim(0, None)
plt.gca().set_aspect('equal')
plt.tight_layout()
plt.savefig('projectile_motion.png', dpi=150, bbox_inches='tight')
plt.show()
単振り子の数値解(非線形 vs 線形近似)
次に、単振り子の運動方程式を scipy.integrate.solve_ivp で数値的に解きます。非線形の厳密な方程式と線形近似の両方を計算し、振幅が大きい場合に近似がどの程度ずれるかを観察します。
2階微分方程式を1階の連立方程式に変換します。$\omega = \dot{\theta}$ と置くと、
$$ \frac{d\theta}{dt} = \omega, \quad \frac{d\omega}{dt} = -\frac{g}{l}\sin\theta $$
線形近似の場合は $\sin\theta$ を $\theta$ に置き換えます。
import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import solve_ivp
# パラメータ
g = 9.8 # 重力加速度 [m/s^2]
l = 1.0 # 振り子の長さ [m]
omega0 = np.sqrt(g / l) # 固有角振動数
# 非線形の運動方程式(厳密)
def pendulum_nonlinear(t, state):
theta, omega = state
dtheta_dt = omega
domega_dt = -(g / l) * np.sin(theta)
return [dtheta_dt, domega_dt]
# 線形近似の運動方程式
def pendulum_linear(t, state):
theta, omega = state
dtheta_dt = omega
domega_dt = -(g / l) * theta
return [dtheta_dt, domega_dt]
# シミュレーション時間
t_span = (0, 10)
t_eval = np.linspace(0, 10, 1000)
# 2つの初期角度で比較
initial_angles_deg = [10, 60]
fig, axes = plt.subplots(1, 2, figsize=(14, 5))
for idx, theta0_deg in enumerate(initial_angles_deg):
theta0 = np.radians(theta0_deg)
y0 = [theta0, 0.0] # 初期角度 theta0, 初期角速度 0
# 非線形(厳密)
sol_nonlinear = solve_ivp(
pendulum_nonlinear, t_span, y0,
method='RK45', t_eval=t_eval, rtol=1e-10
)
# 線形近似
sol_linear = solve_ivp(
pendulum_linear, t_span, y0,
method='RK45', t_eval=t_eval, rtol=1e-10
)
# 解析解(線形近似)
theta_analytical = theta0 * np.cos(omega0 * t_eval)
ax = axes[idx]
ax.plot(sol_nonlinear.t, np.degrees(sol_nonlinear.y[0]),
'b-', linewidth=2, label='Nonlinear (exact)')
ax.plot(sol_linear.t, np.degrees(sol_linear.y[0]),
'r--', linewidth=1.5, label='Linear approx.')
ax.plot(t_eval, np.degrees(theta_analytical),
'g:', linewidth=1.5, label='Analytical (linear)')
ax.set_xlabel('Time [s]', fontsize=12)
ax.set_ylabel('$\\theta$ [deg]', fontsize=12)
ax.set_title(f'Simple Pendulum ($\\theta_0 = {theta0_deg}°$)', fontsize=13)
ax.legend(fontsize=10)
ax.grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig('simple_pendulum.png', dpi=150, bbox_inches='tight')
plt.show()
# 周期の比較を表示
print("=== 周期の比較 ===")
T_linear = 2 * np.pi / omega0
print(f"線形近似の周期: T = 2π√(l/g) = {T_linear:.4f} s")
for theta0_deg in [10, 30, 60, 90]:
theta0 = np.radians(theta0_deg)
sol = solve_ivp(
pendulum_nonlinear, (0, 20), [theta0, 0.0],
method='RK45', t_eval=np.linspace(0, 20, 10000), rtol=1e-12
)
# ゼロクロス(正→負)を検出して周期を推定
theta_vals = sol.y[0]
crossings = []
for i in range(1, len(theta_vals)):
if theta_vals[i-1] > 0 and theta_vals[i] <= 0:
# 線形補間でゼロクロスの時刻を推定
t_cross = sol.t[i-1] + (sol.t[i] - sol.t[i-1]) * theta_vals[i-1] / (theta_vals[i-1] - theta_vals[i])
crossings.append(t_cross)
if len(crossings) >= 2:
T_numerical = 2 * (crossings[1] - crossings[0])
error = (T_numerical - T_linear) / T_linear * 100
print(f"θ₀ = {theta0_deg:3d}° → T = {T_numerical:.4f} s (線形近似からの誤差: {error:+.2f}%)")
上記のコードを実行すると、次のことが確認できます。
- 初期角度 10 度の場合: 非線形と線形近似の結果はほぼ完全に一致します。微小角度の近似が十分に有効であることがわかります
- 初期角度 60 度の場合: 時間が経つにつれて非線形と線形近似の位相がずれていきます。非線形の場合の周期が長くなるため、振動の山と谷の位置が徐々にずれるのです
- 周期の比較: 初期角度が大きくなるにつれて、実際の周期が線形近似の周期 $T = 2\pi\sqrt{l/g}$ からずれていく様子が数値で確認できます
まとめ
本記事では、質点の運動方程式の立て方と解法について解説しました。
- 運動方程式を解くとは: 力と初期条件から、位置 $\bm{r}(t)$ を時刻の関数として求めることです。座標系の選択が問題を簡単にする鍵となります
- 直交座標系: 運動方程式が $x$, $y$, $z$ 成分に独立に分解でき、直線的な運動の解析に適しています
- 極座標系: 加速度に遠心力項 $-r\dot{\theta}^2$ とコリオリ項 $2\dot{r}\dot{\theta}$ が現れます。中心力の問題や円運動の解析に自然な座標系です
- 放物運動: 水平と鉛直が独立に解け、軌跡は放物線になります。飛距離は $\alpha = 45°$ で最大です
- 等速円運動: 向心力 $F = mR\omega^2 = mv^2/R$ が常に中心向きに必要です
- 単振り子: 非線形方程式 $\ddot{\theta} + (g/l)\sin\theta = 0$ を微小角度で線形化すると単振動になり、周期 $T = 2\pi\sqrt{l/g}$ が得られます
次のステップとして、以下のトピックもぜひ学んでみてください。
- 単振動とバネ-質点系の運動方程式は、運動方程式の最も基本的な応用です
- エネルギー保存則を導入すると、運動方程式を解かずに運動の定性的な性質を知ることができます
- 解析力学(ラグランジュ力学)では、座標系に依存しない一般的な定式化が可能になります