使用Python复现衍射光栅条纹遇异常,寻求技术指导
衍射光栅条纹复现问题排查与解决
问题核心诊断
你当前得到异常结果(中央暗纹+两侧水平亮纹)的主要原因有两点:
- 强度函数公式错误:你定义的
Intensity_img返回的是sin(2πxu/(λf))相关项,当x=0时该正弦项为0,积分结果直接为0,导致中央区域暗纹,完全违背光栅衍射中央亮纹的预期。同时该函数形式不符合夫琅禾费光栅衍射的复振幅积分逻辑。 - 循环索引遗漏:
for i in range(len(x)-1)会跳过最后一行的计算,导致I_img最后一行保留初始值0,影响可视化结果。
修正方案
1. 修正衍射强度的计算逻辑
夫琅禾费光栅衍射的强度是单缝衍射因子调制多缝干涉因子的结果,正确的复振幅积分应包含复指数项,积分后取模平方得到强度。以下是修正后的核心函数:
import numpy as np from scipy.integrate import trapz import matplotlib.pyplot as plt def complex_amplitude(u, x): wavelength = 500e-3 # 0.5μm(对应500nm可见光) f = 1e6 # 1m,透镜焦距 slit_width = 100 # 单缝宽度,单位μm slit_spacing = 500 # 缝间距,单位μm slit_num = 10 # 光栅总缝数 # 单缝的矩形振幅分布 single_slit = np.where(np.abs(u) < slit_width/2, 1, 0) # 多缝干涉的相位项 phase = np.exp(1j * 2 * np.pi * x * u / (wavelength * f)) # 光栅整体的振幅分布:叠加所有缝的贡献 grating_amp = np.zeros_like(u, dtype=np.complex128) for n in range(slit_num): slit_pos = - (slit_num-1)*slit_spacing/2 + n*slit_spacing grating_amp += single_slit * np.exp(1j * 2 * np.pi * x * (u - slit_pos) / (wavelength * f)) return grating_amp
2. 修正循环与强度计算
# 屏幕x轴采样(单位μm) x = np.arange(-50000, 50100, 100) # 光栅u轴采样(单位μm) u = np.arange(-1000, 1001, 1) # 初始化强度数组(y方向与x方向一致,因为光栅在y方向均匀) I_img = np.zeros((len(x), len(x)), dtype=np.float64) # 计算每个x位置的强度 for i in range(len(x)): amp = complex_amplitude(u, x[i]) # 积分得到复振幅,取模平方为强度 I_img[i] = np.abs(trapz(amp, u))**2 # 可视化结果 plt.imshow(I_img, extent=[x.min(), x.max(), x.min(), x.max()], cmap='gray') plt.xlabel('x (μm)') plt.ylabel('y (μm)') plt.title('Diffraction Grating Pattern') plt.show()
3. 关键细节说明
- 复振幅积分后取模平方,确保强度非负,且中央位置(x=0)的干涉项同相叠加,得到最大强度的中央亮纹。
- 单缝宽度、缝间距、缝数可根据需求调整,改变条纹的疏密与调制深度。
- 采样区间
u需覆盖所有光栅缝的范围,避免积分遗漏导致结果偏差。
内容的提问来源于stack exchange,提问作者cr_007
相关产品推荐
相关产品推荐

