
一句话介绍: 这套 MATLAB 光学干涉仿真程序把杨氏双缝、平行平板等倾干涉、楔形平板/牛顿环/球形平板/柱形平板等厚干涉,以及 2~7 束和自定义多光束三维干涉放进同一套 GUI 中;用户修改波长、几何尺寸、折射率、入射角、偏振、相位、光束方向和计算网格后,可以直接观察干涉条纹、光强曲线、条纹间距、对比度以及三维等光强面。
物理光学中的干涉公式并不复杂,真正不直观的是:
参数稍微变化以后,条纹到底会怎样变化?
例如:
双缝距离增大,杨氏条纹会变密还是变疏?
平行平板厚度、折射率和入射角改变后,等倾条纹怎样移动?
空气楔、牛顿环和曲面薄膜为什么会形成完全不同的等厚条纹?
从两束光增加到三束、四束甚至七束光以后,空间光强分布会变成什么样?
如果各束光的传播方向、偏振、初始相位和振幅都可以改变,三维干涉结构又会怎样变化?
当前程序把这些问题统一成一条很清楚的仿真链:
输入波长与结构/光束参数 → 计算光程差或复电场 → 转换为相位关系 → 求空间光强 → 绘制二维条纹/曲线或三维等光强面
因此它并不是只有一张固定干涉图,而是一套可以直接调参数观察变化规律的:
物理光学干涉现象教学与参数实验 GUI。
1. 当前工程里真正包含哪些干涉模块?
主入口是 Start.m。
从这个界面可以进入四条主线:
主模块 | 当前程序中的具体内容 |
|---|---|
杨氏双缝干涉 | 波长、缝屏距离、双缝间距可调,输出条纹、光强分布、条纹间距和对比度 |
等倾干涉 | 平行平板干涉,平板厚度、波长、折射率、入射光强、最大入射角和反射率可调 |
等厚干涉 | 继续分成楔形平板、牛顿环、球形平板、柱形平板四种结构 |
任意光束干涉 | 包含 2~7 光束预设,以及传播方向、偏振、相位、振幅和三维网格均可设置的计算界面 |
对应的核心程序并不是全部挤在一个脚本中,而是采用 GUI 与计算函数分离的方式。
其中最重要的几组文件是:
文件 | 作用 |
|---|---|
Start.m | 总入口和四个干涉模块导航 |
test8.m、call_back8.m | 杨氏双缝 GUI 与计算 |
test1.m、call_back1.m | 平行平板等倾干涉 |
test6.m | 等厚干涉四种结构的选择界面 |
test2.m~test5.m | 四种等厚干涉 GUI |
call_back2.m~call_back5.m | 对应的光程差和光强计算 |
softn.m、three.m | 多光束三维干涉参数界面与核心计算 |
Interplot.m、Interplot1.m | 三维等光强面显示 |
Intensity_two.mat~Intensity_seven.mat | 工程自带的 2~7 光束预计算结果 |
这也是当前工程最明显的特点:
二维经典干涉现象 + 三维多光束空间干涉都包含在同一个项目中。
2. 不同干涉模块背后,其实共用什么计算思路?
虽然双缝、薄膜、牛顿环和多光束看起来差别很大,但前几类经典干涉在程序里都围绕同一个核心关系展开:
光程差 δ → 相位差 Φ → 光强 I
相位差与光程差之间满足:
Φ = 2πδ / λ
其中 λ 是波长。
只要空间位置改变以后两束光的光程差发生变化,相位差就会跟着变化,于是出现明暗相间的干涉条纹。
程序还统一使用条纹对比度:
K = (Imax - Imin) / (Imax + Imin)
所以二维模块除了画条纹,通常还会进一步给出:
最大光强;最小光强;条纹对比度;部分模型中的条纹间距;
光强随角度、半径或位置的变化曲线。
多光束模块则把这一思路继续扩展为:
先分别建立每束光的复电场,再把所有光束相干叠加,最后求三维空间中的总光强。
3. 杨氏双缝模块怎样从三个参数生成条纹?
杨氏双缝对应 test8.m 和 call_back8.m。
GUI 打开后的主要输入是:
参数 | 初始值 |
|---|---|
入射波长 λ | 632.8 nm |
缝到屏幕距离 D | 3 m |
双缝距离 d | 2 mm |
当前程序并不是直接使用一阶近似求每个位置的相位,而是先计算观察点到两个缝的实际距离:
L₁ = √[(x - d/2)² + D²]
L₂ = √[(x + d/2)² + D²]
再得到:
Φ = 2π(L₂ - L₁) / λ
最终使用:
I = 4cos²(Φ/2)
形成屏幕上的明暗条纹。
另一方面,GUI 单独输出条纹间距:
e = λD / d
按照当前默认值:
λ = 632.8 nm,D = 3 m,d = 2 mm
复算得到:e ≈ 0.9492 mm
也就是说,程序默认参数下相邻条纹的理论间隔约为 0.95 mm。
当前 101 个计算位置覆盖中心两侧约 5 个条纹间距,同时给出二维条纹图和光强随屏幕位置变化的曲线。
理想模型下最大、最小光强接近 4 和 0,因此默认条纹对比度接近:K ≈ 1
这正对应理想等强相干双光束能够形成非常清晰的明暗条纹。
4. 平行平板的等倾干涉为什么会形成环状条纹?
等倾干涉对应 test1.m 和 call_back1.m。
GUI 初始参数包括:
参数 | 初始值 |
|---|---|
平板厚度 | 0.25 mm |
波长 | 632.8 nm |
折射率 n | 1.5 |
入射光强 | 1 |
最大入射角 | 8.59° |
反射率 R | 0.8 |
程序还固定设置:
观察透镜焦距 f = 0.2 m
对于焦平面上的每个位置,程序先由半径 r 得到对应入射倾角关系,再计算平板中的光程差:
δ = 2nh / √(1 + r²/f²)
随后:
Φ = 2πδ / λ
由于同一个半径上的点对应相同倾角,也就对应相同光程差,因此结果自然表现为:
以中心为对称轴的等倾干涉环。
源码内部同时计算了一个包含反射率影响的 B,但当前实际显示的条纹、光强曲线以及对比度使用的是 Ba:
Ba = 4R·Im·sin²(Φ/2)
因此阅读当前结果时应以源码实际绘制的Ba分布为准,而不能把界面直接理解成完整的多光束 Fabry–Pérot 强度计算。
5. “等厚干涉”为什么还要继续分成四种结构?
点击主界面的“等厚干涉”后,test6.m 会继续提供四种模型:
楔形平板 → 牛顿环 → 球形平板 → 柱形平板
它们都属于等厚干涉,是因为条纹位置主要由局部薄膜厚度决定。
区别在于:不同几何表面产生了不同的厚度分布,所以最终条纹形状不同。
当前程序可以概括为:
模型 | 厚度怎样变化 | 主要条纹特征 |
|---|---|---|
楔形平板 | 沿一个方向近似线性变化 | 近似等间距直条纹 |
牛顿环 | 厚度随离中心半径变化 | 同心圆环 |
球形平板 | 二维球面几何形成厚度变化 | 二维曲面干涉分布 |
柱形平板 | 主要沿一个截面方向改变 | 一维方向明显变化的条纹 |
因此这里真正被比较的不是四套完全不同的干涉理论,而是:
同一套薄膜光程差关系,在四种几何厚度函数下会形成什么图案。
6. 楔形平板为什么会出现近似等间距条纹?
楔形平板对应 test2.m 和 call_back2.m。
界面初始输入为:
波长:548 nm;入射光强:1;折射率:1.5;楔角输入:0.5;最小厚度:0。
程序先根据楔角计算相邻条纹的理论间距:
e = λ / (2nα)
再沿楔面建立 101 个位置,利用局部厚度计算:
δ = 2n(h + Hmin) + λ/2
最后得到:
I = 4Im·cos²(Φ/2)
因为理想楔面的厚度基本随位置线性增加,所以满足相同光程差条件的位置也近似等距离排列,于是形成规则直条纹。
这里有一个使用时需要特别注意的源码细节:
界面把楔角标为“角度”,但call_back2.m内部对楔角采用了额外的1000×10⁻⁵/60换算;同时函数返回的e没有再乘 1000,而界面结果旁标注的是 mm。
因此这一模块非常适合观察:
楔角、波长和折射率改变以后条纹疏密怎样变化
但如果要把界面中的条纹间距直接作为严格工程尺寸使用,建议先统一楔角与条纹间距的单位定义。
7. 牛顿环在当前程序里是怎样算出来的?
牛顿环对应 test3.m 和 call_back3.m。
GUI 文本框打开后的主要参数为:
波长:500 nm;最小介质层厚度:5 mm;曲率半径:5 m;介质折射率:1.5。
程序建立一个:
200 × 200的二维网格,x、y 均覆盖约:-5 mm~5 mm
然后根据离中心距离得到球面与平面之间的厚度变化:
h(r) = h₀ + R - √(R² - r²)
对应光程差为:
δ = 2nh(r) + λ/2
再转换成:
I = cos²(Φ/2)
因为 h 只和半径 r 有关,而与圆周方向的位置无关,所以:
相同半径 → 相同厚度 → 相同光程差 → 相同光强
这就是程序最终形成同心环的直接原因。
除了二维牛顿环图,程序还绘制:
光强随条纹半径变化的曲线
因此它不只是看“环长什么样”,还可以直接观察半径方向的周期性明暗变化。
8. 球形平板和柱形平板改变的到底是什么?
test4.m / call_back4.m 模拟球形平板,test5.m / call_back5.m 模拟柱形平板。
两者仍然遵循:
局部厚度 → 光程差 → 相位差 → 光强
真正变化的是局部厚度函数。
球形平板默认采用:
λ = 632.8 nm;n = 1.5;半径 R = 5 mm;最小厚度 Hmin = 5 mm;入射光强 = 1。
程序在二维区域中根据球面几何得到 h,再计算:
δ = 2nh + λ/2
最终形成二维干涉条纹。
柱形平板默认采用:
λ = 632.8 nm;n = 1.5;曲率半径 R = 6 mm;最小厚度 Hmin = 5 mm;入射光强 = 1。
它使用 5000 个位置描述一个截面的曲面高度,并输出条纹图以及光强随中心距离的变化。
简单理解:
球面结构主要表现为二维径向厚度变化,而柱面结构更强调一个截面方向上的曲率变化,所以最终条纹空间形态也不同。
9. 任意光束干涉为什么比前面的模块复杂得多?
前面的双缝和薄膜模块,本质上都是针对特定几何结构直接写出光程差。
softn.m 和 three.m 做的事情不同:
它不再预先规定“必须是双缝”或“必须是某种薄膜”,而是直接从每束光的传播方向、偏振和相位出发,在三维空间中叠加电场。
界面可以输入:
干涉波长;光束数目;Phi;Gamma;与 z 轴夹角;初始相位;
xy 平面投影角;各束光电场强度;三个方向的计算格点数;
三个方向的空间分辨率;三维等光强面的显示阈值。
其中 Phi 和 Gamma 被用于构造每束光的 Jones 偏振矢量。
程序先建立局部偏振矢量,再根据光束方向旋转到统一三维坐标系,因此不仅考虑:光传播方向
还考虑:不同光束之间的偏振关系。
这也是它与前面二维经典实验模块最大的区别。
10. 多光束在三维空间里具体怎样叠加?
对于前 N-1 束光,程序根据与 z 轴夹角和 xy 平面投影角构造传播方向:
kⱼ = [sinθⱼcosφⱼ, sinθⱼsinφⱼ, cosθⱼ]
同时由 Phi、Gamma 构造 Jones 偏振状态,并通过旋转矩阵转换到全局坐标系,得到每束光的偏振矢量 eⱼ。
单束光在空间位置 r 上可以概括为:
Eⱼ(r) = Aⱼeⱼ·exp[-i(2πkⱼ·r/λ + δⱼ)]
然后:
Etotal(r) = ΣⱼEⱼ(r)
总光强取决于总复电场与其共轭的乘积。
当前 three.m 并没有先把所有电场相加再求平方,而是直接使用两层 k/l 循环展开所有光束之间的互相关项。
于是每一个三维格点都需要经历:
遍历全部光束对 → 计算相位 → 计算偏振内积 → 累加光强
如果有 N 束光,一个空间点上的光束组合计算量大致随:N²增加。
再叠加 Nx×Ny×Nz 个三维格点后,计算量自然明显高于前面的二维经典干涉模块。
11. “任意光束”实际上有没有内部约定?
从当前真正被 softn.m 调用的 three.m 来看,程序对最后一束光做了特殊处理:
最后一束光的传播方向固定为 z 轴;
偏振使用 [1, i, 0] 形式的圆偏振中心光束;
前面的 N-1 束光才按用户输入的空间角度和 Jones 参数建立。
因此当前“任意光束干涉”更准确的理解是:
多束可调入射光 + 一束沿 z 轴传播的中心参考光。
另外,源码虽然计算了:del1 = del·π/180
但真正进入复指数计算的仍是原始 del,并没有使用 del1。
这意味着:
当初始相位全部为 0 时没有影响;一旦输入非零初始相位,界面参数的“度/弧度”语义需要先统一。
如果后续希望用它进行严格的非零相位定量实验,这一点值得优先修正。
12. 工程自带的 2~7 光束结果实际是什么规模?
工程不是只留下源码,还附带了 2~7 光束的 .mat 三维结果,可由“示例”菜单直接加载。
读取当前文件得到:
示例 | 三维矩阵规模 | 保存结果实部范围 |
|---|---|---|
双光束 | 41×41×41 | 0.586~3.414 |
三光束 | 41×41×41 | 1.000~4.995 |
四光束 | 21×21×41 | 0.109~8.375 |
五光束 | 21×21×41 | 0.181~9.172 |
六光束 | 21×21×41 | 1.035~19.241 |
七光束 | 21×21×41 | 0.501~18.340 |
这些数据的虚部最大只有约 10⁻¹⁵ 数量级,可以视为浮点计算留下的数值误差,因此保存矩阵实际表现为实数光强场。
这里的强度属于程序内部的相对光强量,并没有经过实验功率、探测器响应等物理标定。
Intensity.mat 还保存了一组 21×21×41 的计算结果,实部约为:0.041~6.575
当用户从任意情况界面重新点击 Run 时,当前结果会继续以变量 mInten 保存到 Intensity.mat。
13. 三维干涉结果为什么显示成“空间结构”而不是普通曲线?
three.m 得到的是一个三维矩阵:mInten(x, y, z)
所以已经不能再像杨氏双缝那样只画一条光强曲线。
当前程序先使用 smooth3 对三维光强数据做平滑,然后根据用户设置的阈值 I 提取:
I(x,y,z) = Ithreshold
对应的空间等值面。
阈值越高,显示的是更高强度区域;
阈值降低,则会包含更多空间区域。
这也是为什么 2~7 光束预设分别使用了不同的显示阈值,例如 3、5、6、11 等,而不是所有结果固定使用同一个值。
14. 这套程序适合用在哪里?
它把杨氏双缝、等倾、等厚和多光束干涉放在同一套程序里,而且波长、几何参数和折射率可以直接修改。
因此非常适合用来回答:
“公式中的某个参数改变以后,条纹实际上会怎么动?”
比只看静态教材图更直观。
杨氏双缝中的 λ、D、d,薄膜干涉中的 n、厚度和曲率半径,都已经开放为 GUI 参数。
因此可以方便地做:
改变一个参数 → 重新计算 → 比较条纹疏密、半径和光强变化
这类数值实验。
任意光束模块进一步考虑了:
光束传播角;xy 投影方向;偏振状态;电场振幅;初始相位;三维计算区域。
它适合用来观察多束相干光叠加后形成的空间周期结构,以及不同光束配置对三维等光强面的影响。
源码把:
光程差法、Jones 偏振描述、复电场叠加和三维等值面显示
都直接写了出来,因此也适合课程设计、物理光学程序实验以及干涉算法的二次开发。
需要说明的是,当前工程属于理想化数值仿真,没有加入实际光源带宽、噪声、像差、探测器响应和实验标定,因此更适合:
教学、离线仿真和方案原理验证
而不是直接作为精密光学测量软件使用。
15. 哪些参数最值得修改?
当前程序中真正值得做对比实验的,是那些会直接改变光程差、相位关系或空间光场结构的参数。
参数 | 当前示例 | 为什么值得改 | 调整后的主要影响 |
|---|---|---|---|
波长 λ | 双缝 632.8 nm;多光束 3.82 μm | 直接进入相位和条纹周期 | 波长增大通常使空间条纹尺度增大 |
双缝 D、d | 3 m、2 mm | 直接控制杨氏条纹间距 | D 增大条纹变疏,d 增大条纹变密 |
薄膜厚度、n、曲率半径 | 各模块不同 | 决定薄膜光程差分布 | 改变条纹位置、半径和疏密 |
多光束方向与偏振参数 | 2~7 束预设 | 决定各束光的空间相位与偏振耦合 | 可明显改变三维干涉结构 |
网格 n、分辨率 s、阈值 I | 常见 20/40 格点、0.5 μm | 控制计算区域、计算量和显示等值面 | 网格加密更细致但计算明显变慢;阈值主要改变显示区域 |
如果做多光束实验,最值得联动修改的是:光束方向 + 偏振 + 相位 + 振幅
因为三维结构来自所有光束的共同相干叠加,而不是由某一个参数单独决定。
16. 怎么运行这套程序?
将压缩包中的 Inerfencece 目录完整保留,并把 MATLAB 当前工作目录切换到该目录。
建议直接运行:Start
主界面出现后即可选择:
杨氏双缝干涉 / 等倾干涉 / 等厚干涉 / 任意光束干涉
杨氏、等倾和各等厚模块中,修改参数后点击 Run 即可重新计算。
等厚干涉会先进入 test6.m 的结构选择页,再进入楔形平板、牛顿环、球形平板或柱形平板。
17. 一句话看懂这个项目
这是一个光学干涉 GUI 仿真系统:主界面同时包含杨氏双缝、平行平板等倾干涉、楔形平板/牛顿环/球形平板/柱形平板等厚干涉和多光束三维干涉;二维模块主要按“几何结构 → 光程差 δ → 相位差 Φ → 光强 I”生成条纹,并可输出对比度和部分模型的条纹间距,其中杨氏双缝在 λ=632.8 nm、D=3 m、d=2 mm 时条纹间距约为 0.9492 mm;多光束模块则利用 Jones 偏振矢量、三维传播方向和复电场相干叠加计算空间光强,工程还自带 2~7 光束三维结果文件,可通过等光强面直接观察空间干涉结构,因此整套程序尤其适合物理光学教学、参数敏感性实验、多光束干涉原理演示和课程设计二次开发。