吾爱光设

 找回密码
 注册
会员须知
会员须知
实用帮助
实用帮助
查看: 138|回复: 0

[技术文章] Zemax—Matlab API 交互教程(4) _批量添加操作数_从高斯光到平顶光

  [复制链接]
  • TA的每日心情
    奋斗
    2025-9-13 14:33
  • 签到天数: 288 天

    [LV.8]以坛为家I

    22

    主题

    43

    回帖

    4

    积分

    小白

    积分
    4
    发表于 2025-9-12 10:37 | 显示全部楼层 |阅读模式
    本帖最后由 伊人在水一方 于 2025-9-12 10:53 编辑


    Zemax—Matlab API 交互教程(4) _批量添加操作数_从高斯光到平顶光



    附件:




    相关教程:
    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

    1.在配置光学系统的评价函数时,经常需要批量添加多个相同类型的操作数。手动逐个添加费时费力下,而且容易出错,借助Zemax提供的API进行自动化批量处理,以下示例演示了如何通过 Matlab循环结构自动插入指定数量的操作数,并设置其参数属性。


    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

    % 在下面的代码中,我们利用 for循环控制结构实现了操作数的批量添加与参数配置。
    % GetCellAt()方法可精准设置每个操作数不同单元格的数值类型(整型或浮点型)。
    % TargetWeight属性则分别用于指定操作数的目标值与优化权重。
    % 注意:代码部分为示例框架,实际使用时需根据具体光学系统和优化目标调整操作数类型、参数及优化配置。

    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

    %% 插入num个操作数
    for N = 1:num
        % 插入新操作数
       TheMFE.AddOperand();   % 添加一行操作数
        Operand =TheMFE.GetOperandAt(N);  % 获取插入的操作数

        % 设置操作数类型
        Operand.ChangeType(ZOSAPI.Editors.MFE.MeritOperandType.XXXX);% XXXX为操作数

        % 设置操作数的具体参数,可通过循环添加不同的值
       Operand.GetCellAt(2).IntegerValue = N;
       Operand.GetCellAt(3).DoubleValue = 1;
        % ......继续设置其他参数

        % 设置目标值
        Operand.Target =N*0.1;  % 目标值

        % 设置权重
        Operand.Weight =1;

    end




    2.下面进一步提供一个完整的MATLAB自动化批量写入操作数并进行局部优化流程示例,以实现将圆形高斯光分布转换为圆形平顶光分布。代码参考相关的ZPL宏,ZPL宏代码(Beam Homogenizer-Updated.ZPL)贴在文后,官方宏参考链接:如何设计高斯到顶帽光束整形器 – Ansys Optics



    2.1 在ZEMAX中点击“ZOS-API.NET接口”选项卡中的“交互扩展”


    2.2 在MATLAB中打开示例文件:Beam_Homogenizer_Updated_matlab.m,点击运行,在ZEMAX界面可以看到显示操作数正在写入的过程。待优化完成,刷新界面会发现高斯光已经变成了平顶光






    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%



    % 通过控制操作数优化非球面半径,将圆形高斯光转化为圆形平顶光

    % 代码已测试成功

    % 相关附件已上传

    % 此代码根据ZPL代码改写为MATLAB代码,原ZPL见文末,关于该宏的官方链接:
    %https://optics.ansys.com/hc/en-us/articles/42661743954835-How-to-design-a-Gaussian-to-Top-Hat-beam-shaper


    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

    clc; clear; close all;


    %% =============== 1. 需要你设置的变量 ===============
    % 添加路径,此路径为你的文档\Zemax\ZOS-APIProjects\MATLABZOSConnection1  
    addpath("C:\Users\Documents\Zemax\ZOS-APIProjects\MATLABZOSConnection1");

    % 你的 .zmx 文件路径
    zmxPath = "Zemax—Matlab API 交互教程(4) _批量添加操作数_从高斯光到平顶光\Beam Homogenizer-Updated.zmx";

    %% =============== 2. 初始化 Zemax 连接===============

    TheApplication = MATLABZOSConnection1;
    TheSystem = TheApplication.PrimarySystem;
    % 加载你的 .zmx 文件
    TheSystem.LoadFile(zmxPath, false);


    %% =============== 3. Main:将圆形高斯光转化为圆形平顶光 ===============

    TheLDE = TheSystem.LDE; % 镜头数据表

    % 高斯光束参数
    W = 5;               % 输入高斯束腰半径
    K = 15;              % 输出光束半径
    sample = 80;         % 光瞳采样数
    apod_factor = 1 / (1/3)^2; % 1/3是光束腰与入瞳半径的比率

    % 修改系统参数设置
    TheSystemData = TheSystem.SystemData;
    TheSystemData.Aperture.ApertureType =ZOSAPI.SystemData.ZemaxApertureType.EntrancePupilDiameter; % 入瞳直径
    TheSystemData.Aperture.ApertureValue = W*6;  % # 设置入瞳直径为光束腰的6倍(入瞳半径为光束腰的3倍),以便采样充分覆盖光束腰以外的区域
                        

    % 设置光阑类型为高斯和切趾因子
    TheSystemData.Aperture.ApodizationType =ZOSAPI.SystemData.ZemaxApodizationType.Gaussian;
    TheSystemData.Aperture.ApodizationFactor = apod_factor; % 设置系统的apodization因子,使得1/e^2强度点位于光束腰W处,入瞳半径仍为3*W


    % 修改第一个视场点的 X=1.0, Y=2.0
    sysField = TheSystem.SystemData.Fields;
    field1 = sysField.GetField(1);
    field1.X = 0.0;
    field1.Y = 0.0;


    % 波长
    sysWave = TheSystem.SystemData.Wavelengths;
    sysWave.GetWavelength(1).Wavelength = 0.633;

    %% 函数编辑器(MFE)接口
    TheMFE = TheSystem.MFE;
    TheMFE.ShowEditor(); % 显示优化函数编辑器
    TheSystem.MFE.CalculateMeritFunction();  % 刷新计算

    % 获取系统中所有表面的数量
    NumberOfSurfaces = TheLDE.NumberOfSurfaces();  
    image = NumberOfSurfaces - 1;  % 像面所在位置

    % 插入操作数并设置

    for I = 1:sample+1

        % 插入新操作数
       TheMFE.AddOperand();  
        Operand =TheMFE.GetOperandAt(I);  % 获取插入的操作数

        % 设置操作数类型为 REAY
       Operand.ChangeType(ZOSAPI.Editors.MFE.MeritOperandType.REAY);

        % 设置操作数的面
       Operand.GetCellAt(2).IntegerValue = image;  % 设置像面(表面编号)

        % 设置波长(此处假设使用第1个波长)
       Operand.GetCellAt(3).IntegerValue = 1; % 设置波长索引为1

        % 计算光瞳坐标
        norm_pupil_coord= I / sample;  
        X =norm_pupil_coord * W * 3;  % 未归一化的光瞳坐标

        % 根据公式计算目标值S
        S = K * sqrt(1 -exp(-2 * (X^2) / W^2));  % 输出光束半径

        % 设置光瞳坐标(Px Py
        % Operand.GetCellAt(6).DoubleValue =norm_pupil_coord;  % 设置Px(归一化光瞳坐标)
       Operand.GetCellAt(7).DoubleValue = norm_pupil_coord;  % 设置Py(归一化光瞳坐标)

        % 设置目标值
        Operand.Target =-S;  % 目标值,注意取负值
        % 设置权重
        Operand.Weight =1;  % 权重设为1

    end


    %% 执行优化

    tic; % 开始计时
    fprintf(">>>正在进行局部优化\n");
    % 局部优化设置(阻尼最小二乘法)
    LocalOpt = TheSystem.Tools.OpenLocalOptimization();
    LocalOpt.Algorithm =ZOSAPI.Tools.Optimization.OptimizationAlgorithm.DampedLeastSquares;
    LocalOpt.Cycles =ZOSAPI.Tools.Optimization.OptimizationCycles.Automatic; % 自动循环
    LocalOpt.NumberOfCores = 8; % 使用8CPU核心
    % 运行优化直到完成
    LocalOpt.RunAndWaitForCompletion();
    LocalOpt.Close();
    disp('优化完成');
    fprintf(">>>优化时长:\n");
    toc; % 输出耗时


    %% =============== 4. ZPL代码===============
    %{

    %   ZPL代码

    ! Beam Homogenizer by Nam Kim 10/02/2006
    ! Updated for OpticStudio 15 by Alissa Wersal 8/3/2015
    ! This macro creates Merit Function that generates raytargets neccesary to
    ! optimize Gaussian to Top hap beam homogenizer

    CLOSEWINDOW             # run macro in quite mode (no textoutput window)
    DELETEMFO ALL         # delete the current MF

    W = 5                          # gaussian INPUT beam waist
    K = 25                         # output beam radius
    sample = 80      #pupil sampling


    SYSP 11, W*6     #make the EP Diameter 6 times (EP Radius 3 times) the waist, to

                        # sample well beyod the beam waist

    SYSP 12, 1       #set Gaussian apodization in the system property. Unneccesary for optimization
                        # but needed for analysis using geometricalrays

    apod_factor = 1/POWR((1/3),2)   # 1/3 is the ratio of waist to EP Radius
    SYSP 13, apod_factor       # set the system apodization factor so that the 1/e^2 intensity
                                 # point is at the waist W. The Entrance PupilRaidus is still 3*W

    FOR I, 1, sample+1, 1

             INSERTMFO I                      # insert operand
             SETOPERAND I,11, "REAY"     # set operandtype to REAY
             SETOPERAND I,9, 1                   # set the weight to1

             norm_pupil_coord= I/sample

             X =norm_pupil_coord*W*3     # Un-normalizedpupil coordinate

             S =K*SQRT(1-EXPE(-2*POWR(X,2)/POWR(W,2))) # same as the final equation in thearticle
             SETOPERAND I,8, -S                  # set target.Positive input coordinate has negative
                                                    # output coordinate (positive lens) thus thenegative sign
             SETOPERAND I,7, norm_pupil_coord  # Set Py column ofthe operand
             SETOPERAND I,2, NSUR()    # specify the image surfacefor the REAY value calculation

    NEXT
    OPTIMIZE
    UPDATE ALL    # Updateall windows
    END

    %}




    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?注册

    ×
    发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    联系我们|本论坛只支持PC端注册|手机版|小黑屋|吾爱光设 ( 粤ICP备15067533号 )

    GMT+8, 2025-9-13 15:04 , Processed in 0.093750 second(s), 25 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

    快速回复 返回顶部 返回列表