第一章:课程导论与环境搭建
Zemax与Matlab联合仿真——到底能解决什么问题?
说实话,我入行那会儿,光学设计基本就是「Zemax跑一跑,Matlab算一算」。两个软件各干各的,中间靠手动导出数据、再手动导入。嗯,效率低得让人抓狂。
后来我接手一个变焦镜头项目,客户要求三天内给出三组不同温度下的像质分析。如果用传统方式,我得在Zemax里改一次参数、跑一次、导出数据、再进Matlab画图……重复十几遍。那晚我盯着屏幕到凌晨两点,突然意识到:为什么不写个脚本,让Matlab自动调Zemax?
这就是联合仿真的意义——把重复劳动交给机器,把时间留给思考。
具体来说,联合仿真能帮你搞定三件事:
- 批量优化与参数扫描:比如同时改变曲率半径、厚度、材料,自动评估上百种组合
- 复杂像质分析:Zemax的MTF、波前图不够用?Matlab里你可以自定义评价函数
- 系统级协同设计:光学系统+机械结构+控制算法,一个脚本全链路打通
我个人最常用的场景:热分析。镜头在不同温度下性能会漂移,用Matlab循环调用Zemax,自动生成「温度-像质」曲线。这活儿要是手动干,我估计得加班到退休。
软件版本选择——别在第一步踩坑
很多新手问我:「老师,Zemax和Matlab哪个版本搭配最好?」
我的回答是:别追新,求稳。
Zemax从13版开始支持API接口,但真正好用是从2017版之后。Matlab的话,R2016b以上基本都能兼容。我目前在用的是Zemax 2021 R2 + Matlab R2022a,跑了两年没出过兼容性问题。
这里有个坑,我曾经踩过:Zemax的API分32位和64位。如果你的Matlab是64位,Zemax也必须是64位,否则连不上。别问我怎么知道的……那次我折腾了整整一个下午。
| Zemax版本 | 推荐Matlab版本 | 注意事项 |
|---|---|---|
| Zemax 13~16 | R2015b~R2018a | API功能有限,仅支持基本操作 |
| Zemax 17~19 | R2017b~R2020a | API稳定,支持大部分功能 |
| Zemax 20~22 | R2019b~R2023a | 推荐组合,兼容性好 |
| Zemax 23+ | R2021b+ | 新功能多,但偶有bug |
小技巧:安装时把Zemax和Matlab装在同一台电脑上,别搞什么远程调用。网络延迟会让你怀疑人生。
环境搭建——手把手教你连起来
好,理论说完了,咱们动手。
第一步:确认Zemax的API是否开启。
打开Zemax,菜单栏找到「编程」→「API」→「启用API服务器」。端口默认用1053,别改它。我习惯勾上「允许远程连接」,虽然本地用不上,但万一以后要搞分布式计算呢?
第二步:在Matlab中加载Zemax的.NET程序集。
打开Matlab,输入以下代码:
% 加载Zemax API
NET.addAssembly('C:\Program Files\Zemax OpticStudio\ZOS-API\Libraries\ZOSAPI.dll');
NET.addAssembly('C:\Program Files\Zemax OpticStudio\ZOS-API\Libraries\ZOSAPI_Interfaces.dll');
% 创建连接
TheConnection = ZOSAPI.ZOSAPI_Connection();
TheApplication = TheConnection.CreateNewApplication();
if TheApplication.IsValid
disp('Zemax连接成功!');
else
error('连接失败,请检查Zemax是否开启API服务');
end
这段代码我闭着眼都能敲出来——因为写过不下两百次了。你第一次跑的时候,大概率会报错。别慌,99%的原因是路径不对。去你的Zemax安装目录下找找,Libraries文件夹里有没有那两个dll文件。
第三步:打开一个镜头文件试试。
% 打开示例镜头
TheSystem = TheApplication.OpenFile('C:\Users\Public\Documents\Zemax\Samples\Doublet.zmx');
if TheSystem.IsValid
disp('镜头文件加载成功');
end
注意:Zemax文件路径中不要有中文,不要有空格。我吃过这个亏——文件名叫「双胶合透镜.zmx」,结果Matlab死活打不开。改成「Doublet.zmx」就没事了。
API接口概述——你只需要记住三个核心对象
Zemax的API其实不复杂。说白了,就是三个层级:
- TheApplication:代表Zemax软件本身。用它来打开文件、关闭文件、设置全局参数。
- TheSystem:代表当前打开的镜头文件。用它来获取镜头数据、运行分析、修改参数。
- TheLDE:代表镜头数据编辑器(Lens Data Editor)。用它来读写每个面的曲率、厚度、玻璃等。
举个例子,你想读取第一个面的曲率半径:
% 获取镜头数据编辑器
TheLDE = TheSystem.LDE;
% 获取第一个面(通常是物面)
surface1 = TheLDE.GetSurfaceAt(1);
% 读取曲率半径
radius = surface1.Radius;
disp(['第一个面的曲率半径是:', num2str(radius)]);
你看,是不是很简单?
当然,API能做的远不止这些。你还可以:
- 运行光线追迹(Ray Trace)
- 获取MTF、点列图、波前图
- 修改玻璃材料、非球面系数
- 控制优化函数(Merit Function)
这些我们后面章节会一个一个讲。今天先把环境搭好,能连上就算成功。
避坑指南——我替你踩过的雷
最后,分享几个实战中容易翻车的地方:
- Zemax和Matlab的位数必须一致。32位对32位,64位对64位。混着用,API直接罢工。
- 每次用完记得关闭连接。不然Zemax进程会卡住,下次连不上。代码里加一句:
TheApplication.CloseApplication(); - 调试时别开太多Zemax窗口。API调用时,Zemax界面会闪烁。我一般把Zemax最小化到托盘,眼不见心不烦。
- 第一次跑通后,记得保存为模板。把连接代码封装成一个函数,以后每次直接调用。省事。
好了,第一章就到这里。环境搭好了,后面咱们就能放开手脚干活了。下一章我会讲如何用Matlab控制Zemax进行自动优化——那才是真正好戏开始的地方。