简介:应用光学上机实验报告面向高校光学、光电信息相关课程学生及需要补强光学设计实操的学习者,围绕Zemax透镜设计与tfcalc光学薄膜分析两条主线整理实验记录。内容涵盖F/4、焦距100mm、BK7玻璃透镜的波长与孔径设置、曲率半径和厚度调整,以及光学特性曲线、光程差曲线、点列图和OPD图等性能评价结果与简单优化思路;薄膜部分记录TIO2/SIO2多层膜设计及400—700nm高透、700—1200nm偏反射的光谱分析结论。压缩包共1个doc文件,约695KB,以文档形式集中呈现实验目的、过程、结果与图示,结构按实验任务展开,便于直接查阅和对照关键参数。已有596人学习,适合用作课程报告参考、实验复盘及光学设计入门阶段的案例材料。
1. 应用光学上机实验:为什么一行曲率半径就能决定成像好坏
把一片 BK7 玻璃放进光路,只改一行曲率半径,点列图里的弥散斑会立刻放大或缩小。这种看起来很符合直觉的现象,背后其实是一套相当讲原理的因果链:孔径定下了光线能走多宽,曲率定下了光线往哪折,色散定下了不同波长折得是否一致,最后所有误差在像面上汇总成一个斑。应用光学上机实验之所以值得认真琢磨,不是因为要跑一遍软件按钮,而是因为它把「光学设计」这件事压缩成了几个可验证的量:F 数、焦距、波长权重、曲率半径、厚度。搞懂这五个量怎么互相牵制,再看 Zemax 里那些曲线就不会觉得像在解读无法理解的数据,看 tfcalc 的六层膜系也不会觉得只是照着设置操作。既能建立几何光学的底层直觉,也能看到真实设计里为什么处处是取舍。
2. 从 F/4 到 25mm 孔径:光学系统的参数为什么互相矛盾
2.1 F 数与焦距:一个除法背后的光通量权衡
先把最容易被背下来、却最少被想透的公式讲清楚:F 数等于焦距除以入瞳直径。实验里要求 F/4、焦距 100mm,于是入瞳直径被锁在 25mm。这一步在软件里体现为在孔径设置里填一个数,但它同时关掉了三条后路。
F 数小意味着相对孔径大,收集的光多、照度好,代价是同样角度的光线在像面上落得更散,与像差相关的项大致随孔径的高次幂增长。这就是为什么手机镜头标称 F/1.8 却要塞六七片镜片;也是为什么同样焦距下,把 F/4 改成 F/2,像质通常会让设计者付出明显代价。
焦距则决定像高与视场的关系。轴上视场只有一条光线束,所以实验只做轴上可见光谱范围是有道理的:轴上系统没有视场带来的不对称像差,可以把注意力集中在球差与色差上。这也是上机实验选这个题目的用意:变量少,因果链清晰。
| 参数 | 实验取值 | 由谁决定 | 直接后果 |
|---|---|---|---|
| 焦距 | 100mm | 设计目标 | 决定像高与系统长度 |
| F 数 | 4 | 设计目标 | 决定入瞳直径与像差量级 |
| 入瞳直径 | 25mm | 焦距 / F 数 | 决定边缘光线高度 |
| 材料 | BK7 | 成本与透过率 | 决定色散与折射率 |
| 波长 | 486 / 587 / 656nm | 可见光谱采样 | 决定色差评估基准 |
2.2 为什么非要三档波长:色差不是「模糊一点」那么简单
把波长设成 486nm、587nm、656nm 三档,并把权重都设为 1.0,这个操作常被当成软件流程的一步。实际上这是在对色差做离散采样:587nm 附近接近人眼最敏感的谱段,通常当作主波长;486nm 与 656nm 分别落在蓝端与红端,把折射率差异拉到的范围内。
BK7 的折射率随波长单调下降,蓝光折得更狠,红光折得更轻。于是同一片透镜对三个波长的焦距并不相同,这就是轴向色差;放大率也不同,这是垂轴色差。软件里那张多色光焦点漂移图,画的就是不同波长焦点位置沿轴的位置差。如果只看单一波长,系统可能看起来很好,一换上白光立刻变糊;三档波长就是把这种隐藏差异暴露出来。
权重的意义也得说清。权重不是「这条波长更重要所以画得更粗」,而是参与 merit function 求值的加权系数。三条波长权重都是 1.0,意味着优化时三者被同等对待,不会为了蓝端的表现牺牲红端。实际操作中如果某个谱段是应用重点,把它权重抬高是常见做法,但抬高就意味着别处让步,这就是优化里的第一次取舍。
2.3 表面序列:0 面到 IMA 的数据结构到底存了什么
Zemax 的镜头数据编辑器本质上是一张按面排列的表,每行存一组参数:面型、曲率半径、厚度、材料、半口径。第 0 面是物面,第 1 面是光阑面也就是孔径所在处,第 2 面是透镜后表面,第 3 面标作 IMA 即像面。
厚度这一列容易误解。它记录的不是「这个面到下一个面之间有多厚」,但方向要从当前面往后数:第 1 面填 4mm,意思是光阑面到后表面之间 4mm,这就是透镜中心厚度;第 2 面填 100mm,意思是后表面到像面 100mm,这是后截距。前表面半径 100、后表面半径 -100 这样的符号约定也不是随意定的:符号跟随光线传播方向,凸向入射光的面为正。半径正负搞反,光线立刻往反方向折,点列图会明显歪掉。
这套数据结构的设计动机很朴素:把连续的光学系统拆成有限个折射面和传播段,每段用解析公式算,就能用矩阵连乘把整条光路算完。近轴近似下每个面就是一个 2×2 矩阵,这就是为什么 Zemax 能对几百个面做实时追迹——它算的不是「光」,是一串矩阵。
3. 光线追迹的机制:从曲率半径到点列图的因果链
3.1 近轴矩阵与真实追迹的分界
理解软件输出,需要分清两层计算。近轴层用 y-nu 追迹,把每个面当作薄矩阵处理,速度快、可用于初步求解;真实层用斯涅尔定律逐面算折射方向,能捕捉球差等近轴层看不见的效应。
薄透镜的屈光度近似为 (n-1)(1/R1 - 1/R2)。把 R1=100、R2=-100、n≈1.5168 代进去,能估出焦距量级;这个式子在小孔径下很准,孔径一大就开始偏,因为实际入射角不再小,sinθ≈θ 的近似失效。这正是 F/4 比 F/8 难做的根源:不是公式错了,是近似不成立了。
软件里看到的光线特性曲线图,横轴通常是归一化孔径或视场,纵轴是光线在像面上的高度偏差。曲线弯曲程度直接反映球差:边缘光线与近轴光线不交于同一点,曲线端部下垂。实验里出现「纠正离焦后」的第二张曲线图,说明第一版结果的主要矛盾是离焦而非高阶像差——把像面位置调对,曲线立刻从一边倒变成对称的 S 形或近似平直。
3.2 用代码看清一次近轴追迹在算什么
把矩阵追迹写成几行 python,比看图更能建立直觉。下面这段只做近轴近似,用来验证数量级,不替代真实追迹。
# 近轴 y-nu 追迹:验证 100mm 焦距的合理量级 n_glass = 1.5168 # BK7 在 587nm 附近的折射率 R1, R2 = 100.0, -100.0 # 前后面曲率半径,单位 mm t = 4.0 # 中心厚度 mm # 单面折射矩阵:[[1, 0], [-(n2-n1)/R/n2, n1/n2]] def refract(n1, n2, R): return [[1.0, 0.0], [-(n2 - n1) / R / n2, n1 / n2]] # 传播矩阵:[[1, d], [0, 1]] def transfer(d): return [[1.0, d], [0.0, 1.0]] def mat_mul(A, B): return [[sum(A[i][k] * B[k][j] for k in range(2)) for j in range(2)] for i in range(2)] M = mat_mul(refract(1.0, n_glass, R1), transfer(t)) M = mat_mul(M, refract(n_glass, 1.0, R2)) # 平行入射(y=1, nu=0)时,-1/M[1][0] 即后焦距 bfl = -1.0 / M[1][0] print(f"估计后焦距: {bfl:.2f} mm")矩阵乘法顺序是从左到右对应光的传播方向,每一步用 2×2 矩阵作用在 [y, nu] 向量上,y 是光线高度、nu 是 n 乘角度。这里 M[1][0] 是复合矩阵的出射角度对入射高度的响应,取其负倒数就得到后焦距估计值。算出来大约在九十多毫米,与设计要求的 100mm 有偏差,偏差的成因正是近轴近似与真实球面折射的差别,也是后面需要优化的部分。参数怎么改很直观:把 R1 或 R2 调大,屈光度下降、焦距变长;把厚度加大,后焦距随之改变。这些正是软件里手动调参数时看的量。
3.3 点列图与 OPD:两个不同视角的像质评价
点列图是把成像光束按一定分布打到像面上,画出每个视场、每个波长落点云团的散布范围。它直观,回答的是「光斑有多大」。OPD 图画的则是波前与理想球面波的偏差,回答的是「相位差多少波长」。两者不同视角看同一件事:弥散斑小不代表波前好,一个接近衍射极限的系统,点列图可能已经缩到接近艾里斑,此时 OPD 才是瓶颈。
实验里同时给出这两个图,用意是把「几何像差」和「波前误差」两条判据都过一遍。实践中的血泪经验是:只盯点列图的 RMS 半径去优化,容易得到一个几何上看着漂亮、实际对比度上不去的系统,因为能量分布集中在中心不代表能分辨细节。
4. 薄膜的另一种堆叠:六层高低折射率交替如何塑造透反比
4.1 四分之一波长法则与膜系结构
任务二的结构写得很清楚:SIO2、TIO2 交替六层,底层与顶层都是低折射率材料。这类高低折射率交替堆叠的设计出发点,是四分之一波长法则:当每层光学厚度为设计波长的四分之一时,各界面反射光相干叠加,方向一致时增强反射,方向相反时相互抵消。
高低折射率交替的效果随层数按几何级数走。单层膜只能做到中等的增透或增反,层数越多,反射带越宽、带内反射率越接近 1。六层膜意味着大约六个界面参与相干,用 SiO2 的低折射率与 TiO2 的高折射率组合,反射带可以做得相当扎实。
| 层 | 材料 | 折射率量级 | 角色 |
|---|---|---|---|
| 1 | SiO2 | 约 1.46 | 低折射率,调整相位 |
| 2 | TiO2 | 约 2.3 | 高折射率,主反射贡献 |
| 3 | SiO2 | 约 1.46 | 相位匹配 |
| 4 | TiO2 | 约 2.3 | 主反射贡献 |
| 5 | SiO2 | 约 1.46 | 相位匹配 |
| 6 | TiO2 | 约 2.3 | 顶层,与空气交界 |
需要留个意识:材料折射率是随波长变化的,上面给的是量级,实际计算必须用色散模型。软件里选材料而不是直接填折射率,原因就在这里——它内部带着一条 n(λ) 曲线,而不是一个常数。
4.2 反射与透射为什么是同一件事的两面
实验中分别设置「反射」与「透射」得到两张曲线,看到的结果互为镜像:400-700nm 透射率在 90%-100%,700-1200nm 透射率下降、反射上升。有人会以为这是两次独立实验,其实在无吸收介质里,R + T = 1,测一个就等于知道另一个。分开看只是为了让趋势更直观。
这就引出一个值得琢磨的设计点:曲线在 700nm 附近出现转折,剃刀边缘式的切换,说明这是典型的短波通滤光片思路——可见光段放行,近红外段拦下。这类膜系在成像系统里有实际意义:传感器对近红外仍有响应,不滤掉会让色彩偏掉。六层交替恰好能在这个带宽内做出足够陡的过渡。
曲线转折的陡峭程度取决于层数与折射率比。折射率差越大,单对膜层的反射带宽越宽,达到同样过渡陡度需要的层数越少。TiO2 与 SiO2 的折射率比接近 1.6,是个折中的选择:比它更极端的材料组合能省层数,但材料更贵、工艺更难沉积控制。
4.3 膜层的设计变量与优化空间
膜系设计真正的自由度不只是层数,还有每层的光学厚度。六层就有六个厚度可调,再加上材料选择与层序,构成一个高维空间。常见的思路是先按四分之一波长法则给出一组初始值,得到一条大致能用的曲线,再让优化算法微调厚度,把通带压平、把过渡带做陡。
这段思路写成伪代码就是这样:
# 膜系评价的骨架思路(示意,不含具体色散数据) layers = [("SiO2", 0.25), ("TiO2", 0.25), ("SiO2", 0.25), ("TiO2", 0.25), ("SiO2", 0.25), ("TiO2", 0.25)] # 光学厚度以设计波长计 target = {"pass": (400, 700), "stop": (700, 1200)} # 通带与阻带范围 def evaluate(layers, wavelengths): """对每个波长累计各层相位,得到反射/透射谱""" result = {} for wl in wavelengths: phase = 0.0 for mat, ot in layers: n = n_of(mat, wl) # 材料色散由模型给出 phase += 4 * 3.14159 * n * ot / wl # 往返相位,注意随波长变化 result[wl] = amp_from_phase(phase) # 相干求和得到幅值 return result def merit(spectrum, target): """通带内偏离高透射、阻带内偏离高反射,都要罚""" penalty = 0.0 for wl, t in spectrum.items(): if target["pass"][0] <= wl <= target["pass"][1]: penalty += (1.0 - t) ** 2 # 通带不够透,罚 else: penalty += t ** 2 # 阻带还在透,罚 return penalty关键在相位那一行:每层积累的相位与折射率、厚度成正比,与波长成反比,所以同一组厚度在不同波长下贡献完全不同的相干条件,这正是膜系曲线会随波长变化起伏的根源。merit 函数的设计才是真功夫——通带和阻带的权重怎么分配、边缘要不要单独加罚项,直接决定优化出来的是陡但带纹波的曲线,还是平缓但干净的曲线。
5. 避坑与排查:上机实验里最容易翻车的几处
5.1 曲率半径符号搞反,光线朝反方向折
现象是点列图完全散开,光线特性曲线呈夸张的单调发散,怎么优化都收不回来。原因在于面型符号约定:凸向入射光的半径为正,曲面球心在光线来向一侧则为负。前后表面写成 100 与 100 而非 100 与 -100,等效于把双凸变成了弯月甚至平凹。解决办法是开局先确认光传播方向,再定符号,改完立刻看二维布局图,布局图里光线走势不对,后面的一切输出都不用看。
5.2 厚度列填成了绝对坐标
现象是系统总长明显不对,或者后截距与预期差几十毫米。原因是厚度这一列是相对量,表示从当前面到下一面的间隔,不是每个面到原点的距离。有人把「第 2 面厚度 100」理解成第 2 面在 100mm 处,于是把第 1 面的 4mm 也照此填,系统就错了。解决办法是逐面画一张表格核对:光阑面 4mm 到后表面,后表面 100mm 到像面,总和与设计长度对得上才算填对。
5.3 只优化不设边界,元件厚度被优化成负数
现象是优化跑完,评价函数确实下降了,但布局图里镜片已经自交或变成负厚度。原因是纯数学优化器不知道物理约束,只要 merit function 能降,它不介意把几何关系推到无法实现的程度。解决办法是给厚度、曲率半径、空气间隔加边界约束,把物理上不可能的区域排除在搜索空间外,再让它自由优化。
5.4 波长权重全是默认值,色差被平均掉
现象是优化后单色表现不错,换成多色光就明显带色边。原因是三条波长权重相等且没有针对性,优化器在几个方向上取折中,谁也没被真正照顾。解决办法是先确认应用谱段,把重点波长权重提高,或者用轴向色差、垂轴色差作为独立的操作数去约束,而不是指望一组通用评价函数自动搞定。
5.5 薄膜材料直接填折射率常数
现象是仿真曲线做得很漂亮,实测光谱与仿真对不上,尤其在带宽边缘差得离谱。原因是把随波长变化的折射率当成了常数,相位计算从根上就偏了。解决办法是统一用材料的色散模型,仿真与实测对比时先核对材料数据来源是否一致,别拿一套材料的曲线去解释另一套材料做的样品。
6. 设计取舍的思考:两套软件背后是同一套取舍逻辑
把 Zemax 与 tfcalc 放在一起看,会发现它们在解两个表面上完全不同的问题,方法论却高度一致:都是在一个高维参数空间里,用有限的评价函数去逼近一个目标,都得在物理可实现性与数学最优之间划线。
Zemax 的取舍落在几何与像差上。F/4 与 100mm 一旦定下,孔径的光通量收益与球差的代价就同时被锁死,设计者能动的只剩曲率、厚度、材料与面型。优化器可以给出一个 RMS 半径很小的解,但它不判断这个解是否镀得出来、装得进去。所以真实的流程从来不是「点优化、看结果、收工」,而是先设约束再优化,把不可实现的区域提前排除。
tfcalc 的取舍落在层数与工艺上。六层膜能做出 400-700nm 高透、700-1200nm 高反的曲线,但层数越多,每层的厚度控制误差累积越明显,应力也越大。理论曲线 99% 的反射率,落到样品上可能只有 95%,差的这部分不来自公式,来自沉积均匀性与材料实际折射率与模型的偏离。设计时留一点余量,比把曲线压到理论极限更实用。
验证方法上,两个实验其实各给了一条自检路径。几何这边,先用近轴矩阵估焦,再用真实追迹看偏差,偏差的量级说明像差严重程度;薄膜这边,先按四分之一波长法则估中心波长与带宽,再看仿真曲线是否落在预期范围内,偏离太多就说明某层的相位假设有问题。这两条路径的共同点是:先用手算给出一个可被质疑的预测,再用软件输出验证,而不是反过来。
我自己的习惯是从那次把后表面半径符号写反、盯着点列图调了半天才发现问题之后养成的:任何光学参数表在交给软件之前,先在纸上把符号约定、单位、相对量还是绝对量这三件事逐一核对一遍,哪怕只有四个面。这套笨办法救过很多次时间。希望帮到你。
本文还有配套的精品资源,点击获取