単振動の方程式と解法をわかりやすく解説

単振動(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}$ は振幅に依存しない(等時性)
  • 運動エネルギーとポテンシャルエネルギーは互いに変換され、全エネルギーは保存される

次のステップとして、以下の記事も参考にしてください。