You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Python复现衍射光栅条纹遇异常,寻求技术指导

衍射光栅条纹复现问题排查与解决

问题核心诊断

你当前得到异常结果(中央暗纹+两侧水平亮纹)的主要原因有两点:

  1. 强度函数公式错误:你定义的Intensity_img返回的是sin(2πxu/(λf))相关项,当x=0时该正弦项为0,积分结果直接为0,导致中央区域暗纹,完全违背光栅衍射中央亮纹的预期。同时该函数形式不符合夫琅禾费光栅衍射的复振幅积分逻辑。
  2. 循环索引遗漏: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 22:25:34