吾爱光设

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

[技术文章] Zemax—Matlab API 交互教程(3) _插入操作数并进行优化

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

    [LV.8]以坛为家I

    22

    主题

    43

    回帖

    4

    积分

    小白

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



    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


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




    2.在MATLAB中打开.m(见附件Interactive_Extension_optimise.m)文件,点击运行:


    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    % 通过设置透镜变量,写入操作数进行优化,其中包括局部优化和锤形优化
    % 参考官方示例代码:"C:\Users\Documents\Zemax\ZOS-API SampleCode\MATLAB\MATLABStandalone_03_open_file_and_optimise.m"
    % 代码已测试成功
    % 相关附件已上传
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

    clc; clear; close all;
    %% =============== 1. 需要你设置的变量 ===============
    % 添加路径,此路径为你的文档\Zemax\ZOS-APIProjects\MATLABZOSConnection1  
    addpath("C:\Users\quinc\Documents\Zemax\ZOS-APIProjects\MATLABZOSConnection1");
    % 你的 .zmx 文件路径
    zmxPath = "C:\Users\quinc\Desktop\ZEMAX_API教程\test\e01_new_file_and_quickfocus.zmx";

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

    TheApplication = MATLABZOSConnection1;

    %% =============== 3. 系统初始化 ===============

    % 获取当前光学系统对象
    TheSystem = TheApplication.PrimarySystem;

    % 加载示例文件(参数false表示不保存当前系统,如果是truezemax会先保存打开的系统,然后进行后续操作)
    TheSystem.LoadFile(zmxPath, false);
    fprintf(">>>已读取到zemax文件\n");


    % 新建文件保存路径,注意,路径后面要填上保存后的文件名称,后缀可为.zmx或者.zos
    saveFile = "C:\Users\Desktop\ZEMAX_API教程\test\new.zmx";
    % 将系统另存为新文件
    TheSystem.SaveAs(saveFile);

    %% =============== 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;   % 设置权重

    % 设置参数位置(表面13

    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; % 使用8CPU核心
    % 运行优化直到完成
    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();
    fprintf(">>>文件已另存为:%s\n",saveFile);

    本帖子中包含更多资源

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

    ×

    评分

    参与人数 1贡献值 +1 收起 理由
    知音2020 + 1 很给力!

    查看全部评分

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

    使用道具 举报

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

    本版积分规则

    关闭

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

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

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

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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