Matlab中固有模式(Standalone Application)下的简单优化
前言
以matlab为演示,matlab可使用两种模式,固有模式和交互模式,选择Standalone Application
固有模式,点击以后,会直接跳转至matlab,并打开其中的matlab模板,具体路径为:C:\Users\admin\Documents\Zemax\ZOS-API Projects 下面MATLABStandaloneApplication文件夹中,一般zemax会自动生成对应的MATLABStandaloneApplication1,MATLABStandaloneApplication2,MATLABStandaloneApplication3,…,等等
上图为部分代码,其中主要修改部分为function [r] = BeginApplication(TheApplication, args)中的代码
一、以双胶合为例的创建以及简单的优化
首先在zemax中创建一个如图所示的双胶合系统:
zemax中存在很多函数可以控制系统,:在固有模式下,此时的zemax类似一个服务器,matlab像是一个控制器,你想让zemax执行什么操作,你在matlab中输入对应的函数即可。
双胶合公共有3个R变量,2个厚度,2个玻璃材料,因为没有空气间隙,其实双胶合类似于单片,从相差来看,厚度并不是主要因素,因此只将3个R以及两个玻璃材料作为变量;边缘厚度如果影响成像质量时合理加厚玻璃即可;玻璃材料直接将玻璃库锁定在设定的库中即可。
二、代码部分
代码如下(示例):
function [r] = BeginApplication(TheApplication, args)
import ZOSAPI.*;
% creates a new API directory
TheSystem = TheApplication.PrimarySystem;
% Add your custom code here...
% 加载一下系统
b_load=TheSystem.LoadFile(System.String.Concat( 'C:\Users\admin\Desktop\matlabtest\LENS.zmx'), false);
% 系统LDE
TheLDE = TheSystem.LDE;
%Add 3 wavelengths: F,d,C
SystExplorer = TheSystem.SystemData;
slPreset = SystExplorer.Wavelengths.SelectWavelengthPreset(ZOSAPI.SystemData.WavelengthPreset.FdC_Visible);
% 设置变量
% 定义面
Surface_1 = TheLDE.GetSurfaceAt(1);
Surface_2 = TheLDE.GetSurfaceAt(2);
Surface_3 = TheLDE.GetSurfaceAt(3);
% 曲率为变量
Solver_V_1 = Surface_1.RadiusCell.CreateSolveType(ZOSAPI.Editors.SolveType.Variable);
Solver_V_2 = Surface_2.RadiusCell.CreateSolveType(ZOSAPI.Editors.SolveType.Variable);
Solver_V_3 = Surface_3.RadiusCell.CreateSolveType(ZOSAPI.Editors.SolveType.Variable);
Surface_1.RadiusCell.SetSolveData(Solver_V_1);
Surface_2.RadiusCell.SetSolveData(Solver_V_2);
Surface_3.RadiusCell.SetSolveData(Solver_V_3);
% 最后一个面厚度为变量
Solver_T_3 = Surface_3.ThicknessCell.CreateSolveType(ZOSAPI.Editors.SolveType.Variable);
Surface_3.ThicknessCell.SetSolveData(Solver_T_3);
% 玻璃设置为替代
Solver_M_1 = Surface_1.MaterialCell.CreateSolveType(ZOSAPI.Editors.SolveType.MaterialSubstitute );
Solver_M_2 = Surface_2.MaterialCell.CreateSolveType(ZOSAPI.Editors.SolveType.MaterialSubstitute );
Surface_1.MaterialCell.SetSolveData(Solver_M_1);
Surface_2.MaterialCell.SetSolveData(Solver_M_2);
% 直接照搬例子即可
%define merit function 定义MF
%load merit function
TheMFE = TheSystem.MFE;
OptWizard = TheMFE.SEQOptimizationWizard;
%Optimize for smallest RMS Spot, which is "Data" = 1
OptWizard.Data = 1;
OptWizard.OverallWeight = 1;
%Gaussian Quadrature with 3 rings (refers to index number = 2)
OptWizard.Ring = 2;
%Set air & glass boundaries
%And click OK!
OptWizard.Apply();
% 插入行并输入EFFL 以及玻璃边缘厚度的操作数
%插入行
MFE_ROW1=TheMFE.InsertNewOperandAt(1);
MFE_ROW2=TheMFE.InsertNewOperandAt(2);
MFE_ROW3=TheMFE.InsertNewOperandAt(3);
MFE_ROW4=TheMFE.InsertNewOperandAt(4);
MFE_ROW5=TheMFE.InsertNewOperandAt(5);
MFE_ROW6=TheMFE.InsertNewOperandAt(6);
MFE_ROW7=TheMFE.InsertNewOperandAt(7);
%
ROW1_EFFL = MFE_ROW1.ChangeType(ZOSAPI.Editors.MFE.MeritOperandType.EFFL );
MFE_ROW1.Target = 100;
MFE_ROW1.Weight = 0.001;
ROW2_ETVA = MFE_ROW2.ChangeType(ZOSAPI.Editors.MFE.MeritOperandType.ETVA );
MFE_ROW2.GetCellAt(2).IntegerValue=1;
ROW3_OPLT = MFE_ROW3.ChangeType(ZOSAPI.Editors.MFE.MeritOperandType.OPLT );
ROW4_OPGT= MFE_ROW4.ChangeType(ZOSAPI.Editors.MFE.MeritOperandType.OPGT );
MFE_ROW3.GetCellAt(2).IntegerValue=2;
MFE_ROW3.Target = 4;
MFE_ROW3.Weight = 0.01;
MFE_ROW4.GetCellAt(2).IntegerValue=2;
MFE_ROW4.Target = 1;
MFE_ROW4.Weight = 0.01;
ROW5_ETVA = MFE_ROW5.ChangeType(ZOSAPI.Editors.MFE.MeritOperandType.ETVA );
MFE_ROW5.GetCellAt(2).IntegerValue=2;
ROW6_OPLT = MFE_ROW6.ChangeType(ZOSAPI.Editors.MFE.MeritOperandType.OPLT );
ROW7_OPGT= MFE_ROW7.ChangeType(ZOSAPI.Editors.MFE.MeritOperandType.OPGT );
MFE_ROW6.GetCellAt(2).IntegerValue=5;
MFE_ROW6.Target = 4;
MFE_ROW6.Weight = 0.01;
MFE_ROW7.GetCellAt(2).IntegerValue=5;
MFE_ROW7.Target = 1;
MFE_ROW7.Weight = 0.01;
% 存储mf
mf_filename = System.String.Concat('C:\Users\admin\Desktop\matlabtest\RMS_Spot_Radius.mf');
TheMFE.SaveMeritFunction(mf_filename);
TheMFE.LoadMeritFunction(mf_filename);
SampleFile = System.String.Concat( 'C:\Users\admin\Desktop\matlabtest\1.ZMX');
% 计算时间
tic;
LocalOpt = TheSystem.Tools.OpenLocalOptimization();
if ~isempty(LocalOpt)
LocalOpt.Algorithm = ZOSAPI.Tools.Optimization.OptimizationAlgorithm.DampedLeastSquares;
LocalOpt.Cycles = ZOSAPI.Tools.Optimization.OptimizationCycles.Automatic;
LocalOpt.NumberOfCores = 8;
fprintf('Local Optimization...\n');
fprintf('Initial Merit Function %6.3f\n', LocalOpt.InitialMeritFunction);
LocalOpt.RunAndWaitForCompletion();
fprintf('Final Merit Function %6.3f\n', LocalOpt.CurrentMeritFunction);
LocalOpt.Close();
end
% Get the elapsed time as a TimeSpan value.
toc;
%存储系统
TheSystem.SaveAs(SampleFile);
r = [];
end
输出结果
优化前:
优化后: