3. 操作数基础:结构、类型、权重与目标值

好,咱们正式开始啃优化函数这块硬骨头。第一口,得从最基础的操作数说起。

操作数是什么?说白了,它就是 Zemax 里用来描述光学系统某个具体性能的“度量尺子”。你想让镜头成像清晰,就得告诉软件“清晰”的标准是什么——是光斑半径小于 5 微米?还是波前差小于 0.25 个波长?这些标准,就是通过一个个操作数来定义的。

3.1 操作数的结构:一个完整的“指令”长什么样?

每个操作数,本质上都是一条指令。我习惯把它拆成四个部分来看:

  • 操作数类型:告诉软件你要算什么。比如 SPHA 算球差,COMA 算彗差。
  • 参数(Int1, Int2, Data):告诉软件算哪个面、哪个波长、哪个视场。比如 SPHA 后面跟着面序号和波长序号。
  • 目标值(Target):你希望这个值最终变成多少。理想情况下,球差希望是 0,畸变希望控制在 1% 以内。
  • 权重(Weight):这个指标有多重要。权重越大,优化时软件越优先满足它。

嗯,这里要注意,操作数本身不直接修改镜片曲率或厚度,它只负责“测量”和“打分”。优化器根据这些分数,反过来调整镜片参数。

核心理解: 操作数 = 传感器 + 评分卡。它只告诉你“当前系统离目标差多少”,不告诉你“怎么改”。怎么改,是优化器的事。

3.2 操作数的类型:你手里有哪些“尺子”?

Zemax 里操作数有几百种,但别慌,常用的也就二三十种。我按用途把它们分成了几大类,你记牢这几类,后面学起来就快了。

类别 代表操作数 测量什么?
像差类 SPHA, COMA, ASTI, FCUR, DIST 球差、彗差、像散、场曲、畸变
波前类 OPDX, OPGT, WAVF 光程差、波前误差
几何类 RSCE, GENC, DMVA 光斑半径、几何包围能量
边界类 MNCA, MXCA, CTGT, CTLT 中心厚度、边缘厚度、空气间隙
玻璃类 INDX, ABBO 折射率、阿贝数
求解类 POWR, EFFL 光焦度、有效焦距

我个人习惯,刚开始做优化时,先只放 3-5 个核心操作数。比如一个 EFFL 锁焦距,一个 RSCE 控光斑,再加两个边界操作数防止镜片打架。等系统跑顺了,再慢慢加像差操作数去微调。

小技巧: 别一上来就堆几十个操作数。优化器也是“贪心”的,操作数太多,它反而不知道该优先满足谁。先少后多,逐步收紧。

3.3 权重:给每个指标“定个价”

权重这个东西,我刚开始学的时候总觉得它很玄学。后来做项目多了才明白,权重其实就是你告诉优化器:“这个指标我愿意付出多少代价去满足它。”

举个例子:

  • 你设计一个投影镜头,畸变要求很严,必须小于 0.5%。那畸变操作数的权重可以设到 10 甚至 20。
  • 同时你希望光斑尽量小,但可以稍微放宽一点,那光斑操作数的权重设 1 就够了。

优化器会算一个总 Merit Function(评价函数),公式大致是:

Merit = Σ [ Weight_i × (Current_i - Target_i)² ]

权重越大,偏差的惩罚就越重。优化器会优先把权重高的指标拉回到目标值附近。

我曾经踩过的坑: 有一次我把所有操作数的权重都设成 1,结果优化了半天,光斑和畸变都没收敛。后来我把畸变权重提到 5,光斑权重降到 0.5,系统很快就收敛了。权重不是越大越好,而是要拉开差距,让优化器知道主次。

3.4 目标值:你到底想要什么?

目标值,就是你对这个指标的期望值。它可以是 0(比如球差),也可以是一个非零值(比如有效焦距 100 mm)。

这里有个容易混淆的点:

  • 目标值 = 0:表示你希望这个值越小越好,比如像差、畸变。
  • 目标值 ≠ 0:表示你希望这个值精确等于某个数,比如焦距、放大率。

还有一种情况,目标值设成“无穷大”或“极小”,配合权重来控制范围。比如你希望镜片厚度在 2 mm 到 5 mm 之间,可以用 CTGT(大于)和 CTLT(小于)两个操作数来夹逼。

关键点: 目标值不是随便填的。它必须是你系统物理上能达到的值。你让一个 F/1.0 的镜头畸变目标设成 0.01%,那优化器再怎么跑也达不到,只会浪费计算时间。

3.5 知识体系总览:一张图看懂操作数

下面这张图,我把操作数的核心逻辑串起来了。你可以把它当作本章的“思维导图”。

操作数知识体系结构图 操作数 (Operand) 类型 (Type) 参数 (Int1/Data) 目标值 (Target) 权重 (Weight) 像差类 波前类 几何类 边界类 = 0 (越小越好) ≠ 0 (精确值) 💡 核心逻辑 操作数 = 类型(测什么) + 参数(测哪里) + 目标值(期望多少) + 权重(多重要) 优化器根据 Merit = Σ[W×(C-T)²] 来驱动系统向目标收敛

3.6 实战小案例:一个最简单的优化函数

说了这么多,不如直接上手看一个例子。假设我们要优化一个单透镜,要求焦距 100 mm,光斑尽量小。

在 Merit Function Editor 里,我会这样写:

! 操作数类型   Int1   Int2   Data   目标值   权重
EFFL          1      1      0       100      10
RSCE          1      1      0       0        1
MNCA          1      2      0       2        5
MXCA          1      2      0       5        5

解释一下:

  • EFFL:第 1 面到像面,波长 1,目标焦距 100 mm,权重 10(很重要)。
  • RSCE:第 1 面到像面,波长 1,目标光斑半径 0(越小越好),权重 1(次要)。
  • MNCA 和 MXCA:第 1 面到第 2 面之间的中心厚度,最小 2 mm,最大 5 mm,权重 5(防止镜片太薄或太厚)。

你看,这个优化函数只有 4 个操作数,但已经能驱动一个单透镜向正确的方向跑了。等它跑稳了,我再加 SPHA 去控球差,加 DIST 去控畸变。

我的习惯: 每次加新操作数之前,先跑一轮优化看看当前系统的瓶颈在哪。不要一次性把所有操作数都塞进去,那样你根本不知道是哪个操作数在起作用。