MATLAB实现杨氏双缝干涉仿真与可视化

发布时间:2026/9/3 23:23:49
MATLAB实现杨氏双缝干涉仿真与可视化 简介这是一套基于 MATLAB 的杨氏双缝干涉仿真资源适合大学物理、工程光学等课程的教学演示与课后实践。程序通过数值计算两束相干光在观察屏上的叠加光强生成经典的双缝干涉条纹帮助学习者直观地理解光的波动性、干涉条件以及条纹间距与波长、缝间距的关系。资源压缩包共包含 3 个文件其中 2 个为 .m 脚本文件分别负责核心干涉算法与绘图展示另有 1 个 .fig 格式的 GUI 界面文件支持通过滑动条、输入框等控件实时调整参数降低使用门槛整包大小仅 63KB结构简洁便于阅读和二次修改。已有 2032 人学习使用。学习本资源不仅可以掌握菲涅尔积分或叠加原理实现光强分布计算的方法还能学习 MATLAB 的矩阵运算、绘图函数与简单 GUI 设计技巧同时通过改变入射波长、双缝间距等参数直观探索干涉条纹的动态变化适合作为光学仿真方向的第一份实战练习。 杨氏双缝干涉这名字学过光学的人都不陌生但真实遇到的问题往往是课本上的条纹照片看了一百遍公式里的ΔxλL/d背得滚瓜烂熟可真让自己推一遍屏上的光强分布很多人脑子里还是空的。我当初做这个MATLAB仿真就是想把这个“空”填上——把屏上一万个点的光强逐个算出来然后看着条纹从数据里长出来。说白了这个项目就是用MATLAB把双缝干涉的强度分布可视化出来代码不长但涉及meshgrid网格化、强度公式计算、图像绘制和物理验证是一条完整的数值仿真链路。无论你是在学光学的大学生还是刚接触MATLAB想找个练手案例的初学者这套流程都可以直接照着实操跑通之后你会对干涉条纹的产生机制有非常具体的理解。1. 先想清楚这个仿真到底做什么1.1 物理模型怎么选双缝干涉的装置很经典一束相干光打在开有两个窄缝的挡板上两个缝相当于两个次波源发出的光在后面的屏幕上叠加。屏幕上某一点的光强取决于两列光到达该点的相位差相位差又由光程差决定。所以仿真的核心就是把这条因果链完整算一遍。开始写代码之前一定要想明白你要算的是屏上每个像素点的光强而不是“缝上的光”或者“整个屏幕的亮度”。很多人一上来就找现成工具箱其实对这个问题来说一个强度公式加一张坐标网格就够了。为什么因为双缝干涉的强度分布有解析解只要把屏上点的坐标代入光程差公式再代入强度公式逐点算出来就行。用MATLAB做这件事非常合适矩阵运算天然支持逐点计算imagesc和surf这类绘图函数又自带色标和三维视角省去了用底层语言写渲染的功夫。1.2 为什么选MATLAB而不是别的软件有的同学会问Multisim不是也能仿真吗那是电路方向的工具做不了波动光场叠加。还有人问要不要装MATLAB的光学工具箱如果你的版本里有Optics Toolbox可以用它做光束传播、透镜系统这类更复杂的仿真但双缝干涉这种教科书级的问题基础函数就够用。实际写代码时只用得到linspace、meshgrid、cos、imagesc这几个最常见的函数所以哪怕你装的是学生版或者试用版一样可以跟做。选择MATLAB还有一个实际原因量纲和变量定义非常直观。你可以在代码里直接写lambda 632.8e-9语义清清楚楚不会像某些专业仿真软件那样被单位换算折磨。我身边的同学也试过用Python做同样的事NumPy加Matplotlib确实也能实现但在交互式调参和矩阵可视化方面MATLAB的体验更顺手imagesc和surf这类函数在颜色映射和坐标处理上封装得很完善写起来代码量更少。当然如果你以后要转向机器学习之类的方向Python的优势更大那是后话。1.3 仿真目标提前定好动手之前把目标拆成三条第一画出一维强度分布曲线能看到明暗交替第二画出二维干涉条纹图能看清条纹的形状和方向第三验证条纹间距公式ΔxλL/d。三条都做到项目就算完成。拆目标的好处是代码写到哪一步、参数该调什么心里都有数不会做着做着迷失方向。目标定好之后我的实际建议是先花十分钟把公式写在纸上把每个变量的量纲理清再开编辑器。不要一边查公式一边写代码那样容易把近似条件用错后面排查起来更痛苦。2. 核心公式从物理到代码2.1 光程差决定明暗条纹屏上任取一点P它到两缝的距离r1和r2一般不相等它们之间的差值就是光程差δ。在屏距离D远大于缝距d时可以近似成δd·sinθ角度很小时继续做近轴近似sinθ约等于x/D于是δ≈d·x/D。这个近似是整个仿真里最容易忽略但又最重要的一个环节因为后面所有相位计算都建立在它的基础上。屏幕范围只取几十毫米时这个近似的误差完全可以忽略但如果你把观察范围扩大到一米级别就要换更精确的公式了这部分在第5节会讲。明纹条件是δmλ暗纹条件是δ(m0.5)λm是整数m0对应中央明纹。换算成相位差就是Δφ2πδ/λ。看到这个关系就知道仿真的时候只需要把光程差算出来再转成相位最后求余弦平方条纹就出来了。2.2 强度分布公式怎么用两列光到达P点时如果振幅相同合振幅可以写成2A0·cos(Δφ/2)的形式于是光强I4I0·cos²(π·d·x/(λ·D))其中I0是单缝单独到达屏上时的光强。这个式子就是整个仿真最核心的一行代码。要注意余弦平方的取值范围是0到1所以强度分布天然就是暗纹全黑、亮纹高亮的形态对比度很高不需要额外做图像增强。实际写代码时通常把4I0归一化成1只保留cos²项这样颜色条上的值直接对应相对光强后面验证条纹间距也更方便。如果屏幕范围加大或者缝宽不能忽略那还要再乘一个单缝衍射因子这部分放到第4节再展开。2.3 怎么把连续公式离散到网格MATLAB没办法对连续函数做直接计算只能把屏幕区域网格化。做法是先用linspace生成一维坐标再用meshgrid扩展到二维N 2000; % 每方向采样点数 L 0.02; % 观察范围半宽单位米 x linspace(-L, L, N); y linspace(-L, L, N); [X, Y] meshgrid(x, y);meshgrid生成两个N×N矩阵X代表屏上每一点的横向坐标Y代表纵向坐标。为什么要取2000个点因为条纹间距大概在毫米量级20毫米范围里必须有足够多的采样才能把条纹轮廓画清楚点数太少会出现阶梯状条纹点数太多又会让surf渲染卡顿。2000对大多数机器来说是一个速度和精度都合适的值。3. 从零写仿真关键代码和参数3.1 定义基本参数所有物理量一律用国际单位后面计算光程差就不会出现单位换算错误。推荐一组参数lambda 632.8e-9; % 氦氖激光波长约632.8nm d 2e-3; % 双缝间距 2mm D 1.5; % 缝到屏距离 1.5m L 0.02; % 观察范围 ±20mm N 2000;这里为什么用氦氖激光因为632.8nm是最常见的单色光源算出来的条纹间距在毫米量级肉眼观察和图像呈现都很合适。如果你一开始就用白光LED每个波长都有自己的条纹叠加之后颜色和清晰度都会变复杂初学阶段不建议从中性光开始。3.2 计算光强分布直接套公式代码非常短[X, Y] meshgrid(linspace(-L, L, N), linspace(-L, L, N)); delta d .* X ./ D; % 光程差注意用点乘 phi pi .* delta ./ lambda; % 相位差的一半 I cos(phi).^2; % 归一化光强这段代码里最值得注意的就是点乘。X是2000×2000的矩阵如果写成d*X/DMATLAB会尝试做矩阵乘法直接报维度不匹配。用.*就是逐元素相乘相当于对每一个坐标点单独算光程差。这个细节是MATLAB新手最容易踩的坑我见过不少人在这一步卡得满头大汗。如果想保留两缝叠加的完整强度可以把最后一行的cos(phi).^2改成4*cos(phi).^2图像整体亮度更高但条纹的相对结构完全一样验证公式的时候用归一化版本就够了。3.3 可视化输出一维强度曲线最适合验证物理规律figure; plot(x, I(1000,:), LineWidth, 1.5); % 取中间一行 xlabel(x / m); ylabel(归一化光强); title(一维强度分布曲线);取第1000行就是屏幕中心的水平线画出来是标准的余弦平方周期序列峰值等间距暗纹归零。这里的x数组和I矩阵的行数是对应的因为meshgrid的X在每一行都是从小到大排列的所以取任意一行都只表示一条水平线上的强度分布。二维条纹图用imagesc最省事figure; imagesc(x*1e3, y*1e3, I); axis xy; colormap(gray); xlabel(x / mm); ylabel(y / mm); colorbar; title(杨氏双缝干涉条纹);注意axis xy这一步它把y轴翻转成正常的数学坐标方向否则图像会上下颠倒。colormap(gray)是经典的黑底亮纹想突出细节可以换hot。colorbar会显示光强标尺方便确认条纹的暗亮值确实在0到1之间。如果想看三维效果可以用surffigure; step 50; % 每50个点采一个样避免渲染卡顿 surf(x(1:step:end)*1e3, y(1:step:end)*1e3, I(1:step:end, 1:step:end), EdgeColor, none); colormap(jet); colorbar; xlabel(x / mm); ylabel(y / mm); zlabel(相对光强);默认surf会把网格本文还有配套的精品资源点击获取