第一章:课程导论与环境搭建

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~16R2015b~R2018aAPI功能有限,仅支持基本操作
Zemax 17~19R2017b~R2020aAPI稳定,支持大部分功能
Zemax 20~22R2019b~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进行自动优化——那才是真正好戏开始的地方。