波動光学入門(干渉と回折) — ヤングの実験からフラウンホーファー回折までをPythonで可視化

幾何光学では光を直進する「光線」として扱いましたが、光は本質的に電磁波です。光の波としての性質が顕著に現れるのが干渉回折です。これらの現象は幾何光学では説明できず、波動光学の枠組みが必要になります。

干渉と回折は、光学薄膜コーティング、回折格子、光ファイバー通信、ホログラフィー、光リソグラフィなど、幅広い応用の基盤です。本記事では、波動光学の出発点として干渉と回折の基本を丁寧に導出します。

本記事の内容

  • 光の波動としての記述
  • ヤングの二重スリット実験と干渉条件の導出
  • 単スリットのフラウンホーファー回折
  • 回折パターンとsinc関数
  • Pythonでの干渉・回折パターンの可視化

前提知識

この記事を読む前に、以下の記事を読んでおくと理解が深まります。

光の波動としての記述

スカラー波動

光は電磁波ですが、偏光を無視できる場合はスカラー波として扱えます。単色平面波の電場は:

$$ E(\bm{r}, t) = E_0 \exp\left[i(\bm{k}\cdot\bm{r} – \omega t)\right] $$

ここで、$\bm{k}$ は波数ベクトル($|\bm{k}| = k = 2\pi/\lambda$)、$\omega$ は角周波数($\omega = 2\pi c/\lambda$)、$E_0$ は振幅です。

重ね合わせの原理

波動方程式は線形なので、複数の波の重ね合わせが成り立ちます:

$$ E_{\text{total}} = \sum_i E_i $$

この性質が干渉と回折の数学的基盤です。

強度

観測されるのは電場の二乗時間平均(強度)です:

$$ I = \langle |E|^2 \rangle = E \cdot E^* $$

ヤングの二重スリット実験

実験の設定

単色光(波長 $\lambda$)が、間隔 $d$ の2つの狭いスリット $S_1$, $S_2$ を通過し、距離 $L$ 先のスクリーンに到達します。スクリーン上の位置 $y$ での干渉パターンを求めます。

光路差の計算

各スリットからスクリーン上の点 $P$(位置 $y$)までの距離は:

$$ r_1 = \sqrt{L^2 + (y – d/2)^2} $$

$$ r_2 = \sqrt{L^2 + (y + d/2)^2} $$

$L \gg d$ かつ $L \gg y$ の近似(フラウンホーファー条件)では:

$$ r_1 \approx L + \frac{(y – d/2)^2}{2L} = L + \frac{y^2}{2L} – \frac{yd}{2L} + \frac{d^2}{8L} $$

$$ r_2 \approx L + \frac{(y + d/2)^2}{2L} = L + \frac{y^2}{2L} + \frac{yd}{2L} + \frac{d^2}{8L} $$

光路差は:

$$ \Delta r = r_2 – r_1 \approx \frac{yd}{L} $$

角度 $\theta \approx y/L$(小角度近似)を使うと:

$$ \boxed{\Delta r = d\sin\theta \approx d\theta} $$

干渉条件

2つの波の位相差は $\delta = k \Delta r = \frac{2\pi}{\lambda} d\sin\theta$ です。

強め合い(明線)の条件

$$ \boxed{d\sin\theta = m\lambda \quad (m = 0, \pm 1, \pm 2, \ldots)} $$

弱め合い(暗線)の条件

$$ \boxed{d\sin\theta = \left(m + \frac{1}{2}\right)\lambda \quad (m = 0, \pm 1, \pm 2, \ldots)} $$

強度分布の導出

スリットからの2つの波を重ね合わせます。等振幅 $E_0$ として:

$$ E = E_0 e^{i(kr_1 – \omega t)} + E_0 e^{i(kr_2 – \omega t)} $$

共通の位相因子をくくり出します:

$$ E = E_0 e^{i(k\bar{r} – \omega t)} \left( e^{-i\delta/2} + e^{i\delta/2} \right) $$

ここで $\bar{r} = (r_1 + r_2)/2$, $\delta = k(r_2 – r_1)$ です。オイラーの公式より:

$$ e^{-i\delta/2} + e^{i\delta/2} = 2\cos\frac{\delta}{2} $$

