安安,有了雙狹縫,更進階的多狹縫來囉!
不囉唆,先上熱騰騰的程式碼:
import numpy as np
import matplotlib.pyplot as plt
#Define single slit
def single_slit(x, d): #d=slit width
if -d/2 < x < d/2: #光如果落在slit中間
return 1/d #為了乘以d後通過狹縫面積好算為1,先除以d
else:
return 0 #落在狹縫外
#define multiple slits
def multi_slit_x(spacing, n): #spacing狹縫間隔, n為狹縫數量
return [-spacing*(n-1)/2 +spacing*i for i in range(n)] #以0為中心的間隔,從最左邊開始。
D = 10 #繪圖範圍-5~5
d = 1 #狹縫寬度
N = 501 #繪圖間隔(精度)
spacing = 1 #狹縫間隔
n = 6 #狹縫數量
x_list = multi_slit_x(spacing, n) #帶入狹縫數據
source = [1/n for i in range(len(x_list))] #將x_list和光source長度統一
def phase_term(kx, x): #處理complex,也就是公式中dx以前的部分
phase = complex(0, -kx*x) #前面放實部(這裡面沒有,所以為0),後面為虛部-kx*x
return np.exp(phase) #呼叫exponential e的i次方
def Fraunhofer_1D(kx, source, x_list, dx): #dx就是D/N(寬),source帶入phase term就是每段高度做積分
output = 0
for i in range(len(x_list)):
rec_area = source[i]*phase_term(kx, x_list[i])*dx #黎曼和長方形面積
output += rec_area #不斷地跑回圈加長方形面積
return output
K = 2*np.pi*10
kx_list = [-K/2 + K*i/N for i in range(N)] #波數(空間上的分佈)
far_field = [Fraunhofer_1D(kx_list[i], source, x_list, 1) for i in range(N)] #1是兩個波源相加的結果
intensity = [abs(far_field[i])**2 for i in range(N)]
plt.plot(kx_list, intensity, color = 'mediumaquamarine')
plt.title('1DFourierTransform_multi_slit')
plt.ylabel('Intensity')
plt.show()
這次做的變更有:
可以得出六個狹縫的圖長這樣:
有趣的是,我們可以將n 改為 2,也就是和昨天算的雙狹縫是一樣的。
得圖如下:
和昨天的是不是一模一樣呢(下圖為昨天雙狹縫畫出的圖)
由於多狹縫設定中有n-1,所以這個程式碼無法將n帶入1。
好了,今天先這樣,明天繼續玩~