news 2026/9/16 23:58:32

Zemax双胶合透镜优化实战:从单透镜到评价函数与玻璃替换

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Zemax双胶合透镜优化实战:从单透镜到评价函数与玻璃替换

Zemax装好之后,新建一个系统、加几个面、设个波长当然不难,真正的分水岭在“优化”这一步。上一篇基础操作我已经把界面、光线追迹和像差概念理了一遍,这一篇直接进入正题:用单透镜和双胶合透镜把优化的整套流程走通。单透镜是理解“自由度”的极简模型,而双胶合透镜是第一次真正用到“材料组合”来校正像差,这两个案例吃透之后,后面再看三片式、望远镜、目镜系统,你会觉得套路都差不多。

这篇文章适合两类人:一类是刚学完Zemax基本操作、还没搞懂评价函数和优化器在干嘛的初学者;另一类是已经能跑优化,但总感觉结果不可控、动不动就跑出奇怪形状的进阶用户。我会把评价函数设置、变量选择、优化算法切换、玻璃替换这些关键环节全部拆开讲,用的都是Zemax经典界面下的操作路径,版本差异不大,18版以后基本通用。

1. 单透镜优化:只有一个曲率半径能动,怎么把像质压下去

单透镜是整个光学设计里最容易被低估的东西。它结构最简单,但优化逻辑恰恰是后面所有复杂系统的基础。很多人上来就把两个曲率半径全部设为变量,点一下优化,发现结果变化不大,然后就开始怀疑软件有问题。其实不是软件的问题,是你没搞清楚单透镜到底有几个有效自由度。

1.1 先把评价函数立起来

单透镜的优化流程和复杂镜头没有本质区别,第一步永远是设置系统,第二步永远是评价函数。系统设置里有一个容易被忽略的点:光阑位置。单透镜做轴上成像时,如果光阑离透镜很远,视场光线会打得很偏,产生大量彗差和像散,但如果你只是练手做轴上点,建议把光阑直接设在透镜前表面或者紧贴透镜,这样主要像差就是球差,优化过程非常干净。

评价函数要从“默认评价函数”开始。路径是:Editor → Merit Function Editor,在编辑器的空白区域右键,选择Insert Default Merit Function。这里有几个选项需要重点讲一下:

  • Optimization Function:选RMS(均方根)还是PTW(峰谷值)。我的习惯是初期一律用RMS,因为RMS对整体像差的统计性更好,优化过程稳定;PTW只盯最大误差点,容易把优化带偏。
  • Data:选Spot Radius(点列图半径)还是Wavefront(波前)。我建议第一次做Zemax优化的朋友直接选Spot Radius,直观,而且在像差比较大的时候,波前误差会出现相位卷绕,优化器反而不好处理。
  • Pupil Integration:选Gaussian Quadrature,然后设置Rings和Arms。默认给的3环6臂能用,但如果你要更精确地压制球差这种轴对称像差,我会把Rings加到6,Arms加到8。注意,环数越多,评价函数里光线数量越多,优化速度会变慢,单透镜无所谓,到了复杂系统要平衡一下。

评价函数生成之后,里面会有一堆操作数,主要结构是:一个权重操作数、若干光线追迹操作数(比如TRAC、REAY这类)、以及一个评价函数值操作数。初学者看到这一大堆数字很容易慌,其实你不用管细节,只需要知道一个核心逻辑:评价函数的值越小,像质越好。优化前看一眼右下角或者评价函数顶部显示的Merit Function值,记下来,优化完对比用。

1.2 看清单透镜的极限在哪

接下来设变量。单透镜的典型结构是:面1曲率半径、面2曲率半径、厚度、后焦距。我的建议是第一次优化只把面1和面2的曲率半径设为变量,具体操作是双击面1的曲率半径单元格,在弹出的属性里把Solves改为Variable,或者直接按快捷键Ctrl+Z。Zemax里变量列会变成V,一眼就能看到。