したがって強度は:

$$ I = |E|^2 = 4E_0^2 \cos^2\frac{\delta}{2} $$

$\delta = \frac{2\pi d\sin\theta}{\lambda}$ を代入して:

$$ \boxed{I(\theta) = 4I_0 \cos^2\left(\frac{\pi d \sin\theta}{\lambda}\right)} $$

ここで $I_0 = E_0^2$ は1つのスリットだけの場合の強度です。

干渉縞の間隔

スクリーン上の明線の位置は $y_m = m\lambda L/d$ なので、隣り合う明線の間隔は:

$$ \boxed{\Delta y = \frac{\lambda L}{d}} $$

スリット間隔 $d$ を小さくするか、波長 $\lambda$ を長くすると縞間隔が広がります。

単スリットのフラウンホーファー回折

問題設定

幅 $a$ の単一スリットに平面波が入射したときの、遠方(フラウンホーファー領域)での回折パターンを求めます。

フラウンホーファー条件は $L \gg a^2/\lambda$ です。この条件下では、スリット面での波面の曲率を無視でき、フーリエ変換で回折パターンを計算できます。

ホイヘンス-フレネルの原理

スリット面上の各点を二次波源とみなします。スリットの中心を原点とすると、位置 $\xi$($-a/2 \leq \xi \leq a/2$)の二次波源からスクリーン上の角度 $\theta$ の方向への光路差は $\xi\sin\theta$ です。

スクリーン上の電場振幅は、すべての二次波源からの寄与を積分して:

$$ E(\theta) = E_0 \int_{-a/2}^{a/2} \exp\left(ik\xi\sin\theta\right) d\xi $$

積分の実行

$u = k\sin\theta$ とおくと:

$$ E(\theta) = E_0 \int_{-a/2}^{a/2} e^{iu\xi} d\xi $$

$$ = E_0 \left[\frac{e^{iu\xi}}{iu}\right]_{-a/2}^{a/2} $$

$$ = E_0 \cdot \frac{e^{iua/2} – e^{-iua/2}}{iu} $$

$$ = E_0 \cdot \frac{2i\sin(ua/2)}{iu} $$

$$ = E_0 \cdot \frac{2\sin(ua/2)}{u} $$

$\beta = \frac{ka\sin\theta}{2} = \frac{\pi a\sin\theta}{\lambda}$ とおくと $ua/2 = \beta$ なので:

$$ E(\theta) = E_0 a \cdot \frac{\sin\beta}{\beta} $$

$\text{sinc}$ 関数 $\text{sinc}(x) = \frac{\sin(\pi x)}{\pi x}$ を用いると:

$$ E(\theta) = E_0 a \cdot \text{sinc}\left(\frac{a\sin\theta}{\lambda}\right) $$

強度分布は:

$$ \boxed{I(\theta) = I_0 \left(\frac{\sin\beta}{\beta}\right)^2 = I_0 \,\text{sinc}^2\left(\frac{a\sin\theta}{\lambda}\right)} $$

ここで $I_0 = (E_0 a)^2$ は $\theta = 0$ での強度、$\beta = \frac{\pi a\sin\theta}{\lambda}$ です。

暗線(極小)の位置

$\sin\beta = 0$ かつ $\beta \neq 0$ のとき、すなわち:

$$ \boxed{a\sin\theta = m\lambda \quad (m = \pm 1, \pm 2, \ldots)} $$

$m = 0$ は中央極大なので除きます。

中央極大の幅

第1暗線は $\sin\theta_1 = \lambda/a$ の位置にあるので、中央極大の角度幅は:

$$ \Delta\theta = 2\theta_1 \approx \frac{2\lambda}{a} $$

スリット幅 $a$ が小さいほど回折が広がる、つまり小さな開口ほど光が大きく広がるという直感に反する結果が得られます。これは波動特有の性質です。

回折パターンとフーリエ変換の関係

フラウンホーファー回折パターンは、開口関数のフーリエ変換であることを示します。

開口関数 $t(\xi)$ を定義します。単スリットの場合:

$$ t(\xi) = \begin{cases} 1 & |\xi| \leq a/2 \\ 0 & |\xi| > a/2 \end{cases} $$

