本帖最后由 伊人在水一方 于 2025-9-12 10:43 编辑
Zemax—Matlab API 交互教程(2) _插入评价函数操作数
相关教程:
Zemax—Matlab API 交互教程(1) _初始化:http://www.optzmx.com/thread-42088-1-1.html
1.ZEMAX API MATLAB 评价函数基础设置
TheMFE = TheSystem.MFE; % 获取优化函数编辑器(MFE)接口
TheMFE.ShowEditor(); % 显示评价函数编辑器
TheMFE.AddOperand();% 增加一行操作数
TheSystem.MFE.CalculateMeritFunction();% 刷新计算
Operand.ChangeType(ZOSAPI.Editors.MFE.MeritOperandType.XXXX);% 插入操作数,XXXX为插入的操作数
比如:
Operand_1.ChangeType(ZOSAPI.Editors.MFE.MeritOperandType.REAY);% 插入操作数 REAX,控制实际光线Y向坐标
Operand_1.GetCellAt(2).IntegerValue = 2; % 设置面,GetCellAt(2)是获取该行第3列的表格数据,标题列是第1列,赋值为整数IntegerValue = 1
Operand_1.GetCellAt(3).IntegerValue= 1; % 设置波长
Operand_1.GetCellAt(4).DoubleValue = 0.4; % 设置Hx,注意数据类型为双精度浮点数DoubleValue
Operand_1.GetCellAt(5).DoubleValue= 0.5; % 设置Hy
Operand_1.GetCellAt(6).DoubleValue= 0.6; % 设置Px
Operand_1.GetCellAt(7).DoubleValue= 0.7; % 设置Py
Operand_1.Target= 0.2; % 目标值设为0
Operand_1.Weight= 1.1; % 权重设为10
2.也可以一键设置默认评价函数
%默认评价函数
TheMFE = TheSystem.MFE; % 评价函数编辑器
TheMFE.ShowEditor();
OptWizard =TheMFE.SEQOptimizationWizard;%默认评价函数
OptWizard.StartAt =OptimizationWizard_Start;
% 优化目标:最小化RMS光斑半径(Data=1),进行点列图优化
OptWizard.Data = 1;
OptWizard.OverallWeight = 2;
OptWizard.Ring = 2; % 高斯积分(3环)
% 设置玻璃和空气边界约束
OptWizard.IsGlassUsed = true;
OptWizard.GlassMin = 2.0; % 最小中心厚度(mm)
OptWizard.GlassMax = 20.0;
OptWizard.GlassEdge = 0.5; % 最小边缘厚度(mm)
OptWizard.IsAirUsed = true;
OptWizard.AirMin = 0.5; % 最小空气厚度(mm)
OptWizard.AirMax = 60.0;
OptWizard.AirEdge = 0.5;
OptWizard.Apply(); % 应用设置
3.自动进行局部优化的代码:
% 局部优化设置
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();
disp('优化完成');
4.进行锤形优化的代码:
% 锤形优化全局优化设置
HammerOpt = TheSystem.Tools.OpenHammerOptimization();
% 运行优化10秒(超时设置)
HammerOpt.RunAndWaitWithTimeout(10);
% 终止并等待优化完全停止
HammerOpt.Cancel();
HammerOpt.WaitForCompletion();
HammerOpt.Close();
|