厚度先不设为变量,是因为单透镜的厚度对像差的贡献远没有曲率半径大,它更多影响的是透镜口径和中心厚度是否合理。如果你一开始就把厚度扔进变量池,优化器很可能会为了补偿边缘光线高度把厚度压到1mm以下,加工出来脆得一碰就碎。后焦距可以设为变量,但要小心:如果评价函数里没有控制焦距的操作数,优化器会通过疯狂拉长或压缩后焦距来“作弊”,造成点列图看起来好了,但实际焦距根本不是你要的值。

在Zemax里约束焦距最常用的操作数是EFFL。你可以在评价函数编辑器里插入一行:EFFL,Target填50(假设你要做50mm焦距),Weight填1或者更大。注意,权重不是越大越好,过大之后优化器会优先满足焦距而牺牲像质。一般把焦距权重设在1~10之间,和默认像差操作数的权重量级匹配就行。

跑一轮Local Optimization(点击Optimize按钮,选择Local Optimization),你会发现单透镜的RMS确实能降下去一点,但很快卡住。原因很简单:单透镜两个曲率半径的自由度,本质上只够确定一个“弯曲量”和一个“焦距”。换句话说,当你把焦距固定后,其实只剩一个弯曲量能用来优化球差,这个量再怎么调,也只在某一弯曲形态下达到最优,和“完美”差得远。更关键的是,单透镜的色差是由材料本身决定的,两个曲率半径完全管不到色差。所以单透镜的归宿永远是“勉强能用”,当你发现点列图上红绿蓝三个波长的光斑错开一个明显的距离,那就是色差在提示你:该上双胶合了。

2. 双胶合透镜优化:第一次用两种玻璃互相“补课”

双胶合透镜是经典光学系统里最常见的起始结构。它的最大功劳不是把球差压得更好,而是同时搞定球差和色差这两件单透镜搞不定的事。原因不复杂:一个正透镜加一个负透镜,正透镜产生的色差是正的,负透镜产生的色差是负的,选对阿贝数组合,两种色差直接抵消,而光焦度因为正负相加仍可以保持为正。这就是双胶合最核心的“消色差条件”。

2.1 双胶合消色差的底层逻辑

在Zemax里做双胶合优化之前,先把理论公式过一遍,这样你在输入初始结构的时候心里才不虚。假设两个透镜的光焦度分别是φa和φb,阿贝数分别是Va和Vb,总光焦度φ=φa+φb。要同时满足总光焦度要求和色差为零,可以用这两个式子近似解出光焦度分配:

  • φa = φ × Va / (Va - Vb)
  • φb = -φ × Vb / (Va - Vb)

我实际算一个例子。假设总焦距50mm,正透镜用BK7(阿贝数约64.2),负透镜用F2(阿贝数约36.4),那么Va减Vb大约是27.8。算出来,正透镜的光焦度大约是总光焦度的2.3倍,负透镜的光焦度大约是总光焦度的负1.3倍。转换成焦距,正透镜焦距大约21.7mm,负透镜焦距大约-38.5mm。这个结果说明一个规律:双胶合里正透镜承担的光焦度明显高于系统总光焦度,负透镜则是“帮倒忙”再拉回来。这也是为什么胶合透镜对玻璃折射率、面型加工误差都比较敏感。

这个公式只给出光焦度分配,不给出具体半径。从光焦度换算到半径,就得依赖薄透镜公式:φ=(n-1)(c1-c2),其中c1、c2是两个面的曲率。设计者可以手动按薄透镜公式算出第一组半径,也可以直接拍一个经验值再让Zemax去优化。我自己的习惯是:初始半径不用太精细,只要光焦度符号对,数量级对,优化器都能救回来,真正决定成败的是后续的变量顺序和评价函数。

2.2 初始结构从哪来

实际操作时,双胶合初始结构有三个常用来源。第一个是手算,按上面的公式解光焦度,再用薄透镜公式转换成半径。第二个是找现成专利或者Zemax示例文件,改口径和焦距。第三个是用Zemax里的焦距缩放工具:直接在系统孔径和后焦距上做Scale,再到评价函数里用EFFL把焦距约束到目标值。