これは矩形関数 $\text{rect}(\xi/a)$ です。フラウンホーファー回折の電場振幅は:

$$ E(\theta) \propto \int_{-\infty}^{\infty} t(\xi) \exp(ik\xi\sin\theta) d\xi = \mathcal{F}\{t(\xi)\}\Big|_{f_\xi = \sin\theta/\lambda} $$

つまり、フラウンホーファー回折パターンは開口関数のフーリエ変換です。矩形関数のフーリエ変換が $\text{sinc}$ 関数であることと一致します。

この対応関係は非常に強力で、任意の形状の開口に対する回折パターンをフーリエ変換で計算できます。

二重スリットの回折パターン(干渉×回折)

実際の二重スリットでは、スリットの有限幅による回折と、2つのスリット間の干渉が同時に起こります。

幅 $a$ のスリットが間隔 $d$ で並ぶ場合の強度分布は:

$$ \boxed{I(\theta) = I_0 \left(\frac{\sin\beta}{\beta}\right)^2 \cos^2\gamma} $$

ここで $\beta = \frac{\pi a\sin\theta}{\lambda}$(回折因子)、$\gamma = \frac{\pi d\sin\theta}{\lambda}$(干渉因子)です。

$(\sin\beta/\beta)^2$ が全体の包絡線を決め、$\cos^2\gamma$ が干渉縞の細かい振動を決めます。

Pythonでの可視化

import numpy as np
import matplotlib.pyplot as plt

fig, axes = plt.subplots(2, 2, figsize=(16, 12))

# 共通パラメータ
lam = 550e-9  # 波長 550nm(緑色光)

# === (1) ヤングの二重スリット干渉パターン ===
ax = axes[0, 0]
d = 0.2e-3   # スリット間隔 0.2mm
L = 1.0      # スクリーン距離 1m

y = np.linspace(-10e-3, 10e-3, 2000)  # スクリーン上の位置
theta = np.arctan(y / L)
delta = 2 * np.pi * d * np.sin(theta) / lam
I_interference = 4 * np.cos(delta / 2)**2

ax.plot(y * 1e3, I_interference / 4, 'b-', lw=1.5)
ax.set_xlabel('Position $y$ [mm]')
ax.set_ylabel('$I / I_0$')
ax.set_title(f"Young's double slit ($d$={d*1e3:.1f} mm, $\\lambda$={lam*1e9:.0f} nm)", fontsize=12)
ax.grid(True, alpha=0.3)
ax.set_xlim(-10, 10)

# 縞間隔の理論値を表示
fringe_spacing = lam * L / d
ax.axvline(fringe_spacing * 1e3, color='r', ls='--', lw=1, alpha=0.5,
           label=f'$\\Delta y$ = {fringe_spacing*1e3:.2f} mm')
ax.axvline(-fringe_spacing * 1e3, color='r', ls='--', lw=1, alpha=0.5)
ax.legend(fontsize=9)

# === (2) 単スリットのフラウンホーファー回折 ===
ax = axes[0, 1]
theta_range = np.linspace(-0.02, 0.02, 2000)

for a, color, ls in [(50e-6, 'blue', '-'), (100e-6, 'red', '--'), (200e-6, 'green', ':')]:
    beta = np.pi * a * np.sin(theta_range) / lam
    # sinc^2 (beta=0でのゼロ除算を回避)
    I_diff = np.where(np.abs(beta) < 1e-10, 1.0, (np.sin(beta) / beta)**2)
    ax.plot(np.degrees(theta_range), I_diff, color=color, ls=ls, lw=2,
            label=f'$a$ = {a*1e6:.0f} $\\mu$m')

ax.set_xlabel('Angle $\\theta$ [deg]')
ax.set_ylabel('$I / I_0$')
ax.set_title(f'Single slit Fraunhofer diffraction ($\\lambda$={lam*1e9:.0f} nm)', fontsize=12)
ax.legend(fontsize=9)
ax.grid(True, alpha=0.3)

# === (3) 二重スリットの干渉+回折パターン ===
ax = axes[1, 0]
a = 50e-6    # スリット幅 50μm
d = 250e-6   # スリット間隔 250μm

