ヤングの実験をアニメーションで表現してみたよ

# ヤングの実験

　光を二重スリットを通過させると光の回折と干渉により明暗の干渉縞が生じる。これがヤングの実験である。光の波の性質を利用した現象だが、二重スリットを通過した二つの波がスクリーンで干渉縞を作るのが少しイメージしづらい。そこで、pythonを用いて二つの点から出た波を重ね合わせて強め合うところと弱め合うところができるというのをアニメーションで実感しようという試みです。

　二次元的なアニメーションにすることで干渉縞ができることが実感しやすいかと思います。

# プログラム
　スリット間隔を変数で変更できるようにしておきます。

```Python
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation

plt.rcParams["font.family"] = "Times New Roman"

#スリッド幅の変数、実際のスリット幅はこれの2倍
distance = 1

#描画時間
tnum = 100

xnum = 100
ynum = xnum
bar = int(xnum/2)

#波を関数で定義
def f(x, y, t, d):
    return 0.5*np.sin(2*np.pi*(((x - d)**2 + (y)**2)**0.5 - t)) + 0.5*np.sin(2*np.pi*(((x + d)**2 + (y)**2)**0.5 - t))

def fx(x, y, t):
    return np.sin(2*np.pi*(y + t))

#重ね合わせデータの作成
x = np.linspace(-5, 5, xnum)
y = np.linspace(-5, -5+int(10*bar/ynum), bar)
y2 = np.linspace(-5+int(10*bar/ynum) + 1, 5, ynum - bar)
X, Y = np.meshgrid(x, y)
X2, Y2 = np.meshgrid(x, y2)

T = np.linspace(0, 4, tnum)

Z = np.zeros(ynum*xnum*tnum).reshape((ynum, xnum, tnum))

for i in range(tnum):
    Z[:bar,:,i] = f(X, Y, T[i], distance)
    Z[bar:,:,i] = fx(X2, Y2, T[i])

#plot
fig = plt.figure(figsize = (8, 8))

grid = plt.GridSpec(4, 1)

ax1 = fig.add_subplot(grid[0:3, 0])
ax1.set_xticklabels([])

ax2 = fig.add_subplot(grid[3, 0])

plt.xticks(fontsize=16)
plt.yticks(fontsize=16)

def animate(j):
    ax1.clear()
    ax1.contourf(Z[:,:,j], 20)
    ax1.set_title("t = " + '%03d'%(j),size=18)
    ax1.set_xticklabels([])
    ax1.set_yticklabels([])
    ax1.plot([0, xnum-1],[bar, bar], linewidth=5, color="k")
    ax1.plot([int(ynum/2 - ynum/10*distance)-0.5, int(ynum/2 + ynum/10*distance)-0.5],[bar, bar], "s", markersize=5, color="w")
    
    ax2.cla()
    ax2.set_ylim([-1, 1])
    ax2.set_xlabel("x",size=18)
    ax2.set_ylabel("Intensity",size=18)
    ax2.plot(X[-1], Z[1,:,j], color="k")
       
ani = animation.FuncAnimation(fig, animate, interval = 150, blit=False)
```
　この実行結果が次になります

# 実行結果

![Double-slit_1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2804113/eb0587a0-031a-e7c6-a3ed-78d1169d052b.gif)

　上から光が入射してきているとします。中央の黒い横線が二重スリットで白い点の箇所にスリットが開けられています。白い点を原点とする二つの波の重ね合わせを関数$f$で定義しています。二重スリッドを通過した光は上図の下端でスクリーンに投影されているとします。各瞬間でのスクーリン上での波の位相を表したのが下のプロットになっています。タイトルで経過時間$t$を示します。

　重ね合わされた波に強め合うところと弱め合うところができているのがわかるでしょうか。上の図において、青と黄色が交互に現れているところが強め合うところで、緑色で色の変化に乏しいところが弱め合うところです。それぞれ、スクリーン上では明線と暗線に対応します。

　もう少し、干渉縞がわかりやすいようにスクリーン上のプロットが消えずに残るようにしましょう。プログラムではax2.cla()をコメントアウトすることに対応します。その結果が次になります。

![Double-slit_1_2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2804113/9349628d-d5ba-aa1b-e53e-850caf275c7c.gif)

　こちらの方が干渉縞がわかりやすいです。振幅の大きい箇所が明線で振幅が0の箇所が暗線です。$x = 0$と$x = 3$付近に明線があることがわかります

　ここでヤングの実験をおさらいします。二重スリットのスリット幅を$d$、二重スリットとスクリーンまでの距離を$l$、光の波長を$\lambda$とすると干渉縞の間隔$x$は次のようにあわわすことができます。

$$x = \frac{n l \lambda}{d}$$

　ここで$n$は整数で、この式は$d$が十分小さく、$l$が十分大きい時に成り立ちます。今回パラメタはそれぞれ$d=2$、$l=5$、$\lambda=1$なので、上記のアニメーションでは$n=1$の時の明線が$x=2.5$となるはずです。実際の値はもう少し大きく見えますが、これはプロット範囲の関係から$d$が十分小さく、$l$が十分大きいという仮定が成立していないためだと思われます。

　続けて、スリット間隔を3倍にして描画した結果が次になります。

![Double-slit_3_2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2804113/fd9f0a2e-4739-47db-9e79-b52c47aba7bd.gif)

　$x$は$d$に反比例するので、スリット間隔を広くしたことにより明線の間隔が小さくなりました。パラメタはそれぞれ$d=6$、$l=5$、$\lambda=1$なので、$n=1$の時の明線が$x=0.83$となり、これも妥当だと思います。


# まとめ

　ヤングの実験で干渉縞が生じることが実感できたのではないでしょうか。これを電子線で行った二重スリット実験も電子の波動性を示した実験として非常に有名です。さらに、回折現象は二重スリットのとても小さい構造を干渉縞としてスクリーンに拡大できるので、分子レベルの解析手法としても重要です。

以上です。