我需要提醒一点:手算初值的时候,胶合面半径不要算成完全相等的正负关系,也就是说正透镜后表面和负透镜前表面虽然胶合在一起,半径数值是一样的,但两个面在系统里其实是同一个面。在Zemax建模时,通常是三条面记录:正透镜前表面、胶合面(正透镜后表面同时也是负透镜前表面)、负透镜后表面。中间那个面的厚度设为两块玻璃之间的胶合厚度,一般就是0。这一点很多人第一次会弄错:在表面上输了两遍半径,做成两个空气间隙的透镜,那就不是胶合透镜了。

选玻璃也值得多说一句。理论上只要Va和Vb差得够大,色差校正能力就强,这也是火石玻璃和冕牌玻璃组合流行的原因。但实际选择要看可见光还是红外、成本、加工性。可见光谱段里BK7配F2、BK7配SF2、H-K9L配ZF系列都是常见组合。Zemax的玻璃库里有大量Schott、CDGM、Ohara等厂家牌号,但新手一开始不要被玻璃库的丰富程度迷惑,先固定用一两对最常见的组合,把优化流程走通,再谈玻璃替换。

2.3 变量、评价函数和优化器怎么组合

双胶合在Zemax里的建模大概是这样的:入瞳光阑面、正透镜前表面、胶合面、负透镜后表面、像面。波长建议设三条,比如F(486.1nm)、d(587.6nm)、C(656.3nm),这样才能在评价函数里体现色差。视场的话,做一个简单的轴上练习可以只设0视场,但这样测不出彗差和场曲,不太完整。我建议至少设置三个视场,比如0、0.7倍、1倍,也就是0、1.06°、1.5°这样的分布。

变量设置的顺序比我一开始想象的重要得多。第一次优化,曲率半径全部设为变量,后焦距设为变量,厚度暂时锁住。跑完看RMS是否还有明显色差结构,如果有,说明光焦度分配还不对,这时候可以做两件事:一是手动微调某个半径的初始值,二是让玻璃进入优化。

玻璃进入优化有两种方式。一种是把玻璃的折射率nd和阿贝数vd直接设为变量,让局部优化器去“连续化”地调,但这样得到的玻璃参数往往落到玻璃库之外,只能作为参考,不能直接加工。更实用的方式是Zemax自带的玻璃替换工具:Tools → Optimization → Glass Substitution。它会在你指定的候选玻璃库里穷举可能的替换,然后用替换后的结构重新优化。跑完之后会给出一个替换列表,按优化后的评价函数值排序。这个工具太适合双胶合了,因为候选玻璃就那么几片,穷举速度极快。

优化算法方面,我建议双胶合先用Local Optimization跑几轮,等评价函数值稳定了,再切换到Hammer Optimization(锤形优化)继续压。锤形优化的特点是允许接受一些暂时变差的解,用来跳出局部极小值,对双胶合这种变量少、评价函数曲面相对简单的问题非常有效,几秒钟就能跑很多次迭代。但注意,锤形优化不是万能的,如果评价函数里没有正确的约束,它很可能给你找到一片厚度为负的“纸片”,所以约束不能省。

3. 评价函数里的门道:操作数、权重和算法的配合

Zemax的优化本质上是在做一件事:调整你设为变量的参数,让评价函数里的加权残差平方和最小。评价函数不是越小越好,而是在你关心的指标上小,在你不关心的指标上无所谓。所以评价函数的构造就是你作为设计者的“价值观”。

3.1 操作数选择与权重技巧

默认评价函数生成之后,一般会在文件头部加一个权重操作数,相当于是总开关。后面跟着大量光线追迹操作数,比如REAY负责某一视线在某一面上的Y坐标,TRAC负责某条光线的追迹数据。你需要自己追加的操作数通常包括这么几类:

  • 焦距类:EFFL、EFLX、EFLY。用来钉死有效焦距。
  • 总长类:TTHI、OPLT、OPGT。用来限制系统总长或者某一段空气间隔。
  • 畸变类:DIMX。控制视场畸变百分比,双胶合阶段可以不用管,但如果你做广角系统就一定要加。
  • 像差系数类:SPHA、COMA、ASTI。直接约束赛德尔像差系数,适合做“针对某项像差”的教学实验。
  • 色差类:AXCL、LCHC。轴向色差和横向色差,双胶合优化很值得把AXCL放进评价函数。

