ZEMAX中的编程 ZOS-API 介绍以及应用 1

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

输出结果

优化前:
在这里插入图片描述
优化后:
在这里插入图片描述

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-02-02 09:16:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-02-02 09:16:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-02-02 09:16:02       82 阅读
  4. Python语言-面向对象

    2024-02-02 09:16:02       91 阅读

热门阅读

  1. domino 管理员常见命令

    2024-02-02 09:16:02       44 阅读
  2. 标准的排序组合-算法

    2024-02-02 09:16:02       48 阅读
  3. React16源码: React中event事件系统初始化源码实现

    2024-02-02 09:16:02       52 阅读
  4. 面试 CSS 框架八股文十问十答第四期

    2024-02-02 09:16:02       61 阅读
  5. 51单片机——电动车报警器

    2024-02-02 09:16:02       54 阅读
  6. 类加载器与双亲委派模型

    2024-02-02 09:16:02       55 阅读
  7. 关于字符串的常用方法

    2024-02-02 09:16:02       46 阅读
  8. Docker进阶篇-Docker微服务实战

    2024-02-02 09:16:02       44 阅读
  9. Git提交忽略指定文件

    2024-02-02 09:16:02       48 阅读