単振動(Simple Harmonic Motion)は、物理学で最も基本的な振動現象です。バネに繋がれた物体の往復運動、振り子の揺れ、LC回路の電流振動など、自然界のいたるところに現れます。
単振動を理解することは、振動・波動全般、量子力学の調和振動子、電気回路の共振など幅広い分野への入り口となります。本記事では、運動方程式の導出から一般解の導出まで丁寧に解説します。
本記事の内容
- 単振動の運動方程式と一般解の導出
- 振幅・角振動数・位相の物理的意味
- エネルギー保存則との関係
- Pythonでのシミュレーションと可視化
前提知識
この記事を読む前に、以下の記事を読んでおくと理解が深まります。
単振動とは
単振動とは、復元力が変位に比例する場合に生じる周期的な運動です。バネ定数 $k$ のバネに接続された質量 $m$ の物体を考えます。
フックの法則より、変位 $x$ に対する復元力は、
$$ F = -kx $$
マイナス符号は、力が常に変位と逆向き(平衡位置に向かう方向)であることを示しています。
運動方程式の導出
ニュートンの第2法則 $F = ma$ に復元力を代入すると、
$$ m\ddot{x} = -kx $$
$$ \ddot{x} + \frac{k}{m}x = 0 $$
ここで角振動数 $\omega$ を、
$$ \omega = \sqrt{\frac{k}{m}} $$
と定義すると、運動方程式は次の形になります。
$$ \ddot{x} + \omega^2 x = 0 $$
これが 単振動の運動方程式 です。
一般解の導出
$x(t) = e^{\lambda t}$ を試行解として代入します。
$$ \lambda^2 e^{\lambda t} + \omega^2 e^{\lambda t} = 0 $$
$$ \lambda^2 + \omega^2 = 0 $$
$$ \lambda = \pm i\omega $$
ここで $i$ は虚数単位です。一般解は、
$$ x(t) = C_1 e^{i\omega t} + C_2 e^{-i\omega t} $$
オイラーの公式 $e^{i\theta} = \cos\theta + i\sin\theta$ を用いると、実数解として次のように書けます。
$$ x(t) = A\cos(\omega t + \phi) $$
ここで、
- $A$: 振幅(最大変位)
- $\omega$: 角振動数 $\text{[rad/s]}$
- $\phi$: 初期位相 $\text{[rad]}$
初期条件による定数の決定
初期条件 $x(0) = x_0$, $\dot{x}(0) = v_0$ を与えると、
$$ \begin{align} x(0) &= A\cos\phi = x_0 \\ \dot{x}(0) &= -A\omega\sin\phi = v_0 \end{align} $$
これより、
$$ A = \sqrt{x_0^2 + \left(\frac{v_0}{\omega}\right)^2}, \quad \phi = -\arctan\left(\frac{v_0}{\omega x_0}\right) $$
周期と振動数
周期 $T$(1往復に要する時間)は、
$$ T = \frac{2\pi}{\omega} = 2\pi\sqrt{\frac{m}{k}} $$
振動数 $f$(単位時間あたりの往復回数)は、
$$ f = \frac{1}{T} = \frac{1}{2\pi}\sqrt{\frac{k}{m}} $$
重要な点として、周期 $T$ は振幅 $A$ に依存しません。これを 等時性 といいます。
エネルギー保存則
運動エネルギーとポテンシャルエネルギー
運動エネルギー $K$ とポテンシャルエネルギー $U$ は、
$$ K = \frac{1}{2}m\dot{x}^2 = \frac{1}{2}mA^2\omega^2\sin^2(\omega t + \phi) $$
$$ U = \frac{1}{2}kx^2 = \frac{1}{2}kA^2\cos^2(\omega t + \phi) $$
$k = m\omega^2$ を用いると、全力学的エネルギーは、
$$ \begin{align} E &= K + U \\ &= \frac{1}{2}mA^2\omega^2\sin^2(\omega t + \phi) + \frac{1}{2}mA^2\omega^2\cos^2(\omega t + \phi) \\ &= \frac{1}{2}mA^2\omega^2 \\ &= \frac{1}{2}kA^2 \end{align} $$
全エネルギーは時間によらず一定であり、エネルギーが保存されていることが確認できます。
Pythonでの実装
単振動の運動と、エネルギーの時間変化を可視化します。
import numpy as np
import matplotlib.pyplot as plt
# パラメータ
m = 1.0 # 質量 [kg]
k = 4.0 # バネ定数 [N/m]
omega = np.sqrt(k / m) # 角振動数
x0 = 2.0 # 初期変位 [m]
v0 = 0.0 # 初期速度 [m/s]
# 振幅と初期位相
A = np.sqrt(x0**2 + (v0 / omega)**2)
phi = -np.arctan2(v0, omega * x0)
# 時間配列
T = 2 * np.pi / omega
t = np.linspace(0, 3 * T, 500)
# 解析解
x = A * np.cos(omega * t + phi)
v = -A * omega * np.sin(omega * t + phi)
# エネルギー
K = 0.5 * m * v**2
U = 0.5 * k * x**2
E = K + U
# 可視化
fig, axes = plt.subplots(2, 1, figsize=(10, 8))
# 変位と速度
axes[0].plot(t, x, 'b-', linewidth=2, label='Displacement $x(t)$')
axes[0].plot(t, v, 'r--', linewidth=2, label='Velocity $v(t)$')
axes[0].set_xlabel('Time [s]')
axes[0].set_ylabel('$x$ [m], $v$ [m/s]')
axes[0].set_title('Simple Harmonic Motion')
axes[0].legend()
axes[0].grid(True)
# エネルギー
axes[1].plot(t, K, 'r-', linewidth=2, label='Kinetic Energy $K$')
axes[1].plot(t, U, 'b-', linewidth=2, label='Potential Energy $U$')
axes[1].plot(t, E, 'k--', linewidth=2, label='Total Energy $E$')
axes[1].set_xlabel('Time [s]')
axes[1].set_ylabel('Energy [J]')
axes[1].set_title('Energy Conservation in SHM')
axes[1].legend()
axes[1].grid(True)
plt.tight_layout()
plt.show()
上段のグラフでは、変位と速度が $\pi/2$ の位相差をもって振動している様子がわかります。下段では、運動エネルギーとポテンシャルエネルギーが互いに変換されながら、全エネルギーが一定であることが確認できます。
まとめ
本記事では、単振動の運動方程式と解法について解説しました。
- 復元力 $F = -kx$ から運動方程式 $\ddot{x} + \omega^2 x = 0$ を導出した
- 一般解は $x(t) = A\cos(\omega t + \phi)$ で、振幅は初期条件で決まる
- 周期 $T = 2\pi\sqrt{m/k}$ は振幅に依存しない(等時性)
- 運動エネルギーとポテンシャルエネルギーは互いに変換され、全エネルギーは保存される
次のステップとして、以下の記事も参考にしてください。