☰
如何用Optiland优化镜头:从简单评价函数到高级求解器,光学优化完整指南
2026/10/17 2:24:18 网站建设 项目流程

【免费下载链接】optiland

Comprehensive optical design, optimization, and analysis in Python, including GPU-accelerated and differentiable ray tracing via PyTorch.

项目地址:https://gitcode.com/gh_mirrors/op/optiland
点击查看免费下载

Optiland是一个用 Python 实现的光学设计与优化库,它把镜头优化拆解成三件事:评价函数(merit function)→ 优化变量(variables)→ 求解器(optimizer)。本文面向新手,带你从零理解光学优化评价函数怎么搭、变量怎么选、求解器如何挑,并顺带介绍 GPU 加速与玻璃材料自动选择等进阶玩法。

一、30秒理解Optiland光学优化的核心思路

在传统 Zemax 式软件里,"评价函数表"和"变量表"是两张手工维护的表格。Optiland 把它们变成了代码对象:

概念作用例子
Operand(操作数)衡量系统性能的单项指标,加权重后构成评价函数光斑RMS、波像差、焦距、主光线高度
Variable(变量)允许被求解器调整的设计参数曲率半径、厚度、圆锥常数、玻璃材料
Optimizer(求解器)迭代调整变量、让评价函数值越来越小的算法Dual Annealing、Differential Evolution、Adam

三者由 OptimizationProblem 类统一封装,完整框架说明见开发者指南 optimization_framework.rst。

一句话总结流程:"加操作数 → 加变量 → 选求解器 → 运行 → 看结果",全程只有四步。

二、如何搭建简单评价函数:第一步上手

1. 创建优化问题

from optiland.optimization import OptimizationProblem problem = OptimizationProblem()

2. 添加操作数(定义"好镜头"的标准)

每个操作数都需要三样东西:目标值(target)、权重(weight)、光路输入(input_data)。权重决定该项在评价函数中的"话语权":

problem.add_operand(operand_type='f2', target=50, weight=1, input_data={'optic': lens})

Optiland 内置了几十种操作数,覆盖四大类(见 operand.py 中的METRIC_DICT注册表):

  • 近轴类:f1/f2焦距、EPD入瞳直径、magnification放大率等;
  • 实光线类:rms_spot_size光斑RMS、real_x_intercept像面交点、OPD_difference光程差等;
  • 像差类:seidel赛德尔五项、TSC总球差等;
  • 结构类:edge_thickness边缘厚度、AOI入射角等。

💡新手建议:第一个优化任务只需 2~3 个操作数——例如"焦距达标 + 轴上光斑最小",不要一开始就堆几十项。

3. 添加变量(告诉求解器"能动哪里")

problem.add_variable(lens, 'radius', surface_number=2)

变量类型在 optiland/optimization/variable/ 下按文件组织,常用的有:

变量文件适用场景
radius/reciprocal_radiusradius.py曲面曲率(倒数半径收敛更快)
thicknessthickness.py面间距与中心厚度
conicconic.py非球面校正
asphere_coeffasphere_coeff.py非球面高阶系数
material(玻璃选择)material.py配 GlassExpert 使用

三、如何选择合适的求解器:局部、全局与GPU加速

1. 局部求解器:起点不差时的主力

OptimizerGeneric 对scipy.optimize.minimize做了统一封装,Nelder-Mead、Powell、BFGS、L-BFGS-B 等经典方法都可用;针对光学问题的还有 LeastSquares(基于残差向量)和 OrthogonalDescent(正交下降,适合面数多的系统)。

2. 全局求解器:从"毛坯"起步时的救星

如果初始结构离目标很远(比如从三片平板做起),局部方法容易掉进局部最优。Optiland 提供 4 种 SciPy 全局方法 + 2 种自研无梯度方法:

  • DualAnnealing(双退火)、DifferentialEvolution(差分进化)、SHGO、BasinHopping
  • 自研的 CMA-ES 与 ParticleSwarm(粒子群)

典型策略:先用全局法粗搜,再切换局部法精修。

3. 实战:Cooke 三片式从平板到可用镜头

官方案例 Tutorial_3d_Optimization_Case_Study_Cooke_Triplet.ipynb 演示了从 3 片近乎平行的玻璃片出发,设计 F/5、焦距 50 mm 的 Cooke 三片式。优化过程中,镜头结构逐次"长"出来,同时评价函数值一路下降:

4. GPU加速:用PyTorch后端跑微分可导优化

Optiland 的 Torch 后端支持自动微分(autograd),让评价函数对变量直接可导,可用 Adam、SGD 等深度学习优化器;大批量光线在 GPU 上并行追迹,吞吐量相比 CPU 有明显提升:

对应示例:torch_rms_spot_size.ipynb。

四、进阶技巧:玻璃自动选择与缩放

1. GlassExpert:让算法替你选玻璃

选玻璃是"离散变量 + 连续变量"混合问题,普通求解器处理不了。GlassExpert 的做法是:在 nd–Vd 玻璃图上先全局搜索(K-Means 降采样整个目录),再在最优玻璃邻域做局部搜索,每换一个候选玻璃就对连续变量做一次局部优化,最终保留最优组合。

玻璃目录数据存放在 optiland/database/,完整案例见 Tutorial_3e_Glass_Expert_Categorical_Optimization.ipynb。

2. 变量缩放(Scaling):让不同量级的变量"公平竞争"

半径可能是几百毫米、厚度是零点几毫米,量级悬殊会让梯度法走偏。Optiland 在 optiland/optimization/scaling/ 提供线性、对数、幂、倒数四种缩放器,把变量归一化到相近区间,收敛更稳。

五、不想写代码?GUI里同样能优化

Optiland 自带图形界面,镜头数据、系统属性、分析和优化都在同一窗口完成,适合快速迭代与可视化检查:

界面结构详见 optiland_gui/。

六、常见问题速查

问题建议做法
评价函数卡在某个值不降换全局求解器(如 DifferentialEvolution),或检查是否有变量"卡边界"
某操作数权重设多大?先让关键指标(焦距、光斑)权重高,次要指标逐步加权,避免互相打架
收敛慢给半径变量改用reciprocal_radius;启用内置的批量光线评估(默认开启)
想加自定义操作数/求解器继承 Operand 或OptimizerGeneric并注册,见 Tutorial_3c_User_Defined_Optimization.ipynb

更多可运行示例集中在 docs/gallery/optimization/,涵盖光斑RMS、波像差、非球面、自由曲面、约束优化、全局搜索等 20+ 场景,建议从 rms_spot_size.ipynb 这个最简单的例子跑起来再逐步加难度。

小结

  • 评价函数= 用操作数描述"什么是好镜头",权重决定优先级;
  • 变量= 圈定求解器的搜索范围,从半径/厚度起步即可;
  • 求解器= 近起点选局部法(L-BFGS-B、正交下降),毛坯起步选全局法(Dual Annealing、CMA-ES),要可导大计算量就上 GPU + Adam;
  • 进阶= GlassExpert 自动选玻璃、Scaling 变量缩放、GUI 可视化迭代。

掌握这条"操作数 → 变量 → 求解器"主线,你就已经能独立完成一个镜头从毛坯到可用的完整优化流程了 🚀

【免费下载链接】optiland

Comprehensive optical design, optimization, and analysis in Python, including GPU-accelerated and differentiable ray tracing via PyTorch.

项目地址:https://gitcode.com/gh_mirrors/op/optiland
点击查看免费下载

相关推荐

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询