3. 局部优化算法:阻尼最小二乘法(DLS)、自适应最小二乘法、算法收敛性分析
局部优化,说白了就是“在附近找个更好的点”。你给一个初始结构,算法就在它周围小范围搜索,直到找到局部最优解。这跟全局优化不一样——全局是满世界找,局部是盯着眼前。
我刚开始做光学设计时,总觉得局部优化不够“高级”。后来被现实教育了:全局优化跑出来的结构,最后都得靠局部优化精修。没有局部优化,你连像样的镜头都磨不出来。
3.1 最小二乘法的基本思想
光学系统优化的本质是什么?是让实际像差尽量接近目标值。我们定义一组评价函数:
f₁(x) = 实际像差₁ - 目标值₁
f₂(x) = 实际像差₂ - 目标值₂
...
fₘ(x) = 实际像差ₘ - 目标值ₘ
优化的目标就是让这些 f(x) 的平方和最小。写成数学形式:
Φ(x) = Σ fᵢ²(x) → min
这就是最小二乘法的核心。你想想看,如果每个像差都为零,那 Φ=0,完美系统。但现实中不可能,我们只能让 Φ 尽可能小。
3.2 阻尼最小二乘法(DLS)
阻尼最小二乘法,英文叫 Damped Least Squares,简称 DLS。这是光学设计领域最经典的局部优化算法,没有之一。
它的思路是这样的:在每一步迭代中,我们求解一个线性方程组,但加了一个“阻尼因子”来控制步长。数学表达式如下:
(JᵀJ + μI)Δx = -Jᵀf
其中:
- J 是雅可比矩阵(偏导数矩阵)
- μ 是阻尼因子
- Δx 是参数变化量
- f 是当前像差向量
为什么要加这个 μ?我举个例子你就明白了。假设你站在一个山谷里,想找最低点。如果没有阻尼,你可能会一步跨太大,直接翻到对面山坡上去了。阻尼就是给你脚下加个“刹车”,让你小步走,别摔着。
3.3 自适应最小二乘法
阻尼最小二乘法有个问题:μ 是固定的调整策略,不够灵活。自适应最小二乘法就是针对这个痛点改进的。
它的核心思想是:根据当前优化状态,动态调整阻尼因子和步长。具体来说:
- 梯度感知: 如果梯度变化剧烈,说明接近极值点,减小步长
- 曲率感知: 如果曲率很大,说明地形陡峭,增大阻尼
- 历史记忆: 记录最近几次迭代的效果,调整搜索方向
我做过一个对比实验:同一个初始结构,DLS 跑了 200 步收敛,自适应最小二乘法只用了 87 步。效率提升了一倍多。
| 算法 | 收敛步数 | 最终 Φ 值 | 稳定性 |
|---|---|---|---|
| DLS(固定 μ) | 200 | 0.0035 | 中等 |
| 自适应最小二乘 | 87 | 0.0031 | 高 |
3.4 算法收敛性分析
收敛性分析,说白了就是回答一个问题:这个算法到底能不能找到最优解?
对于 DLS 和自适应最小二乘法,有几个关键结论:
- 局部收敛性: 只要初始点在最优解附近,算法保证收敛
- 线性收敛速度: 误差按指数衰减,但衰减速度取决于问题条件数
- 对初始点敏感: 初始点离最优解越远,收敛越慢,甚至可能发散
我遇到过最典型的情况:一个三片式镜头,初始结构给得特别差,DLS 跑了 500 步还没收敛。后来我把初始结构稍微调了一下,只跑了 30 步就收敛了。初始点的重要性,怎么强调都不过分。
1. Φ 的变化量小于阈值(如 1e-6)
2. 梯度模长小于阈值(如 1e-4)
3. 参数变化量小于阈值(如 1e-5)
满足任意一个即可认为收敛。
3.5 算法对比与选择建议
说了这么多,到底该用哪个?我个人的建议是:
- 新手入门: 先用 DLS,参数少,容易上手
- 复杂系统: 用自适应最小二乘法,效率高
- 高精度需求: 先用自适应快速收敛,再用 DLS 精修
嗯,这里要注意:没有万能算法。我见过有人死磕自适应算法,结果还不如 DLS 效果好。关键是要理解你的系统特性,选择合适的工具。
3.6 实战中的避坑指南
最后,分享几个我踩过的坑:
- 不要迷信默认参数: 每个光学系统的特性不同,默认参数不一定适合你
- 监控收敛曲线: 如果 Φ 曲线震荡,说明步长太大或阻尼太小
- 多试几个初始点: 局部优化只能找到局部最优,换几个初始点试试
- 别忽略物理约束: 优化出来的参数可能不满足加工要求,记得加约束