TA的每日心情 | 慵懒 2025-10-13 09:48 |
---|
签到天数: 310 天 [LV.8]以坛为家I
小白
- 积分
- 5
|
本帖最后由 伊人在水一方 于 2025-10-13 16:14 编辑
Zemax—Matlab API 交互教程(7)_打开文件并进行优化
附件:
注意:
1.此帖子需要先运行《Zemax—Matlab API 交互教程(5)》,以获取必要的.zmx文件
2.此帖子的核心内容和教程(3)中的一样:《Zemax—Matlab API 交互教程(3) _插入操作数并进行优化》,主要用于按照官方示例的顺序来和逻辑进行教程的整理,对文件路径进行创建并保存在示例文件夹下,以及进行相关的操作
相关教程:
Zemax—Matlab API 交互教程(1) _初始化:http://www.optzmx.com/thread-42088-1-1.html
Zemax—Matlab API 交互教程(2) _插入评价函数操作数:http://www.optzmx.com/thread-42091-1-1.html
Zemax—Matlab API 交互教程(3) _插入操作数并进行优化:http://www.optzmx.com/thread-42095-1-1.html
Zemax—Matlab API 交互教程(4) _批量添加操作数_从高斯光到平顶光:http://www.optzmx.com/thread-42099-1-1.html
Zemax—Matlab API 交互教程(5)_新文件和快速聚焦:http://www.optzmx.com/thread-42325-1-1.html
Zemax—Matlab API 交互教程(6)_NSC光线追迹:http://www.optzmx.com/thread-42382-1-1.html
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 代码功能:
% 打开API文件(…\Samples\API\Matlab\e01_new_file_and_quickfocus.zos)
% 将一些表面半径设为变量,通过插入操作数和调整参数值,手动生成约束空气和材料厚度、目标像散和彗差的评价函数。
% 运行局部优化直至完成,然后运行锤形优化器10秒。
% 注意,运行此代码之前需要先运行《Zemax—Matlab API 交互教程(5)_新文件和快速聚焦》:http://www.optzmx.com/thread-42325-1-1.html
% 以生成一个zemax文件,后文需要用到:
% 或者先运行官方示例代码: Documents\Zemax\ZOS-API SampleCode\MATLAB\MATLABStandalone_01_new_file_and_quickfocus.m
% 本代码参考官方示例: Documents\Zemax\ZOS-API SampleCode\MATLAB\MATLABStandalone_03_open_file_and_optimise.m
% 代码已测试成功
% 相关附件已上传
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
clc; clear; close all;
%% =============== 1. 初始化 Zemax 连接 ===============
% 添加路径,此路径为你的:文档\Zemax\ZOS-APIProjects\MATLABZOSConnection1
addpath("C:\Users\Documents\Zemax\ZOS-APIProjects\MATLABZOSConnection1");
TheApplication = MATLABZOSConnection1;
TheSystem = TheApplication.PrimarySystem;
%% =============== 2. 创建文件存放文件夹 ===============
sampleDir = TheApplication.SamplesDir; % 获取官方示例文件目录路径,SamplesDir表示的路径是: Documents\Zemax\SAMPLES
apiPath = System.String.Concat(TheApplication.SamplesDir, '\API\Matlab');% 构建文件夹:/Samples/API/Matlab
% 如果文件夹不存在,则创建
if (exist(char(apiPath)) == 0)
mkdir(char(apiPath));
end
%% =============== 3. 打开文件并另存为 ===============
% 原始示例文件路径
testFile = System.String.Concat(sampleDir, '\API\Matlab\e01_new_file_and_quickfocus.zos');
% 检查依赖文件是否存在,需要先运行Documents\Zemax\ZOS-API SampleCode\MATLAB\MATLABStandalone_01_new_file_and_quickfocus.m
if (exist(char(testFile)) == 0)
fprintf('错误:需要先运行示例01才能执行本程序\n');
r = [];
return;
end
TheSystem.LoadFile(testFile, false);% 加载示例文件(参数false表示不保存当前系统)
% 新建文件保存路径,也可以自定义文件名、该后缀为.zmx文件
testFile2 = System.String.Concat(sampleDir, '\API\Matlab\e03_open_file_and_optimise.zos');
% 将系统另存为新文件
TheSystem.SaveAs(testFile2);
%% =============== 4. 镜头数据,设置变量参数 ===============
% 获取镜头数据编辑器(LDE)
TheLDE = TheSystem.LDE;
% 获取前三个表面对象
Surface_1 = TheLDE.GetSurfaceAt(1); % 第1面(物面是第0面)
Surface_2 = TheLDE.GetSurfaceAt(2); % 第2面,第一个透镜前表面
Surface_3 = TheLDE.GetSurfaceAt(3); % 第3面,第一个透镜后表面
% 设置变量参数
% 表面1的厚度Thickness设为变量
Surface_1.ThicknessCell.MakeSolveVariable();
% 表面2的厚度和曲率Radius设为变量
Surface_2.ThicknessCell.MakeSolveVariable();
Surface_2.RadiusCell.MakeSolveVariable();
% 表面3的厚度设为变量
Surface_3.ThicknessCell.MakeSolveVariable();
%% =============== 5. 设置操作数 ==============
% 获取优化函数编辑器(MFE)接口
TheMFE = TheSystem.MFE;
fprintf(">>>正在写入操作数\n");
% 操作数1设置为ASTI(像散优化)
Operand_1 = TheMFE.GetOperandAt(1);
Operand_1.ChangeType(ZOSAPI.Editors.MFE.MeritOperandType.ASTI);
Operand_1.Target = 0.0; % 目标值设为0
Operand_1.Weight = 10.0; % 权重设为10
% 操作数2插入COMA(彗差优化)
Operand_2 = TheMFE.InsertNewOperandAt(2);
Operand_2.ChangeType(ZOSAPI.Editors.MFE.MeritOperandType.COMA);
Operand_2.Target = 0.0;
Operand_2.Weight = 1.0;
%% 空气间隙
% 空气最小中心厚度 (MNCA: Minimum Center Air)
Operand_3 = TheMFE.AddOperand();
Operand_3.ChangeType(ZOSAPI.Editors.MFE.MeritOperandType.MNCA);
Operand_3.Target = 0.5; % 设置目标值,最小空气厚度0.5mm
Operand_3.Weight = 1.0; % 设置权重
% 设置参数位置(表面1到3)
Operand_3.GetCellAt(2).IntegerValue = 1; % 起始表面
Operand_3.GetCellAt(3).IntegerValue = 3; % 结束表面
% 空气最大中心厚度 (MXCA: Maximum Center Air)
Operand_4 = TheMFE.AddOperand();
Operand_4.ChangeType(ZOSAPI.Editors.MFE.MeritOperandType.MXCA);
Operand_4.Target = 1000; % 最大空气厚度1000mm
Operand_4.Weight = 1.0;
Operand_4.GetCellAt(2).IntegerValue = 1;
Operand_4.GetCellAt(3).IntegerValue = 3;
% 空气最小边缘厚度 (MNEA: Minimum Edge Air)
Operand_5 = TheMFE.AddOperand();
Operand_5.ChangeType(ZOSAPI.Editors.MFE.MeritOperandType.MNEA);
Operand_5.Target = 0.5;
Operand_5.Weight = 1.0;
Operand_5.GetCellAt(2).IntegerValue = 1;
Operand_5.GetCellAt(3).IntegerValue = 3;
%% 玻璃
% 玻璃最小中心厚度 (MNCG: Minimum Center Glass)
Operand_6 = TheMFE.AddOperand();
Operand_6.ChangeType(ZOSAPI.Editors.MFE.MeritOperandType.MNCG);
Operand_6.Target = 3.0;
Operand_6.Weight = 1.0;
Operand_6.GetCellAt(2).IntegerValue = 1;
Operand_6.GetCellAt(3).IntegerValue = 3;
% 玻璃最大中心 (MXCG: Maximum Center Glass)
Operand_7 = TheMFE.AddOperand();
Operand_7.ChangeType(ZOSAPI.Editors.MFE.MeritOperandType.MXCG);
Operand_7.Target = 15.0;
Operand_7.Weight = 1.0;
Operand_7.GetCellAt(2).IntegerValue = 1;
Operand_7.GetCellAt(3).IntegerValue = 3;
% 玻璃最小边缘 (MNEG: Minimum Edge Glass)
Operand_8 = TheMFE.AddOperand();
Operand_8.ChangeType(ZOSAPI.Editors.MFE.MeritOperandType.MNEG);
Operand_8.Target = 3.0;
Operand_8.Weight = 1.0;
Operand_8.GetCellAt(2).IntegerValue = 1;
Operand_8.GetCellAt(3).IntegerValue = 3;
%% =============== 6. 执行优化,先进行局部优化,再进行锤形优化 ==============
tic; % 开始计时
% 1.局部优化设置(阻尼最小二乘法)
fprintf(">>>正在进行局部优化\n");
LocalOpt = TheSystem.Tools.OpenLocalOptimization();
LocalOpt.Algorithm =ZOSAPI.Tools.Optimization.OptimizationAlgorithm.DampedLeastSquares;
LocalOpt.Cycles =ZOSAPI.Tools.Optimization.OptimizationCycles.Automatic; % 自动模式
LocalOpt.NumberOfCores = 8; % 使用8个CPU核心
% 运行优化直到完成
LocalOpt.RunAndWaitForCompletion();
LocalOpt.Close();
fprintf(">>>局部优化完成\n");
% 2.锤形优化全局优化设置
fprintf(">>>正在进行锤形优化\n");
HammerOpt = TheSystem.Tools.OpenHammerOptimization();
% 运行优化10秒(超时设置)
HammerOpt.RunAndWaitWithTimeout(10);
% 终止并等待优化完全停止
HammerOpt.Cancel();
HammerOpt.WaitForCompletion();
HammerOpt.Close();
fprintf(">>>锤形优化完成\n");
fprintf(">>>优化时长:\n");
toc; % 输出耗时
%% =============== 7. 保存文件 ==============
% 保存结果到上面设好的文件路径(testFile2)
TheSystem.Save();
✨感谢阅读,您的点赞是我持续分享的动力。喜欢的话麻烦下方点个赞吧!✨

|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?注册
×
评分
-
查看全部评分
|