引言
牛顿环实验是大学物理光学教学中的经典内容,通过观察等厚干涉条纹,帮助学生理解光的波动性并掌握透镜曲率半径或液体折射率的测量方法。然而,传统实验受限于设备精度与环境因素,难以直观展示参数变化对干涉图样的动态影响;同时,数据处理往往局限于逐差法等固定模式,学生缺乏对多种算法对比及误差分析的深入实践。
计算机仿真技术为上述问题提供了有效解决途径,能够在虚拟环境中复现实验现象,实现参数灵活调节与实时反馈。在众多科学计算工具中,Python与MATLAB凭借强大的数值计算与可视化能力,成为物理仿真教学的两大主流平台。Python开源免费,与NumPy、Matplotlib等库结合适合学生自主探索;MATLAB集成度高、开发快捷,适合课堂快速演示。然而,现有研究多集中于单一平台实现,对两者在牛顿环仿真中的操作特点、开发效率及教学适用性的系统对比尚属空白。
本研究旨在填补这一空白,分别基于Python和MATLAB构建牛顿环仿真,实现干涉图样生成、参数交互调节与虚拟数据处理;并从开发流程、交互体验等维度进行对比分析。
牛顿环实验基于光的等厚干涉原理。将一曲率半径较大的平凸透镜置于平板玻璃上,在透镜凸面与玻璃平面之间形成一层空气薄膜。当单色平行光垂直入射时,在空气膜上下表面反射的两束光发生干涉,形成以接触点为中心的一系列明暗相间的同心圆环,即牛顿环。设透镜曲率半径为 R,空气膜厚度为d,在距离接触点 r 处,由几何关系近似有:两束反射光的光程差δ 由空气膜厚度引起的几何路程差与半波损失共同决定。由于光从光疏介质(空气)射向光密介质(玻璃)时,在界面反射会发生半波损失,而另一束光从光密介质射向光疏介质时无半波损失,因此两束反射光之间存在额外的光程差。故总光程差为:
而对于干涉条件:
因此得到暗纹半径与级次、波长及曲率半径的关系:
而若是要绘制出干涉图样,则应从光强分布入手:求两束光干涉后产生的光强就是求两束光的振动叠加,若设两束光的振动方程为:可知干涉强度与厚度有关,根据前文我们已知
,可是此结果是由近似得来的,在某些情况下会产生误差,而我们根据已知关系同样可以得到:在此说明一点:在我们计算的时候使用第一个式子比较方便,而我们接下来要使用计算机编程的方法,不用人力计算,因此选择使用第二个式子来表示厚度更为准确。我们利用Python编程语言进行简单的牛顿环干涉仿真,具体的代码如下:import matplotlib.pyplot as pltimport numpy as np# 牛顿环核心物理参数(单位:m)lamda = 6e-7 # 入射光波长R = 10 # 平凸透镜曲率半径r = 0.005 # 观察区域半径step = 0.00001 # 网格步长# 生成观察平面二维网格x = np.linspace(-r, r, int((2*r)/step) + 1)y = np.linspace(-r, r, int((2*r)/step) + 1)X, Y = np.meshgrid(x, y)# 计算牛顿环空气膜厚度与干涉光强r_sq = X**2 + Y**2r_sq = np.clip(r_sq, 0, R**2 - 1e-10) # 数值保护,避免根号内负数I1 = r_sq < r**2 # 有效区域掩码d = R - np.sqrt(R**2 - r_sq) # 空气膜厚度I2 = 2 + 2 * np.cos(np.pi - 4 * np.pi * d / lamda) # 干涉光强公式I = 16 * I1 * I2 # 最终光强(放大+掩码)# 灰度图归一化(0-1范围)I_gray = (I - np.min(I)) / (np.max(I) - np.min(I))I_gray = np.clip(I_gray, 0, 1)# 自定义红色渐变colormapc = np.linspace(0, 1, 64)custom_cmap = np.column_stack((c, np.zeros_like(c), np.zeros_like(c)))# 绘制左右子图(原始光强+灰度图)fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 7))im1 = ax1.imshow(I, cmap=plt.matplotlib.colors.ListedColormap(custom_cmap), aspect='equal', interpolation='nearest')ax1.set_title('Original Intensity Map', fontsize=12, pad=10)ax1.axis('off')im2 = ax2.imshow(I_gray, cmap='gray', aspect='equal', interpolation='nearest')ax2.set_title('Grayscale Map', fontsize=12, pad=10)ax2.axis('off')plt.subplots_adjust(top=0.9, bottom=0.1, left=0.05, right=0.95, wspace=0.2)plt.show()
同理我们使用MATLAB进行编程处理,具体的代码如下:clc;clear;close all;% 核心物理参数lamda = 6e-7;R = 10; r = 0.005;step = 0.00001;% 生成二维网格x = linspace(-r, r, round((2*r)/step) + 1);y = linspace(-r, r, round((2*r)/step) + 1);[X, Y] = meshgrid(x, y);% 计算牛顿环光强r_sq = X.^2 + Y.^2;r_sq = max(min(r_sq, R^2 - 1e-10), 0);I1 = r_sq < r^2;d = R - sqrt(R^2 - r_sq);I2 = 2 + 2.*cos(pi - 4.*pi.*d/lamda);I = 16 * I1 .* I2;% 灰度图处理I_gray_scaled = mat2gray(I) * 255; I_gray_uint8 = uint8(I_gray_scaled);I_gray_uint8 = imadjust(I_gray_uint8, [0.1, 0.9], []); figure('Position', [100, 100, 1200, 800], 'Color', 'white');% 左侧原始光强图ax1 = subplot('Position', [0.05, 0.15, 0.4, 0.75]);image(I);c = linspace(0, 1, 64);colormap(ax1, [c', zeros(size(c')), zeros(size(c'))]);axis square;axis off;title(ax1, 'Original Intensity Map', 'FontSize', 12, 'HorizontalAlignment', 'center', ... 'Units', 'normalized', 'Position', [0.5, 1.1, 0]);% 右侧灰度图(子图位置与左侧对称)ax2 = subplot('Position', [0.55, 0.15, 0.4, 0.75]);image(I_gray_uint8); colormap(ax2, gray(256)); axis square;axis off;title(ax2, 'Grayscale Map', 'FontSize', 12,'HorizontalAlignment', 'center', ... 'Units', 'normalized','Position', [0.5, 1.1, 0]);sgtitle('Newton Ring Interference Pattern', 'FontSize', 14, 'HorizontalAlignment', 'center');
两段代码核心目标一致:基于牛顿环干涉的物理原理,通过数值计算模拟平凸透镜与平板玻璃间空气膜的干涉光强分布,最终原始光强图和灰度图的双图布局可视化牛顿环的同心圆环干涉条纹。
具体实现流程均为:定义核心物理参数(入射光波长、透镜曲率半径、观察区域等);生成二维网格坐标,计算各网格点到中心的距离;基于几何关系求解空气膜厚度,结合干涉光强公式计算光强分布;对光强数据做归一化、类型转换处理,适配图像渲染要求;绘制双图并调整布局。
| | |
|---|
| 用max(min())限制距离平方范围,避免根号内负数 | 用np.clip()实现等价数值保护逻辑,语法更简洁 |
| 需转换为uint8类型(0-255),依赖mat2gray/imadjust增强对比度 | 直接归一化到 0-1 浮点范围,依托numpy原生函数,无需类型转换 |
| 手动指定子图Position,标题用归一化坐标避免覆盖,需调整画布高度 | 用subplots快速生成布局,通过pad参数调整标题间距,布局语法更简洁 |
| 手动拼接 RGB 矩阵生成红色渐变,灰度图需指定gray(256)增强细节 | 用np.column_stack生成渐变,灰度图直接调用cmap='gray',API 封装更友好 |
| 步长过小时(0.00001)易卡顿,部分函数(imadjust)依赖图像处理工具箱 | 跨平台兼容性更好,无工具箱依赖,计算效率与 MATLAB 接近 |
可集成到大学物理光学课程的可视化教学中,通过调整参数(如波长、曲率半径)直观展示不同条件下牛顿环条纹的疏密、明暗变化;扩展为光学元件检测工具,结合图像识别算法,通过牛顿环条纹的畸变程度判断透镜曲率精度、表面平整度;可增加交互功能,支持实时调整参数并刷新图像;针对小步长导致的计算量大问题,引入向量化计算并行计算,或通过降采样平衡分辨率与运行速度。
两段代码实现了牛顿环干涉的精准数值模拟与可视化,MATLAB 版本在工程计算兼容性上更优,Python 版本则胜在跨平台性与简洁的 API;二者均验证了牛顿环干涉的物理规律,可作为光学模拟的基础模板,经扩展后能适配教学、工业检测等多场景的应用需求。