theta_range2 = np.linspace(-0.02, 0.02, 5000)
beta = np.pi * a * np.sin(theta_range2) / lam
gamma = np.pi * d * np.sin(theta_range2) / lam

diffraction_env = np.where(np.abs(beta) < 1e-10, 1.0, (np.sin(beta)/beta)**2)
interference = np.cos(gamma)**2
I_total = diffraction_env * interference

ax.plot(np.degrees(theta_range2), I_total, 'b-', lw=1, label='Total intensity')
ax.plot(np.degrees(theta_range2), diffraction_env, 'r--', lw=2, alpha=0.7,
        label='Diffraction envelope')
ax.set_xlabel('Angle $\\theta$ [deg]')
ax.set_ylabel('$I / I_0$')
ax.set_title(f'Double slit: interference × diffraction\n($a$={a*1e6:.0f} $\\mu$m, $d$={d*1e6:.0f} $\\mu$m)',
             fontsize=12)
ax.legend(fontsize=9)
ax.grid(True, alpha=0.3)

# === (4) 2D干渉パターンの可視化 ===
ax = axes[1, 1]
d_2d = 0.2e-3
a_2d = 40e-6
L_2d = 1.0

x_screen = np.linspace(-8e-3, 8e-3, 800)
y_screen = np.linspace(-8e-3, 8e-3, 800)
X, Y = np.meshgrid(x_screen, y_screen)
R = np.sqrt(X**2 + Y**2)

theta_2d = np.arctan(R / L_2d)
# y方向にスリット配置(x方向に干渉縞)
theta_slit = np.arctan(X / L_2d)

beta_2d = np.pi * a_2d * np.sin(theta_slit) / lam
gamma_2d = np.pi * d_2d * np.sin(theta_slit) / lam

diff_2d = np.where(np.abs(beta_2d) < 1e-10, 1.0, (np.sin(beta_2d)/beta_2d)**2)
interf_2d = np.cos(gamma_2d)**2
I_2d = diff_2d * interf_2d

im = ax.imshow(I_2d, extent=[-8, 8, -8, 8], cmap='inferno',
               aspect='equal', origin='lower')
ax.set_xlabel('$x$ [mm]')
ax.set_ylabel('$y$ [mm]')
ax.set_title('2D interference pattern on screen', fontsize=12)
plt.colorbar(im, ax=ax, label='$I / I_0$', shrink=0.8)

plt.tight_layout()
plt.show()

左上はヤングの二重スリット実験の干渉パターンです。明暗の等間隔な縞が形成され、縞間隔 $\Delta y = \lambda L/d$ と一致することが確認できます。

右上は単スリットのフラウンホーファー回折パターンです。スリット幅 $a$ が小さいほど中央極大が広がり、回折効果が強くなることが分かります。強度分布は $\text{sinc}^2$ 関数に従います。

左下は二重スリットの完全なパターンで、$\cos^2$ の干渉縞が $\text{sinc}^2$ の回折包絡線で変調されている様子が見えます。回折の暗線の位置で干渉縞が消失する「欠落次数」(missing order)も確認できます。

右下はスクリーン上に投影された2次元の干渉パターンです。スリットが$x$方向に並んでいるため、$x$方向に干渉縞が形成されます。

まとめ

本記事では、波動光学の基本である干渉と回折について解説しました。

  • 光の波動記述: $E = E_0 \exp[i(\bm{k}\cdot\bm{r} – \omega t)]$
  • ヤングの二重スリット: $I(\theta) = 4I_0\cos^2\left(\frac{\pi d\sin\theta}{\lambda}\right)$, 干渉縞間隔 $\Delta y = \lambda L/d$
  • フラウンホーファー回折: $I(\theta) = I_0\,\text{sinc}^2\left(\frac{a\sin\theta}{\lambda}\right)$, 暗線は $a\sin\theta = m\lambda$
  • 回折とフーリエ変換: フラウンホーファー回折パターンは開口関数のフーリエ変換
  • 二重スリット(有限幅): 干渉因子 $\cos^2\gamma$ × 回折因子 $(\sin\beta/\beta)^2$

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