从肥皂泡到手机屏幕:用Python模拟5种常见光学干涉现象(附代码)
用Python模拟5种光学干涉现象从肥皂泡到手机屏幕的物理可视化当阳光照射在肥皂泡表面时那些流动的彩虹色条纹其实是一场精妙的光学干涉表演。这种现象不仅存在于自然界更广泛应用于现代科技——从手机屏幕的防反射涂层到激光干涉仪的精密测量。本文将用Python代码还原五种经典干涉现象让抽象的光学原理变成可交互的数字实验。1. 环境准备与基础原理在开始模拟之前我们需要搭建Python科学计算环境。推荐使用Anaconda创建独立环境conda create -n optics python3.9 conda activate optics pip install numpy matplotlib scipy ipython干涉现象的核心是光波的叠加原理。当两列满足相干条件的光波相遇时空间各点的光强分布可以用以下公式描述import numpy as np def interference_intensity(I1, I2, delta_phi): 计算干涉光强分布 :param I1: 第一束光强度 :param I2: 第二束光强度 :param delta_phi: 相位差数组 :return: 干涉光强分布 return I1 I2 2 * np.sqrt(I1*I2) * np.cos(delta_phi)关键提示所有模拟都基于Fraunhofer近似远场条件这保证了我们可以用相对简单的数学模型获得准确结果。2. 杨氏双缝干涉模拟1801年托马斯·杨用双缝实验首次证明了光的波动性。让我们用Python重现这一经典实验import matplotlib.pyplot as plt def young_interference(wavelength500e-9, d0.1e-3, D1.0, size2e-3): 杨氏双缝干涉模拟 :param wavelength: 波长(米) :param d: 双缝间距 :param D: 缝到屏幕距离 :param size: 屏幕显示范围 x np.linspace(-size/2, size/2, 1000) r1 np.sqrt((x - d/2)**2 D**2) r2 np.sqrt((x d/2)**2 D**2) phi 2 * np.pi * (r2 - r1) / wavelength intensity interference_intensity(1, 1, phi) # 假设两束光强度相同 plt.figure(figsize(10,4)) plt.plot(x*1e3, intensity, b-) plt.xlabel(Position on screen (mm)) plt.ylabel(Relative intensity) plt.title(Young\s Double Slit Interference Pattern) plt.grid(True) plt.show()运行后会看到典型的明暗相间条纹。尝试调整参数观察变化增大波长wavelength条纹间距会变宽减小双缝间距d条纹也会变宽改变D会影响条纹的清晰度3. 薄膜干涉与牛顿环肥皂泡和油膜的彩色条纹源于薄膜干涉。下面的代码模拟了平行光照射薄膜产生的干涉def thin_film_interference(n1.33, thickness500e-9, wavelength_range(400,700)): 薄膜干涉颜色模拟 :param n: 薄膜折射率 :param thickness: 膜厚(米) :param wavelength_range: 可见光波长范围(nm) wavelengths np.linspace(wavelength_range[0], wavelength_range[1], 300) * 1e-9 delta 2 * n * thickness # 光程差 phi 2 * np.pi * delta / wavelengths intensity (1 np.cos(phi)) / 2 # 归一化强度 plt.figure(figsize(10,4)) plt.plot(wavelengths*1e9, intensity) plt.xlabel(Wavelength (nm)) plt.ylabel(Relative intensity) plt.title(Thin Film Interference Spectrum) plt.grid(True) plt.show()牛顿环是薄膜干涉的特殊形式常见于透镜与平面玻璃的接触处def newton_rings(R10.0, wavelength589e-9, max_radius5e-3): 牛顿环干涉模拟 :param R: 透镜曲率半径(米) :param wavelength: 光波长(米) :param max_radius: 模拟最大半径(米) x y np.linspace(-max_radius, max_radius, 1000) X, Y np.meshgrid(x, y) r np.sqrt(X**2 Y**2) h r**2 / (2 * R) # 空气层厚度 delta 2 * h wavelength/2 # 计入半波损失 phi 2 * np.pi * delta / wavelength intensity (1 np.cos(phi)) / 2 plt.figure(figsize(8,8)) plt.imshow(intensity, cmapgray, extent[-max_radius*1e3, max_radius*1e3]*2) plt.colorbar(labelRelative intensity) plt.title(Newton\s Rings Interference Pattern) plt.xlabel(x (mm)) plt.ylabel(y (mm)) plt.show()4. 劈尖干涉与工业应用劈尖干涉在表面平整度检测中有重要应用。以下代码生成可交互的劈尖干涉模拟from ipywidgets import interact def wedge_interference(theta0.01, wavelength632.8e-9, L0.01): 劈尖干涉模拟 :param theta: 劈尖角度(弧度) :param wavelength: 光波长(米) :param L: 劈尖长度(米) x np.linspace(0, L, 1000) d x * np.tan(theta) # 空气层厚度 delta 2 * d wavelength/2 # 计入半波损失 phi 2 * np.pi * delta / wavelength intensity (1 np.cos(phi)) / 2 plt.figure(figsize(10,4)) plt.plot(x*1e3, intensity, b-) plt.xlabel(Position along wedge (mm)) plt.ylabel(Relative intensity) plt.title(Wedge Interference Pattern) plt.grid(True) plt.show() interact(wedge_interference, theta(0.001, 0.1, 0.001), wavelength(400e-9, 700e-9, 10e-9), L(0.001, 0.1, 0.001))拖动滑块可以实时观察参数变化对条纹的影响。在工业生产中正是通过分析这种条纹的变形来检测玻璃平整度。5. 劳埃德镜与半波损失验证劳埃德镜实验不仅展示了干涉现象还验证了光在反射时的相位突变def lloyd_mirror(a1e-3, D1.0, wavelength500e-9, size5e-3): 劳埃德镜干涉模拟 :param a: 光源到镜面距离(米) :param D: 装置到屏幕距离(米) :param wavelength: 光波长(米) :param size: 屏幕显示范围(米) x np.linspace(-size/2, size/2, 1000) # 直接光程 r1 np.sqrt(x**2 D**2) # 镜像光源光程计入半波损失 r2 np.sqrt((x - 2*a)**2 D**2) phi 2 * np.pi * (r2 - r1) / wavelength np.pi # 附加π相位 intensity interference_intensity(1, 1, phi) plt.figure(figsize(10,4)) plt.plot(x*1e3, intensity, r-) plt.xlabel(Position on screen (mm)) plt.ylabel(Relative intensity) plt.title(Lloyd\s Mirror Interference Pattern) plt.grid(True) plt.show()注意观察屏幕与镜面接触处x0的光强理论预测此处应为暗纹这正是半波损失存在的直接证据。