简介面向光学工程、物理光学及光电信息专业学生与研究者的光学仿真资源基于Matlab环境模拟多光束干涉过程重点考察不同反射率对透射光条纹强度分布曲线的影响并复现物理光学教材中的图4.3。仿真中可设定波长、入射角、折射率与反射率等参数借助菲涅尔公式计算各光束反射与透射叠加得到复合光场后生成条纹图像直观展示明暗、间距和相位随反射率的变化资源压缩包共4个文件约77KB含Matlab仿真脚本、干涉条纹结果图、分析文档及说明文本脚本负责仿真与绘图图片呈现条纹形态文档解读强度分布与间距变化说明便于快速运行。已有1596人学习下载。学习者可借此掌握多光束干涉数值模拟的基本流程理解反射率与透射光强分布的关系并可修改脚本参数进一步探索多层薄膜、非均匀介质等复杂干涉场景对光学系统设计与科研复现均有实用价值。1. 多光束干涉的透射光条纹为什么反射率越高峰值越窄却不下落光学仿真里用 Matlab 复现多光束干涉的透射光条纹强度分布曲线看起来是个“套公式就能画”的活给定反射率画爱里函数收工。但只要把曲线画出来再和物理光学教材上的图4.3对一下就会看到两个反直觉的事实反射率从0.04升到0.98透射条纹的半高宽度缩到原来的几十分之一峰值透射率却始终贴着1不放谷底从0.85一路跌到万分之一量级。这不是数值错误而是多光束干涉区别于双光束干涉的本质腔内无限次往返的透射光按等比级数相干叠加反射率决定级数高阶项的权重从而决定条纹的锐化程度。搞懂这条曲线背后的机制后面做标准具、干涉滤光片或激光腔镜参数设计时都能直接迁移。2. 从双光束到无穷级数爱里函数怎么把反射率锻造成条纹锐度2.1 平行板内的多次往返你不该只留两束光多光束干涉发生在两个平行部分反射面之间最常见的载体是一块平行平板或者一个法布里-珀罗腔。一束光从左侧射入第一个界面立刻被分成透射和反射两路。透射光走到第二个界面又分成出射光和反射光这束反射光回到第一个界面再反射回腔内然后再到第二个界面。这个过程每循环一次出射光的振幅都被两个界面的反射过程衰减一次同时也多积累一个相位变化。所谓“多光束”指的就是这样一串在时间上错开、在空间上同向出射的透射光束序列。相邻两束透射光的相位差是δ 4πnh cosθ / λ其中 h 是腔长n 是腔内介质折射率θ 是腔内的传播角度λ 是波长。垂直入射时 cosθ1δ4πnh/λ。设第一界面到腔内的振幅透射系数为 t1第二界面出射的振幅透射系数为 t2界面振幅反射系数为 r强度反射率为 Rr²那么第 m1 束透射光的复振幅就是E_m E_i t1 t2 (r² e^{iδ})^m把 0 到无穷项全部加起来得到一个等比级数E_t E_i t1 t2 / (1 - r² e^{iδ})等比级数的公比是 r²e^{iδ}只要 |r²|1 就收敛这在物理上永远成立。这里的关键是只取前两项就是双光束干涉近似。R0.04 时第三束光的振幅权重只有 r⁴0.0016忽略它看不出差异可当 R0.9 时公比 r²0.81级数要加到七八项才收敛到稳定值。所以反射率不只是“被反射多少能量”它还决定了必须叠加多少束光才能描述稳态。这也是图4.3里 R0.9 的曲线形态和 R0.04 截然不同的根源。还有一层物理前提值得点破这串透射光要完成相干叠加光源的相干长度必须远大于往返光程差的若干倍。否则第 m 束和第 m1 束之间的相位差失去确定性级数退化成非相干强度求和透射率变成常数条纹直接消失。这也是普通白光很难看到清晰多光束条纹的原因。仿真里默认光源完全相干爱里函数已经内置了“相位确定”这个前提如果求复振幅时把振幅和相位拆开各自相加再取模就破坏了相干条件画出来的曲线自然不对。2.2 爱里函数透射率如何从余弦型变成针状对总场取模平方得到透射强度与入射强度之比I_t / I_0 T² / (1 R² - 2R cosδ)在无吸收对称界面下 T1-R。利用 cosδ1-2sin²(δ/2)分母变成 (1-R)²4R sin²(δ/2)于是I_t / I_0 1 / (1 F sin²(δ/2))这就是爱里函数Airy function其中F 4R / (1-R)²称为强度系数。注意它只依赖两个无量纲参数反射率 R 和相位差 δ所以 Matlab 仿真不需要真正建模电磁波在介质中的传播只需要把 F 算出来再把 δ 作为横轴。看 F 随 R 的增长速度R0.04 时 F≈0.17R0.5 时 F8R0.9 时 F360R0.98 时 F≈9800。F 的物理含义是“相位稍微偏离共振点时透射率掉多快”。在峰值附近写 δ2mπε则 sin(δ/2)≈ε/2透射率近似为I_t/I_0 ≈ 1 / (1 F·ε²/4)这是一个中心对称的洛伦兹线型半宽由 F 决定。R 越大sin² 项前面的系数越大同样的相位偏离被放大得越狠条纹就越窄。低反射率时 F 很小分母展开 1/(1F sin²)≈1-F sin²退化成余弦型的双光束干涉峰值不尖锐谷值也降不到 0。这里最反直觉的一点是R0.98 意味着界面把 98% 的能量反射回去可透射峰值依然等于 1。稳态解释是在共振相位上腔内各次往返光同相叠加腔内场强被极大增强透射出的能量与入射能量守恒所以峰值不下降。牺牲掉的是偏离共振时的透过能力谷值降到 1/(1F)≈1.02×10⁻⁴。能量从“宽平带”被压缩成“窄峰”总量不变。2.3 精细度和半高宽把“条纹锐度”量化到能验证的数值透射条纹的周期在相位域里是 2π。条纹锐度通常用精细度Finesse刻画ℱ π√F / 2 π√R / (1-R)精细度的直观含义是在一个自由光谱范围内能塞下多少条等宽度峰值条纹也可以理解为半高宽占周期的倒数。R0.9 时 ℱ≈29.8R0.98 时 ℱ≈155.5相差约 5 倍。半高宽FWHM可以精确推导。令透射率等于 1/2解得 sin²(δ_FWHM/2)1/F于是FWHM_δ 4 arcsin(1/√F)这个精确式要求 F≥1。当 F 很大时 arcsin(1/√F)≈1/√F才退化为教材里常见的近似式 FWHM_δ≈4/√F。对应数值R0.5 时 FWHM≈0.460πR0.9 时≈0.067πR0.98 时≈0.0129π。注意 R0.04 时 F0.171透射率最小也有 0.85根本探不到半高所以“半高宽”对这条曲线不存在。这一点在仿真自检时经常被人忽略避坑章节会专门讲。这些量化数字就是图4.3“不同反射率下透射光条纹强度分布曲线”横纵坐标之外最关键的信息曲线形状不是随便画出来的每一个 R 都对应一组可核验的谷值、半高宽和精细度。接下来用 Matlab 把它复现出来并处理几个容易翻车的数值细节。3. Matlab 复现图4.3参数映射、向量化计算与半高宽自检3.1 把物理参数映射成绘图参数复现图4.3不需要建立电场传播模型爱里函数已经把电磁学吸收进 F 和 δ 两个变量。要做的只剩三件事选反射率 R选相位差 δ 的取值范围选横纵轴的归一化方式。横轴建议用 δ/π 而不是 δ。理由有两个爱里函数周期是 2π横轴用 δ/π 时周期恰好是 2峰值落在整数点上肉眼核对“是否每个整数峰值都出现”非常方便另外 δ4πnhcosθ/λ 与频率相关一个相位周期对应一个自由光谱范围FSR用 δ/π 画图时 FSR 在横轴上固定占 2 个单位和 R 无关。反射率我建议用一组有层次的值0.04、0.5、0.9、0.98。0.04 接近普通玻璃单面反射率属于“多光束效应几乎看不出来”的下限0.5 说明中等反射率下条纹已经明显收窄0.9 和 0.98 展示高反射率区域的针状条纹。如果只画高反射率会错过从余弦型向针状演变的完整过程。相位差范围取 0 到 4π即横轴 0 到 4覆盖两条完整透射峰第一条在 δ/π0第二条在 δ/π2。取两条条纹足够看清不同 R 的对比同时能检查周期性和边界连续性。若要从抽象 δ 回到真实器件比如腔长 h1mm、n1、λ633nm垂直入射时 δ4πnh/λ≈1.98×10⁴π这时候不是从 0 开始扫而是在某个中心 δ₀ 附近扫描很小的 Δδ横轴应当写 (δ-δ₀)/π。教材画的是一个周期内的相对相位工程仿真关心的是某个绝对相位附近的微小变化这两者在网格构造上完全不同。3.2 向量化计算的核心代码直接在 Matlab 里逐点计算并绘图% 多光束干涉透射强度不同反射率下的爱里函数曲线 deltaOverPi 0:0.001:4; % 横轴归一化为 δ/π峰值落在整数网格点上 delta pi * deltaOverPi; R_list [0.04, 0.5, 0.9, 0.98]; lineSpec {-, --, -., :}; It zeros(numel(R_list), numel(delta)); for k 1:numel(R_list) R R_list(k); F 4*R/(1-R)^2; % 强度系数 FR 越接近 1 增长越快 It(k,:) 1 ./ (1 F * sin(delta/2).^2); % 点运算逐点求透射率 end figure(Color,w); hold on; for k 1:numel(R_list) plot(deltaOverPi, It(k,:), lineSpec{k}, LineWidth, 1.5); end grid on; box on; xlabel(\delta / \pi); ylabel(I_t / I_0); labels arrayfun((r) sprintf(R%.2f, r), R_list, UniformOutput, false); legend(labels, Location, north); axis([0 4 0 1]);这段代码里最容易出问题的是两处。第一deltaOverPi 用 0:0.001:4 构造步长 0.001π 意味着 δ/π 精确经过 0、1、2、3、4 这些整数峰值点一定在网格里。如果改用 linspace(0, 4*pi, 4001)虽然点数一样但浮点除法可能让峰值点偏离网格。第二表达式里用的是 sin² 形式而不是 (1R²-2Rcosδ) 形式。在 R 接近 1 时δ 趋向 2mπcos 形式的分母是两个几乎相等的两项在做减法会损失有效数字而 sin² 形式中 (1-R)² 是常数4Rsin²(δ/2) 在峰值附近是一个非常小的正项没有灾难性相消。这是数值稳定性层面的选择不是公式等价性的让步。3.3 用半高宽和谷值做自检别只“看形状”画出来之后我习惯立刻跑一段量化自检因为肉眼判断“曲线变尖了”太主观而且仿真里最容易出现的错误就是“峰值高度被网格漏掉”。下面这段代码在循环里输出峰、谷和半高宽fwhmPi nan(1, numel(R_list)); for k 1:numel(R_list) I It(k,:); R R_list(k); F 4*R/(1-R)^2; [peak(k), idxPeak] max(I); % 理想情况 peak 1 valley(k) min(I); % 理想情况 valley 1/(1F) half peak(k)/2; if valley(k) half fwhmPi(k) NaN; % 低反射率谷值高于半高无半高宽 else right idxPeak find(I(idxPeak1:end) half, 1, first); fwhmPi(k) 2 * (deltaOverPi(right) - deltaOverPi(idxPeak)); end fprintf(R%.2f peak%.6f valley%.6f FWHM%.5f pi\n, ... R, peak(k), valley(k), fwhmPi(k)); end这段自检的逻辑是峰值应该在 δ/π0、2、4 处第一个峰值一定在第一个网格点因为 δ0 是扫描起点。右侧找到第一次降到半高的点因为关于峰值左右对称把右侧横轴差乘 2 就是半高宽。如果 valley 大于 half说明曲线整条都高于半高半高宽在物理上不存在直接置 NaN。这种“不存在”和“计算报错”是两回事自检脚本必须区分。跑完后你会看到一组漂亮的自洽数字R0.5 时 FWHM≈0.460πR0.9 时≈0.067πR0.98 时≈0.013π和 2.3 节的精确式几乎一致。若发现不一致优先怀疑网格步长、峰值索引位置、半高判定方向而不是公式本身。4. 多光束干涉仿真的常见排查峰值掉落、谷底抖动、半高宽对不上的根因4.1 现象峰值强度掉到 1 以下有次仿真取 R0.9最大透射率只有 0.87怎么调反射率都到不了 1。原因是透射峰只在 δ 为 2π 整数倍时出现而 sin(δ/2) 在该点精确为零。如果网格用 linspace(0, 4*pi, N)N 再大也很难保证 π 的整数倍恰好落在采样点上峰值就被两侧网格点的平均值“削平”。R 越大峰越窄被削得越狠。解决方法是让横轴直接按 π 的整数倍构造比如 deltaOverPi 0:0.001:4峰值精确位于网格点并把 max(It) 是否等于 1 作为断言。另一个隐蔽来源是角度制把 δ 以度为单位直接喂给 sin峰值位置完全错乱曲线形态看似正常但数值毫无意义。仿真里相位统一用弧度这是第一优先级。4.2 现象高反射率曲线在谷底出现锯齿毛刺R0.98 时透射率曲线在峰谷附近出现锯齿数量级在 10⁻³重新计算公式也复现。原因是用了等价形式 T²/(1R²-2Rcosδ)。当 δ 接近 2mπ 时分母中 1R² 与 2Rcosδ 两个接近相等的大数相减只剩几个有效位结果被双精度的舍入噪声污染也就是数值分析里的灾难性相消。公式等价数值不等价。解决方法是统一写成 1/(1F·sin²(δ/2))把减法换成加法。如果必须保留 cos 形式就把 cosδ 按 1-2sin²(δ/2) 展开同样能避免相消。这类问题在高反射率下格外明显因为谷底本身是 10⁻⁴ 到 10⁻⁵ 量级噪声完全遮蔽真实值。4.3 现象R0.04 的曲线看起来像直线完全没有条纹画出来在 0.85 到 1 之间缓缓起伏放大看才看出是波整体好像“没干涉”。原因是 R0.04 时 F≈0.17透射率在 1 和 1/(1F)≈0.85 之间波动对比度只有约 8%。在 0 到 1 的纵轴上这条曲线被压缩在最顶上视觉上接近直线。这是物理事实不是 bug多光束干涉在低反射率下退化到双光束干涉条纹本来就浅。解决方法是把纵轴局部放大到 0.8 到 1或者在图上同时画 R0.9 和 R0.98 两条曲线用动态范围衬托低 R 曲线的“平”。更彻底的做法是画反射率曲线 1-It因为无吸收时 ItIr1低 R 曲线的反射暗纹会比透射亮纹更直观。4.4 现象半高宽和公式对不上甚至算出荒谬结果有次用 FWHM≈4/√F 估算 R0.04 的半高宽得到 9.6 弧度比一个周期还长。原因是这个近似隐含 F≫1 的前提。R0.04 时 F0.171曲线谷值 0.85 高于半高 0.5物理上不存在半高宽强行代入近似公式得到的只是无意义数字。即使 F1近似公式也有误差R0.5 时精确值 0.460π 和近似值 0.450π 相差约 2%R0.9 时两者几乎重合。解决方法是先判断 1/√F 是否小于 1小于才计算半高半高宽用精确式 FWHM4arcsin(1/√F)。同时检查网格分辨率如果峰宽只占两三个采样点数值半高宽会比理论值偏大很多因为离散化把半高“拉平”了。网格步长至少应该小于半高宽的十分之一。4.5 现象扫描范围不对条纹数比预想少只扫 0 到 2π发现透射峰在端点被截断或者条纹数看起来和书上对不上。原因是爱里函数周期是 2π 相位差但横轴如果用 δ/π 归一化0 到 2π 实际上只覆盖了“峰到峰”的一个周期端点既是起点峰也是终点峰如果直接把 δ 当横轴周期是 6.28 而不是 2两者混用会让比例失真。解决方法是统一以 δ/π 为横轴至少画 0 到 4确保看到两条完整峰和它们之间的谷。如果想表达“一个自由光谱范围”就画 0 到 2但要明确峰值落在端点是被周期截断不是异常。5. 透射峰值、吸收损耗与采样代价复现曲线时绕不开的取舍到这里图4.3已经能精确复现但你会问高反射率条纹这么漂亮为什么实际器件不把 R 推无限高答案藏在理想假设里。上面的推导假设界面无吸收R 和 T 满足 T1-R所以无论 R 多高透射峰值都是 1。真实膜层有吸收和散射损耗设单次往返的总强度损耗为 A则 T1-R-A。重新推导后峰值透射率的近似形式为T_peak ≈ (1 - A/(1-R))²损耗对高反射率的惩罚极为残酷。A0.5% 时R0.5 的峰值透射率约 0.98R0.9 约 0.90R0.98 只有约 0.56R0.99 仅剩约 0.25。没有损耗假设支撑盲目堆反射率只会得到又窄又暗的条纹。这就是标准具和干涉滤光片存在“最佳反射率”的根源半高宽推着 R 往上走透射率拉着 R 往回撤。仿真要预测真实器件就得把 A 加进模型而不是死守理想爱里函数。采样上也有类似取舍。细网格能忠实描绘针状峰但 0 到 4π 的均匀网格要跑到几十万点绘图文件变大交互变卡。常见的做法是粗扫定峰、峰附近局部加密更稳的做法是先用半高宽公式反推网格上限步长至少小于 FWHM 的十分之一再决定总点数。这个习惯救过我很多次——有次复现一条窄带滤光片的透射曲线4001 点画出来光滑得很可峰值附近只有两个点半高宽偏差 20%拿去拟合参数立刻翻车。从那以后每次做多光束干涉仿真我都强制自己走一遍同样的流程先用粗扫描定位峰值和谷值判断该 R 下是否存在半高宽再按精确公式反推网格步长最后核对峰值精确等于 1、谷值等于 1/(1F)。这套流程把“肉眼觉得对”和“数值经得起拷问”之间的缝隙填上了。希望帮到你。本文还有配套的精品资源点击获取