权重怎么给才合理?我的经验是:约束焦距的一两个操作数,权重给到1到10就足够了;如果是公差类约束,比如总长上限,权重可以给到100以上,因为这类硬约束一旦违反,系统很难实际可用。千万不要每个操作数都给100,那会直接把默认像差优化的效果冲掉。一个相对稳妥的流程是:先不加任何额外约束,跑一遍默认评价函数的优化,看清系统自然收敛到什么状态;然后把焦距约束加上去再跑一遍,观察评价函数值增大了多少;如果增大太多,再考虑要不要换玻璃,或者调整初始弯曲量。

实际操作里,我会在评价函数编辑器里用Control+Insert插入一行,然后在Type列输入操作数名,Target列输入目标值,Weight列输入权重。Zemax对操作数名称的联想支持做得不错,输入前几个字母会弹出候选列表,这对不常背操作数名的用户非常友好。但也要知道,有些老版本里插入操作数需要手动把求解类型从“Min”改成“Target”,否则优化器只会做单边约束,这里容易出“看似设了目标实际没生效”的坑。

3.2 局部优化、锤形优化、玻璃替换的执行顺序

执行优化的顺序可以总结成一句话:先局部,再锤形,最后玻璃替换。从局部优化开始的原因是,局部优化最快,能迅速告诉你当前初始结构的“局部潜力”到底有多大。如果局部优化只跑了几步就收敛,说明初始结构离最优解不远;如果跑了很多步还在慢慢爬,说明局部极值点离你很远,这时候再用锤形优化去大范围搜索。

锤形优化在Zemax里的按钮位置和局部优化相邻,点开之后会弹出一个界面,上面有一些选项。我一般把Maximum Number of Cycles设成几千,实际上由于变量少,它很快就能跑完。跑锤形的时候,画面会不停刷新,评价函数值持续往下掉,这个过程相当解压,但你要把注意力放在结果合理性上:打开2D Layout看看,镜片是不是变成了一片“新月形”,中心厚度是不是为负,光线是不是在某两个面之间来回反射。优化器不会替你判断结构是否可加工,所有工程约束都必须你自己想办法加到评价函数里。

玻璃替换一定要放在最后。原因很明显:玻璃一旦换掉,折射率和阿贝数同时变化,相当于重新开始一次优化,如果前面结构没收敛好,替换之后会一团乱麻。玻璃替换工具的用法是:先把你要换的那块玻璃设为变量(在玻璃型号那一列双击,选择Variable),然后打开玻璃替换窗口,指定候选玻璃库范围和替换后要执行的优化轮数。Zemax会对每个候选玻璃做一轮局部优化,再把结果排序。我通常会选择前三个结果,复制出三个新文件,再分别跑一遍锤形优化,最后看哪个组合同时满足像质和加工性。

4. 实操案例:做一个焦距50mm、F/5的双胶合透镜

空谈太多不如直接走一遍完整流程。下面这个案例是我带初学者必做的“牛刀小试”,所有参数都可以复现,你跟着做一遍就知道整个优化链路长什么样了。

4.1 设置系统参数

打开Zemax,新建一个空白系统。系统孔径选“Entrance Pupil Diameter”(入瞳直径),填10mm,这样F数就是50/10=5。波长在System Options(或者Wavelength标签页)里选F、d、C三条可见光波长,权重默认1比1比1。视场类型选Angle,设置三个视场:0度、1.06度、1.5度。1.5度的全视场对应像高大约1.3mm,虽然不大,但足够让优化器感受到“离轴像差”的存在。

在面设置界面把光阑面(STO)放在最前面,后面依次是:表面1(正透镜前表面)、表面2(胶合面)、表面3(负透镜后表面)、表面4(像面)。注意,Zemax里物体面和光阑面可以重合,STO面本身可以设成厚度0,这样入瞳就直接落在第一块透镜的前表面上,实际系统里很多镜头也会这样设计。

