4. 局部优化算法:阻尼最小二乘法(DLS)与 Hammer 的较量
聊到局部优化,很多刚入行的朋友会觉得:“不就是找个局部最小值嘛,有啥好比的?”
嗯,还真不是这么简单。我做了十几年光学设计,踩过最大的坑之一,就是以为所有优化算法都一样。结果呢?同一个初始结构,Code V 跑出来是 0.02 波前差,Zemax 跑出来是 0.08——你说算法重不重要?
4.1 阻尼最小二乘法(DLS)——Code V 的看家本领
DLS 说白了,就是给传统最小二乘法加了个“阻尼”项。传统最小二乘法只管让误差平方和最小,但跑着跑着就容易“抽风”——步长太大,直接跳出合理区间。
阻尼的作用是什么?就是给每一步加个刹车。步长太大?阻尼系数自动增大,让你稳稳当当收敛。
核心公式(理解即可):
(ATA + μI)Δx = ATb
其中 μ 就是阻尼系数,I 是单位矩阵。
(ATA + μI)Δx = ATb
其中 μ 就是阻尼系数,I 是单位矩阵。
Code V 的 DLS 实现有几个特点,我这些年用下来感受很深:
- 自适应阻尼调整:每次迭代后,如果误差下降,阻尼就减小;如果误差反弹,阻尼就增大。说白了就是“路好走就加速,路不好就减速”。
- 边界处理更激进:Code V 的 DLS 对变量边界有专门的投影算法。我曾经做一个投影镜头,镜片边缘厚度快成负数了,Code V 硬是给拉回来了。
- 误差函数加权灵活:你可以给每个视场、每个波长单独设权重。这个在 Zemax 里也有,但 Code V 的权重更新策略更“聪明”——它会根据当前误差自动调整权重,避免某个视场被“忽略”。
我的习惯: 在 Code V 里做 DLS 优化前,我一定会先跑一遍
AUTOMATIC DESIGN 命令。这个命令会自动帮你设置好阻尼初始值、变量边界和权重,省去很多手动调参的麻烦。
4.2 Hammer 优化算法——Zemax 的“暴力美学”
Zemax 的 Hammer 优化,名字听着就很硬核。它本质上是一种“全局搜索 + 局部下山”的混合算法。
怎么理解呢?你可以想象成:
- 先随机生成一堆候选结构(全局搜索阶段)
- 对每个候选结构跑一遍局部优化(下山阶段)
- 比较所有结果,保留最好的
Hammer 的厉害之处在于它的“随机扰动”机制。它不是傻傻地随机,而是根据当前结构的灵敏度来调整扰动幅度——敏感变量扰动小一点,不敏感变量扰动大一点。这个设计很巧妙,我当年第一次看到这个机制时,心里想的是:“这谁想出来的?太聪明了。”
注意: Hammer 不是真正的全局优化算法。它本质上还是局部优化,只是多了个“多起点”策略。如果你初始结构离全局最优太远,Hammer 也救不了你。
4.3 收敛速度对比——谁更快?
这个问题我经常被问到。直接给结论:没有绝对谁快,要看场景。
| 场景 | Code V DLS | Zemax Hammer |
|---|---|---|
| 初始结构较好(接近最优) | 快,5-10 次迭代收敛 | 慢,因为要跑多起点 |
| 初始结构较差 | 容易陷入局部极值 | 有机会跳出,但耗时更长 |
| 变量数少(< 20 个) | 极快,几乎秒出 | 中等,受随机扰动影响 |
| 变量数多(> 50 个) | 阻尼调整频繁,速度下降 | 多起点并行,反而可能更快 |
| 有强约束(如总长固定) | 边界处理高效,收敛稳定 | 约束处理较弱,容易震荡 |
我个人经验是:做定焦镜头优化,Code V 的 DLS 通常更快;做变焦镜头或初始结构未知的系统,Zemax 的 Hammer 更有优势。
4.4 避坑指南——我踩过的那些坑
我曾经犯过的错: 有一次优化一个 8 片镜头的投影系统,我在 Code V 里用 DLS 跑了 200 次迭代,误差死活降不下去。后来发现,是我把某个镜片的曲率半径边界设得太死了——阻尼算法每次想跨大步,都被边界弹回来。改成软边界后,20 次迭代就收敛了。
几个实用建议:
- 不要一上来就用 Hammer:先用 DLS 或局部优化把结构“拉”到合理区间,再用 Hammer 做精细搜索。我见过太多人直接上 Hammer,跑了一晚上,结果还不如 DLS 跑 5 分钟。
- 阻尼系数不是越大越好:阻尼太大,收敛慢得像蜗牛;阻尼太小,容易震荡。Code V 的默认值通常不错,但如果你发现收敛曲线像心电图一样上下跳动,可以手动增大阻尼。
- Zemax 里用 Hammer 前,先跑一遍 Local Optimization:让结构先“站稳”,Hammer 的随机扰动才有效。否则扰动全被结构本身的“不稳定”吃掉了。
4.5 知识结构图
下面这张图帮你理清两种算法的核心逻辑和适用场景:
4.6 实战建议
如果你问我,在实际项目中怎么选?我的建议是:
- 第一步:不管用哪个软件,先用局部优化(DLS 或 Local Optimization)跑 20-30 次迭代,看看收敛趋势。
- 第二步:如果收敛曲线平滑下降,说明初始结构不错,继续用局部优化直到收敛。
- 第三步:如果收敛曲线震荡或停滞,换 Hammer 或全局算法试试。
- 第四步:别忘了手动检查结构——算法再聪明,也替代不了工程师的眼睛。
一个小技巧: 在 Code V 里,你可以用
GRAPHIC 命令实时查看优化过程中的光路图。我习惯一边跑优化一边盯着光路看——有时候算法觉得“好了”,但光路明显有折返或边缘过薄,这时候就要手动干预了。