Python干涉仿真
文章目录
- 干涉仿真
- 双缝干涉
- 四孔干涉
干涉仿真
干涉只需将有限个子波在观察面上的复振幅叠加在一起即可。记观察面为 Σ \Sigma Σ,则坐标为 ( x i , y i , z i ) (x_i, y_i, z_i) (xi,yi,zi)的单色点光源在 Σ \Sigma Σ上的复振幅分布为
E ( x , y , z ) = A i 1 ı λ r e ı 2 π r i λ , r = ( x − x i ) 2 + ( y − y i ) 2 + ( z − z i ) 2 E(x, y, z)=A_i\frac{1}{\imath\lambda r}e^{\frac{\imath2\pi r_i}{\lambda}}, r=\sqrt{(x-x_i)^2+(y-y_i)^2+(z-z_i)^2} E(x,y,z)=Aiλr1eλ2πri,r=(x−xi)2+(y−yi)2+(z−zi)2
式中 ı \imath 是虚数符号,相应地,多个点光源在叠加之后的复振幅分布为
E ( x , y , z ) = ∑ A i 1 ı λ r e ı 2 π r i λ E(x, y, z)=\sum A_i\frac{1}{\imath\lambda r}e^{\frac{\imath2\pi r_i}{\lambda}} E(x,y,z)=∑Aiλr1eλ2πri
光强分布为
I = E 2 I=E^2 I=E2
其Python实现如下,其中ss是光源列表,每个光源包括 x i , y i , z i , A i x_i, y_i, z_i, A_i xi,yi,zi,Ai四个分量。观察平面默认为 x = 0 x=0 x=0,w, h, n分别是观察面的宽度、高度和网格尺寸。dWave为波长,单位是微米。
import numpy as npdef interfere(ss, w, h, n, dWave=0.6328):y = np.linspace(0, w, np.int(w/n)) - w/2z = np.linspace(0, h, np.int(h/n)) - h/2y, z = np.meshgrid(y,z) # 干涉网格E = y*0*1jfor s in ss:r = np.sqrt((s[0])**2+(s[1]-y)**2+(s[2]-z)**2)E += s[3]/(1j*dWave*r)*np.exp(1j*2*np.pi*r/dWave)return E**2
双缝干涉
双缝干涉有两个孔,即需要两个光源,将其放置在 x O y xOy xOy平面,位置分别是 ( − 0.2 m , ± 10 μ m , 0 ) (-0.2m, \pm10\mu m, 0) (−0.2m,±10μm,0),两束光的振幅均为 1 1 1。观察面的宽高为 80 × 20 80\times20 80×20mm,网格尺寸为 0.1 0.1 0.1,则干涉结果为
测试程序如下
def draw(img, w, h):plt.imshow(img, cmap='gray')plt.xlabel("x (um)")plt.ylabel("y (um)")yn, xn = img.shapexticks = [f"{x:.2f}" for x in np.linspace(-w/2, w/2, 10)]plt.xticks(np.linspace(0, xn, 10), xticks)yGrid = max(3, 10 * int(yn/xn))yticks = [f"{x:.2f}" for x in np.linspace(-h/2, h/2, yGrid)]plt.yticks(np.linspace(0, yn, yGrid), np.linspace(-h/2, h/2, yGrid))plt.colorbar()plt.tight_layout()plt.show()ss = [(-2e5, -10, 0, 1), (-2e5, 10, 0, 1)]
img = interfere(ss, 8e4, 2e4, 50)
draw(img, 8e4, 2e4)
杨氏双缝干涉要求双缝和观察屏的距离远大于双缝之间的距离,否则,例如将双缝和屏间距离缩短至2mm,则干涉图样为
四孔干涉
如果用4个等距小孔进行干涉,其位置分别是 ( 10 , 10 ) , ( 10 , − 10 ) , ( − 10 , − 10 ) , ( − 10 , 10 ) (10,10), (10,-10), (-10, -10), (-10,10) (10,10),(10,−10),(−10,−10),(−10,10),则其干涉图样为