4.2 输入初始结构

按前面公式计算,BK7正透镜焦距约21.7mm,F2负透镜焦距约-38.5mm。取BK7折射率1.517,F2折射率1.620。为了省掉复杂的符号推导,初始半径我给一组凑好的值:正透镜前表面半径22mm,胶合面半径-18mm,负透镜后表面半径-48mm。这三个半径的光焦度分配是“正-负-小负”,色差方向大致正确,剩下交给优化器。

厚度方面,正透镜中心厚度3mm,负透镜中心厚度2mm,胶合面厚度0mm。后焦距先填40mm,但要在评价函数里把这个位置设为变量,因为优化过程中像面一定会移动。初始2D图出来之后,看一眼光路有没有明显穿帮,边缘光线有没有在某个面之前就聚焦。这一步虽然粗糙,但能避免很多后期调试。

4.3 两轮优化与结果判读

打开评价函数编辑器,插入默认评价函数:RMS Spot Radius、Gaussian Quadrature、Rings=6、Arms=8。然后在评价函数末尾插入一行EFFL,Target=50,Weight=5。把三个曲率半径和像面厚度设为变量,局部优化跑一轮。初始Merit Function值不用紧张,几十甚至上百都正常,跑完之后看看RMS半径能不能压到100μm以内。

第一次到这一步,点列图通常会有明显改善,但红蓝光斑还是分开的。这时候打开Longitudinal Aberration(轴向像差图),看纵轴上有没有典型“S形曲线”,色差会呈现出不同波长曲线在近轴区域的分离。这说明光焦度分配还需要细调,进入第二轮:把三个曲率半径继续当变量,把两块玻璃的厚度也设为变量,但分别设置最小厚度2mm和最大厚度8mm,防止优化器做出不切实际的薄片。这一步跑锤形优化,一般跑几百个周期就够了,评价函数值会再往下掉一截。

最后做玻璃替换。我用Schott玻璃库,把BK7替换候选换成N-BK7、H-K9L、N-SK16这样低色散的,把F2的候选换成N-SF5、N-F2、SF2这样高色散的。替换之后跑一轮局部优化,你会看到评价函数值可能又降一点,这时候看最终点列图,三个波长的光斑基本重合,RMS半径如果到20μm以下,对F/5的系统来说已经不错了。再顺手看一眼MTF曲线,如果截止频率30线对处的MTF还在0.3以上,这个双胶合设计就拿得出手了。

5. 常见问题与排查技巧实录

优化不收敛、结果奇怪、玻璃替换无效,这些问题我几乎每隔几天就会在初学者群里看到一次。下面按概率从高到低整理,方便你直接对照排查。

5.1 优化不收敛和光线出界

最典型的现象是点列图突然炸开,光线在某一面之后完全散掉。这通常不是算法问题,而是你在评价函数里没有限制“光线必须按预定路线穿过镜片”。优化器很“功利”,它只关心评价函数数值,如果某个变量调整让边缘光线打到镜筒上,而你没设置遮挡,它就会一路狂奔,最后得到一套完全不可用的结构。

解决办法有两个。第一个是把每个面都设置合理的半口径(Semi-Diameter),Zemax默认是“自动”,这个选项会让口径跟随光线自动变化,可能掩盖边缘光线出界。你可以在每个面的口径属性里改成固定值或者“Solve To Marginal Ray”,然后放大一点余量。第二个办法是在评价函数里加入边缘光线的高度约束,比如用操作数REAY控制边缘光线在某个面上的Y坐标不小于某个正数,保障通光孔径不悬空。

还有一个很常见的坑:系统焦距没有约束好。局部优化跑完,点列图看起来不错,但一查EFFL变了,比如你明明要做50mm焦距,结果优化成48.7mm。原因通常就是EFFL操作数没有插入,或者插入后权重被设成了0。这个概率比我预想的要高很多。

