新闻  |   论坛  |   博客  |   在线研讨会
30行Python代码模拟物理光学现象:双缝干涉
芯语芯事 | 2022-07-22 15:56:42    阅读:2467   发布文章

1 双缝干涉概念

单色光照射到具有两条狭缝的挡板上,这狭缝相距很近,通常在微米量级。从两条狭缝****出来的光波相位差恒定,频率相同。两束光在档板后的空间相互叠加而发生干涉现象,在屏上产生了明暗相间的干涉条纹。当屏上的某点与两缝的光程差是半波长的偶数倍时,形成亮条纹,是半个波长的奇数倍时,出现暗条纹。

30行Python代码模拟物理光学现象:双缝干涉


2 定态的干涉光波

实验室通常采用波长约为589nm的钠黄光作为干涉光源,上图中的a点就是光源所在处。钠光灯可以看做是点光源,其****的光波为球面波。球面波在一个平面上的传播方程可以简单写为:A=A0 * cos(w(t-r/v)+q) ,其中A为振幅,w为角频率,r为某点离光源的距离,t为传播时间,q为初始相位。为了方便计算空间各点的振幅,该公式可以用python定义为一个函数方便重复调用:

def func_A(t,q,x,y,x0,y0):
r = ((x - x0) ** 
+ (y - y0) ** 2) ** 0.5
A=np.cos(w*(t-r/v)+q)
return A

当光波到达b,c两条狭缝时,根据惠更斯原理,b,c两点会成为新的“子波源”,因此,b,c两个波源****的光波具有相同的频率,恒定的相位差,成为相干光。假设两波源的初始相位都为零,根据上述python语言的函数定义,b,c两点的光波传播函数分别为:

b_A = func_A(t,0,x, y, 0, 2)c_A = func_A(t,0, x, y, 0, -2)

根据光强的计算公式,可以得到光强是正比于振幅A的平方。干涉场空间各点的振幅为两振幅的叠加,也就是b_A+c_A,所以空间的各点光强定义为函数:

def f(t,x, y):

    A1 = func_A(t, 0,x, y, 0, 2)

    A2 = func_A(t,0, x, y, 0, -2)

    return ((A1+A2)**2)

在某时刻干涉光场的解为f(0,x, y),采用matplotlib绘图库将干涉场各点的光强显示出来。执行ax.imshow(f(0,x, y)),就可以看到等间距的明暗光波叠加的效果。

30行Python代码模拟物理光学现象:双缝干涉


3 动态的光波效果

计算多个时刻的定态光波干涉场,然后将这些图像制作为视频或动画就可以看到动态光波的效果,下图就是干涉光波传播的效果动画。

30行Python代码模拟物理光学现象:双缝干涉


4 在现实中人眼看见的效果

我们上面介绍了光波的定态和动态效果图,但并不代表人眼所看到的就是明暗相间的散点。我们人眼所看到的效果是长时间光照射的叠加效果,比如,我们在看电风扇转动时,你只能看见一个圆盘,而不会看到三个叶片。再比如,显示屏是逐行扫描的,而我们看到的却是一幅图像。这一切都是由于视觉暂留效应,我们人眼并不能分辨出很短时间内的图像变化。干涉场也是这样,光波都是在飞秒时间内变化,我们无法分辨短时间光明暗的变化。在干涉场内,如果一个地方时亮时暗,我们看起来就是亮;如果一个地方一直暗看起来才会是暗。用Python模拟这种效果,就是简单将各个时刻的光波场叠加,就可以看到明暗相间的条纹。

z=f(0,x, y)for i in range(1,10):

    z=f(i*0.3,x, y)+z
30行Python代码模拟物理光学现象:双缝干涉


关于双缝干涉的python模拟先介绍到这里,最后附上源码:

import numpy as npimport matplotlib.pyplot as pltimport randomv=3*(10**8)*(10**6)*(10**(-15)) L=0.589w=2*np.pi*v/Ldef func_A(t,q,x,y,x0,y0):

    r = ((x - x0) ** 2 + (y - y0) ** 2) ** 0.5

    A=np.cos(w*(t-r/v)+q)

    return Afig, ax = plt.subplots()ax.set_xticks([])ax.set_yticks([])def f(t,x, y):

    A1 = func_A(t, 0,x, y, 0, 2)

    A2 = func_A(t,0, x, y, 0, -2)

    return ((A1+A2)**2)x = np.linspace(0, 8, 1000)y = np.linspace(-5, 5, 1000).reshape(-1, 1)ax.imshow(f(0,x, y))plt.show()


*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客