TA的每日心情 | 奋斗 2025-9-13 14:33 |
---|
签到天数: 288 天 [LV.8]以坛为家I
小白
- 积分
- 4
|
本帖最后由 伊人在水一方 于 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()方法可精准设置每个操作数不同单元格的数值类型(整型或浮点型)。
% Target和Weight属性则分别用于指定操作数的目标值与优化权重。
% 注意:代码部分为示例框架,实际使用时需根据具体光学系统和优化目标调整操作数类型、参数及优化配置。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% 插入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; % 使用8个CPU核心
% 运行优化直到完成
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
%}
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?注册
×
|