5.2 玻璃、色差与工具使用

色差没消干净的情况,我总结下来有三个原因:一是玻璃组合阿贝数差不够大,光焦度分配算出来是“弱消色差”的,色差压不下去;二是评价函数里根本没人管色差,Spot Radius这个指标虽然间接包含色差,但权重分散,效果不如直接在评价函数里加一个AXCL操作数,Target=0,Weight设为0.5到1,让优化器专门去压轴向色差;三是波长权重设置有问题,三条波长如果权重不均,优化器会优先保证权重最高的波长,另外两个波长就“放飞”了。

玻璃替换工具用的时候有一个细节:候选玻璃库选得太大,工具会跑很久,而且经常推荐出一些价格离谱或加工困难的玻璃。我一般会先按折射率区间(比如1.5到1.8)和阿贝数区间(比如25到65)过滤一遍,再把厂家限定在1到2家。如果是教学练手,只选Schott的BK系列和SF系列就够了。另外,替换完成之后,务必再跑一轮锤形优化,因为玻璃替换工具自身只做局部优化,找到的未必是新玻璃组合下的最优结构。

5.3 写在最后的一点经验

做了这些年光学设计,我用Zemax优化过的系统从单片透镜到十片以上的鱼眼镜头都有,回头看,单透镜和双胶合这一关过得是否扎实,直接决定了后面能不能理解“自由度”这个概念。很多人一上来就想用全局优化去找结构,结果找出来的东西既不能加工又看不懂原理,就是因为缺少“把每个自由度意义搞清楚”的训练。

我自己的习惯是先固定玻璃,只优化曲率,看像差类型怎么变化;再把厚度放开,看像差和总长怎么平衡;最后才做玻璃替换。每放开一个自由度,都要打开点列图和轴向像差图,观察它到底改变了什么。这样做虽然慢,但你对系统的理解会深很多,而不是像黑盒一样乱撞。再补一句,优化过程中记得随时保存副本,特别是锤形优化之前一定要存一版,锤形优化虽然大概率更好,但偶尔也会把你原来一个挺不错的结构带偏,留个后手总没错。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/16 23:58:26

AI对话公式表格导入Word教程:从HTML粘贴到Pandoc的完整方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/16 23:56:47

Flutter与OpenHarmony混合开发实践:逆向思维训练App

1. 项目背景与核心思路作为一名长期在跨平台开发领域实践的工程师,最近我在探索如何将Flutter框架与OpenHarmony操作系统进行深度整合。这个"逆向思维训练App学习日历"的项目,正是基于Flutter的跨平台能力和OpenHarmony的分布式特性构建的混合…

作者头像 李华
网站建设 2026/9/16 23:56:37

DESTOON 7.0整站部署实战:从PHP环境到B2B业务上线

简介:这套DESTOON7.0整站源码定位于B2B在线交易平台建设,面向需要搭建企业信息展示、商品供求与批发商对接场景的开发者、站长及企业建站人员。源码内置多用户角色、供求信息发布、商品分类搜索、购物车订单、在线支付、会员中心等模块,同时支…

作者头像 李华
网站建设 2026/9/16 23:55:14

基于MATLAB的大坝洪水应急调度建模与闸门优化仿真

简介:一份围绕洪水大坝应急响应的数学建模资料包,面向正在准备数学建模竞赛、课程设计或水利应急相关课题的本科生与研究者。资源以水力学、概率统计和优化理论为背景,针对洪水来临前的大坝安全评估、风险分析和紧急疏散路径规划问题&#xf…

作者头像 李华
网站建设 2026/9/16 23:53:48

简单题不简单:AtCoder ABC157 B题Bingo的二维数组模拟与复盘

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/16 23:51:09

AI Agent技能工程化:TypeScript+NX+semantic-release实践

1. 项目概述:一个被严重低估的“AI能力原子库”“agent-skills”这四个字,乍看像某个开源项目的代号,或是某家AI创业公司的内部术语。但如果你在GitHub上搜过它,会发现它既不是热门库,也没有明星团队背书;如…

作者头像 李华