吾爱光设

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

[技术文章] Zemax—Matlab API 交互教程(7)_打开文件并进行优化

[复制链接]
  • TA的每日心情
    慵懒
    2025-10-13 09:48
  • 签到天数: 310 天

    [LV.8]以坛为家I

    26

    主题

    46

    回帖

    5

    积分

    小白

    积分
    5
    发表于 2025-10-13 16:05 | 显示全部楼层 |阅读模式
    本帖最后由 伊人在水一方 于 2025-10-13 16:14 编辑


    Zemax—Matlab API 交互教程(7)_打开文件并进行优化


    附件:

    注意:
    1.此帖子需要先运行《
    Zemax—Matlab API 交互教程(5)》,以获取必要的.zmx文件
    2.此帖子的核心内容和教程(3)中的一样:《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
    Zemax—Matlab API 交互教程(3) _插入操作数并进行优化:http://www.optzmx.com/thread-42095-1-1.html
    Zemax—Matlab API 交互教程(4) _批量添加操作数_从高斯光到平顶光:http://www.optzmx.com/thread-42099-1-1.html
    Zemax—Matlab API 交互教程(5)_新文件和快速聚焦:http://www.optzmx.com/thread-42325-1-1.html
    Zemax—Matlab API 交互教程(6)_NSC光线追迹:http://www.optzmx.com/thread-42382-1-1.html


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

    % 代码功能:
    % 打开API文件(…\Samples\API\Matlab\e01_new_file_and_quickfocus.zos)
    % 将一些表面半径设为变量,通过插入操作数和调整参数值,手动生成约束空气和材料厚度、目标像散和彗差的评价函数。
    % 运行局部优化直至完成,然后运行锤形优化器10秒。

    % 注意,运行此代码之前需要先运行《Zemax—Matlab API 交互教程(5)_新文件和快速聚焦》:http://www.optzmx.com/thread-42325-1-1.html
    % 以生成一个zemax文件,后文需要用到:
    % 或者先运行官方示例代码:  Documents\Zemax\ZOS-API SampleCode\MATLAB\MATLABStandalone_01_new_file_and_quickfocus.m


    % 本代码参考官方示例: Documents\Zemax\ZOS-API SampleCode\MATLAB\MATLABStandalone_03_open_file_and_optimise.m

    % 代码已测试成功
    % 相关附件已上传

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

    clc; clear; close all;
    %% =============== 1. 初始化 Zemax 连接 ===============
    % 添加路径,此路径为你的:文档\Zemax\ZOS-APIProjects\MATLABZOSConnection1  
    addpath("C:\Users\Documents\Zemax\ZOS-APIProjects\MATLABZOSConnection1");

    TheApplication = MATLABZOSConnection1;
    TheSystem = TheApplication.PrimarySystem;


    %% =============== 2. 创建文件存放文件夹 ===============

    sampleDir = TheApplication.SamplesDir;  % 获取官方示例文件目录路径,SamplesDir表示的路径是: Documents\Zemax\SAMPLES

    apiPath = System.String.Concat(TheApplication.SamplesDir, '\API\Matlab');% 构建文件夹:/Samples/API/Matlab

    % 如果文件夹不存在,则创建
    if (exist(char(apiPath)) == 0)
       mkdir(char(apiPath));
    end

    %% =============== 3. 打开文件并另存为 ===============

    % 原始示例文件路径
    testFile = System.String.Concat(sampleDir, '\API\Matlab\e01_new_file_and_quickfocus.zos');

    % 检查依赖文件是否存在,需要先运行Documents\Zemax\ZOS-API SampleCode\MATLAB\MATLABStandalone_01_new_file_and_quickfocus.m

    if (exist(char(testFile)) == 0)
        fprintf('错误:需要先运行示例01才能执行本程序\n');
        r = [];
        return;
    end

    TheSystem.LoadFile(testFile, false);% 加载示例文件(参数false表示不保存当前系统)
    % 新建文件保存路径,也可以自定义文件名、该后缀为.zmx文件
    testFile2 = System.String.Concat(sampleDir, '\API\Matlab\e03_open_file_and_optimise.zos');
    % 将系统另存为新文件
    TheSystem.SaveAs(testFile2);

    %% =============== 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();



    ✨感谢阅读,您的点赞是我持续分享的动力。喜欢的话麻烦下方点个赞吧!✨




    本帖子中包含更多资源

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

    ×

    评分

    参与人数 1金币 +3 收起 理由
    confus + 3 很给力!

    查看全部评分

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

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2025-10-14 08:10 , Processed in 0.140625 second(s), 25 queries .

    Powered by Discuz! X3.5

    © 2001-2025 Discuz! Team.

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