ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

基于MATLAB的双缝干涉虚拟仿真平台:从建模到测量

基于MATLAB的双缝干涉虚拟仿真平台:从建模到测量 简介基于MATLAB的杨氏双缝干涉实验虚拟仿真平台构建文档面向物理专业学生、高校教师及仿真实验爱好者解决传统光学实验依赖实体设备、难以重复观察干涉现象的问题。文档从双缝干涉理论基础出发围绕实验设计与仿真平台构建展开覆盖光源模型、双缝模型、干涉条纹生成算法、数据采集与可视化以及MATLAB GUI界面设计等关键内容并结合实验结果分析干涉条纹特点、探讨误差来源为课程设计、实验报告和教学演示提供较完整的参考方案。资源为单份docx文档压缩包约106KB正文按章节组织理论推导与模型实现并重便于快速阅读和二次修改。目前已有78人学习下载适合需要搭建虚拟仿真实验、完成MATLAB物理仿真设计或准备相关答辩的读者。1. 从“演示动画”到可测量的MATLAB双缝干涉虚拟仿真平台把一套占地两三米的光学实验台搬进屏幕不是用 MATLAB 画一张静态干涉条纹而是让使用者能调缝宽、调缝距、拖波长并在同一套坐标里接着做测量——这是“MATLAB虚拟仿真平台”与普通演示脚本的分界线。杨氏双缝干涉实验虚拟仿真平台构建要解决三类问题一是把干涉光强的物理模型以可复现方式写进代码二是给出一组交互控件让参数变化立即反映在条纹上三是让仿真数据能支撑“测波长、测缝距”这类实验流程。围绕这个目标我用 MATLAB 把整个闭环拆成四件事标量衍射积分建模、App Designer 交互框架、峰值检测与最小二乘测量、多波长与近场扩展。适合正在做大学物理虚拟仿真实验、光学课程设计或者想把零散脚本整理成可交付平台的工程师参考。2. 双缝干涉光场建模三种路径与MATLAB数值实现2.1 双光束叠加公式在何时失效常见课件里给的是 I 4I0·cos²(πdx/λL)把两条缝当成两个理想点源。这个公式在解释“为什么亮纹强度都一样”时足够但直接拿来做虚拟仿真平台立刻会遇到两个硬伤缝宽 w 根本没有进入公式屏幕上第 6 级亮纹理应是暗的、由单缝衍射包络调制出来的现象完全看不到另外在近场条件下条纹间距和位置会偏离这个远场近似。换句话说点源公式是“讲原理用的”不是“做实验用的”。因此在构建虚拟仿真平台时我一般会走完整标量衍射积分。工程上还有第三条路用菲涅尔衍射的 FFT 实现一次快速傅里叶变换完成从缝平面到观察屏的传播速度快但坐标映射需要额外推导。三种路径各有适用场景快速预览用点源公式教学演示用直接积分批量扫参时用 FFT 版。这里先讲直接积分因为它的每一步物理含义都明确便于和实验现象对照。2.2 基于菲涅尔-基尔霍夫衍射积分的MATLAB代码把每条缝沿横向切成若干子波源对观察屏上每个点做复振幅叠加是最直观的实现方式。核心代码分成三段定义物理参数、构造距离矩阵、叠加求和。lambda 632.8e-9; % 波长He-Ne激光 d 0.5e-3; % 双缝中心距 w 0.08e-3; % 单缝宽度 L 1.0; % 缝到观察屏的距离 N 400; % 两条缝上的子波源总数 M 2001; % 观察屏取样点数 % 两条缝上的子波源坐标左侧缝、右侧缝各占一半 xs [linspace(-d/2 - w/2, -d/2 w/2, N/2), ... linspace( d/2 - w/2, d/2 w/2, N/2)]; xp linspace(-10e-3, 10e-3, M); % 观察屏范围 ±10 mm R sqrt(L^2 (xp(:) - xs(:)).^2); % 距离矩阵M×N % 复振幅叠加省略与距离无关的常数 u sum(exp(1i * 2*pi/lambda * R) ./ R, 1); I abs(u).^2;距离矩阵 R 是 M×N 的双精度数组2001×400 约 6.4 MB完全可控把 M 提到 5000、N 提到 2000 时内存涨到 80 MB仍然可以接受。如果观察屏采样继续加密优先改用 2.1 节说的 FFT 路径。叠加式exp(1i*2*pi/lambda*R)./R中指数项是相位延迟1/R是球面波振幅衰减对仿真精度而言相位项重要得多振幅项在很多简化实现里甚至可以直接省略条纹位置不会受影响。2.3 三个必调的数值参数子波源数、观察屏孔径和坐标单位第一个参数是单条缝上的子波源数量即上面的N/2。设得太少比如每条缝只取 5 个点条纹边缘会出现周期性伪影设到 150300继续加密对曲线形状几乎没有影响。经验下限是“缝宽/子波源数 0.5λ”。第二个参数是观察屏横向范围。默认xp ±10mm能覆盖约 15 条亮纹并且能看到单缝衍射包络的第一个极小约 ±7.9mm 处教学效果最好。如果缝距调到 2mm条纹间距缩小到约 0.32mmM2001 下每条条纹只剩约 60 个采样点应该同步增大 M。第三个参数是坐标单位。仿真计算统一用米绘图时再换算成毫米否则滑块事件和坐标轴刻度会出现 10^-3 级别的数值混乱。下表是这套模型建议的默认值与范围可以直接抄进平台参数面板。参数默认值建议范围说明lambda632.8 nm380780 nm可见光波段白光需做多波长叠加d0.5 mm0.22.0 mm缝距增大条纹变密w0.08 mm0.020.2 mm缝宽增大衍射包络收窄L1.0 m0.53.0 m距离增大条纹变疏N4002001000子波源总数单缝不少于 100M200110018001观察屏采样点数配合条纹周期检查3. 平台框架用 App Designer 搭建可交互的虚拟仿真实验台3.1 为什么交互层选 App Designer而不是继续画脚本图MATLAB 里做交互界面有几条路。传统 GUIDE 已不是新项目的主流选择不推荐再投入uifigure uiaxes的脚本式写法适合快速原型如果目标是交付一个可长期维护的虚拟仿真平台我建议把代码迁入 App Designer。它的优势不在画控件更省事而在于强制把“布局设计”和“回调代码”分开管理。平台核心逻辑与界面解耦后同一个物理计算函数既能被 GUI 回调调用也能被批量扫描脚本调用模型不用为界面改写。要做到这一点最直接的办法是把 2.2 节的计算独立成一个twoSlitIntensity(S)函数S 是参数结构体返回光强数组和坐标数组。界面层只负责把控件值写进 S再把返回值画到坐标轴。3.2 快速原型与正式版架构先跑通最小控件再补回调先给一个不需要创建 .mlapp 文件的快速原型写法。核心是用uifigure创建窗口用uislider绑定参数用ValueChangedFcn触发重算。S.lambda 632.8e-9; S.d 0.5e-3; S.w 0.08e-3; S.L 1.0; fig uifigure(Name, 杨氏双缝干涉虚拟仿真平台); g uigridlayout(fig, [1 2]); ax uiaxes(g); % 左侧绘图区 p uipanel(g, Title, 实验参数); sldD uislider(p, ... Limits, [0.2 2], Value, 0.5, ... ValueChangedFcn, (s,e) applyParam(d, s.Value)); function applyParam(name, valMm) switch name case d S.d valMm * 1e-3; case w S.w valMm * 1e-3; end [I, xp] twoSlitIntensity(S); plot(ax, xp*1e3, I); xlabel(ax, x / mm); ylabel(ax, 相对光强); end滑块事件把毫米读数转成米再调用独立计算函数twoSlitIntensity。把这段逻辑迁入 App Designer 时回调里只需要把ax换成app.UIAxes把S换成app.S核心计算函数一行都不用改。这是“平台”和“脚本”在工程组织上的关键差异。提示ValueChangedFcn在滑块拖动松手时触发ValueChangingFcn在拖动过程中连续触发。初版用前者流畅度不够再换后者并做低频重绘。3.3 参数面板的最小组件清单与数据流设计交付给学生用的平台参数面板至少要有波长、缝距、缝宽、缝屏距离四个滑块另加两个非控件信息区当前仿真参数摘要以及理论条纹间距。理论值可以用文本框实时更新如此操作者调节参数时能立刻看到“理论周期”与“测量结果”的差距。UI组件绑定参数默认值说明波长滑块lambda632.8 nm范围 380780 nm缝距滑块d0.5 mm范围 0.22 mm缝宽滑块w0.08 mm范围 0.020.2 mm缝屏距离滑块L1.0 m范围 0.53 m观察屏范围下拉xRange±10 mm改范围时同步调整采样点数理论条纹间距文本lambda*L/d自动计算与测量值形成对照数据流始终是单向的控件事件 → 更新参数结构体 → 重算光场 → 更新绘图句柄 → 更新理论值文本框。不要在回调里反向修改其它控件的 Value 后又触发重算两层触发会让连续拖动滑块时产生大量冗余计算。若需要手动输入与滑块联动显式调用一次刷新函数即可。4. 实验设计与测量在虚拟平台上测出双缝间距和波长4.1 从光强曲线到峰位置用findpeaks做自动测量虚拟仿真平台的关键价值在于让实验流程在软件里完整走通。把观察屏上的一维光强数组当成探测器的扫描记录接下来就是标准的峰值提取。如果后续要接 CCD 实拍照片把图像按列平均成一条扫描线再交给findpeaks处理即可。% 在扫描数组 I 上找亮纹峰 period S.lambda * S.L / S.d; % 理论条纹周期米 dxp xp(2) - xp(1); % 观察屏采样间隔 minDist max(round(0.5 * period / dxp), 2); % 半周期作为最小峰间距 [peaks, locs] findpeaks(I, ... MinPeakProminence, 0.05*max(I), ... MinPeakDistance, minDist);findpeaks的MinPeakDistance在这里比MinPeakHeight更关键。双缝光场两侧周期性强弱不一固定高度阈值会误删靠近衍射极小处的峰按理论半周期过滤后只有符合物理间距的极大值才会保留。MinPeakProminence用相对值 5%是为了忽略数值噪声产生的伪峰。这一步跑通后把locs对应坐标标记到 UIAxes 上平台就开始像一台自动读数的测长仪。4.2 用polyfit拟合条纹间距再反演波长有了峰位置序列测量条纹间距有两种常用做法逐差法和线性拟合法。逐差法把第 kN 个峰位置减第 k 个能抵消部分系统误差但需要人工选 N更稳的是把峰序号当自变量、峰坐标当因变量做一次线性拟合。if numel(locs) 3 warndlg(亮纹数不足请增大观察屏范围或减小缝距); return; end pFit polyfit(locs, xp(locs), 1); dxMeasured abs(pFit(1)); % 拟合斜率即条纹间距 lambdaMeasured dxMeasured * S.d / S.L;拟合斜率的单位是“米/峰序号”物理含义正是相邻亮纹间距。和只取两个峰做差相比线性拟合使用了全部峰位置信息对单个峰的定位误差有平均作用。已知缝距 d 想测波长直接把S.d代入上式反过来已知波长测缝距时解出d dxMeasured*L/lambda。需要更高精度时可以用fminbnd在 1% 邻域内搜索使预测周期与测量周期残差最小的参数值多参数联合反演时优化工具箱里的lsqnonlin更合适但要注意 λ 与 d 存在简并关系平台里默认固定其中一个。4.3 缝宽和可见度实验中最容易忽略的误差来源测量结果不会总是完美。当缝宽 w 偏大时单缝衍射包络压低了高阶亮纹polyfit仍然能拟合并给出周期但低对比区域的峰位提取会附带亚像素偏差。更直观的表现是可见度下降定义 V(I_max-I_min)/(I_maxI_min)默认参数下第 6 级附近的条纹对比度已经明显低于中心。平台里建议加一个“显示单缝包络”开关把理论包络叠加到双缝条纹上。这样使用者能直观看到“缝宽影响包络、缝距影响周期”两个不同尺度的调制关系。默认参数下第一衍射极小在 ±7.9mm 附近观察屏 ±10mm 刚好能展示包络的第一个零点附近缝距调到 2mm 后条纹数翻倍读数精度会受采样密度限制应同步上调 M。现象主要原因应对方式高阶条纹对比度下降单缝衍射包络叠加包络曲线解释现象峰位定位偏差采样过粗或峰太平提高 M按半周期设置 MinPeakDistance拟合斜率不稳定有效峰数太少放大观察屏范围或减小 d5. 进阶多波长叠加、近场与FFT加速的取舍5.1 多波长与白光给平台加一挡“彩色实验”实验室里常见的白光光源并不是单一波长。把 2.2 节的主函数包进循环按高斯权重对可见光离散取样就能近似模拟连续谱。lamList 450:20:650; % 每隔20nm取一个波长 weight exp(-((lamList - 550)/120).^2); % 相对强度权重 Iwhite zeros(size(xp)); for k 1:numel(lamList) Iwhite Iwhite weight(k) * ... twoSlitIntensity(lamList(k)*1e-9, S.d, S.w, S.L, N, M); end Iwhite Iwhite / max(Iwhite);零级条纹在各波长下位置相同中心呈白色向两侧走波长越短条纹间距越小错位逐渐累积形成内紫外红的彩色边缘。这个模式下缝距不要设太大否则各波长条纹错位过快可辨别的彩色级数会明显减少。5.2 近场与远场循环积分照样能算但FFT更适合扫参减小缝屏距离 L2.2 节的积分代码并不需要修改因为距离矩阵使用完整勾股距离而非旁轴近似。当 L 降到 0.1m 以下观察屏图案从等距直条纹逐渐过渡循环积分的结果与近场衍射照片趋势一致。代价是观察屏范围必须加大M 增加后循环速度明显下降此时改用菲涅尔传递函数法的 FFT 实现。N2 2^14; dx1 1e-5; x1 (-N2/2:N2/2-1) * dx1; u1 zeros(size(x1)); u1(abs(x1 d/2) w/2) 1; u1(abs(x1 - d/2) w/2) 1; fx (-N2/2:N2/2-1) / (N2*dx1); H exp(-1i * pi * lambda * L * fx.^2); u2 ifftshift(ifft(fftshift(fft(u1)) .* H)); dx2 lambda * L / (N2 * dx1); % 观察屏采样间隔 x2 (-N2/2:N2/2-1) * dx2; I2 abs(u2).^2;注意FFT 版的传递函数符号约定在不同教材里可能相反首次使用务必与循环积分版输出对照。FFT 版的观察屏采样间隔由 N、dx1、lambda、L 唯一决定不能像循环版那样自由指定范围需要先算坐标再裁切显示。把峰值测量封装成 UIAxes 的ButtonDownFcn回调点击条纹中心自动记录坐标平台就从“能看”变成“能测”剩下的就是采集多组条纹间距做线性回归的事了。本文还有配套的精品资源点击获取
返回列表