Ansys Zemax|如何自定义优化操作数

news2024/12/23 19:02:41

虽然Zemax OpticStudio有300多个内建优化操作数,但是还是会有一些特殊情况是这300多个操作数无法涵盖的。这就要求使用者根据要求计算出某些特定的数值,将这些数值返回到某个操作数,再对此操作数进行优化。

Zemax OpticStudio支持用户编程,计算出特定的数据,再通过Merit Function Editor(MFE)中的操作数来定义该数据。这些数据可以是独立于Zemax OpticStudio计算的,也可以是由Zemax OpticStudio计算的但是没有具体的优化操作数表达的。当然,不管是上述哪种情况,使用者都可以用以下两种方法计算此数值:

  • 使用ZPL宏语言

  • 使用外部定义和汇编程序

ZPL宏具有容易编写、执行快速、以及和Zemax OpticStudio集成较好的特点。只要使用者具备一点点的编程经验就可以编程计算。

另外ZPLM优化操作数可以用于从评价函数中调用ZPL宏,这样使用者就可以直接使用宏计算出结果并返回到评价函数编辑器中从而实现优化。

本文我们将介绍如何使用宏计算并通过操作数ZPLM将数值返回给评价函数。

附件下载

联系工作人员获取附件

 

使用操作数ZPLM返回宏计算的数值

 

如果您不熟悉如何创建、编辑、保存和执行宏,推荐阅读“编程语言 (ZPL) 简介”,然后再继续本练习。

现在,假设我们需要计算并优化Working F/#。当然Zemax OpticStudio中操作数WFNO已经可以解决此问题,本文只是举一个例子。所以我们可以先假设操作数WFNO不存在,我们需要用宏计算该数值并返回到评价函数中进行优化。Working F/#的定义如下:

图片

其中n为像方空间的折射率, θ为实际边缘光线(Real Marginal Ray)在像空间的角度。根据这些定义,我们需要用宏追迹一条实际光线并计算Working F/#:

图片

注意OPTRETURN关键字的使用,此关键字记录了全局阵列位置0处“X”的结果值。我们在MFE的ZPLM操作数“Dat#”列中填入的就是这个全局阵列的位置数。

图片

上图中“Mac#”对应着宏数。

注意每个被ZPLM操作数调用的宏必须命名为:“ZPLxx.ZPL”的格式,宏数可以是0到99的任何数,因此ZPL17.ZPL是一个有效的文件名,可以通过在MFE中的“Mac#”填入17来调用执行。

本例中,命名该宏为ZPL10.ZPL并保存在合适的文件夹中。在MFE中,插入ZPLM操作数,分别在“Mac#”和“Dat#”中填入10和0。

图片

更新该MFE,执行宏并返回计算得到的数值。

图片

计算返回的Working F/#是4.9782。在MFE中插入操作数WFNO验证宏的正确性。由下图可以看出,两者计算得到的数值相同。

图片

这种方法也可以用于单个宏调用并返回多个数值(如果想了解更多,请参考前文所说的使用者手册),这些值可以用于优化或者仅仅提供一个值给MFE做进一步分析。ZPLM可以提供惊人的速度以及弹性,使用者可以用该操作数计算并优化一些特殊数值。

用户自定义操作数是否会使评价函数计算缓慢?

 

也许您会好奇,在评价函数中使用自定义的操作数时,是否会使得评价函数计算缓慢?其实,这很大程度依赖于您宏计算的复杂程度,一般情况下宏计算是非常快的。

作为演示,我们现在对Cooke Triplet执行两次优化:一次使用ZPLM操作数加上宏,一次使用内建操作数WFNO。

第一种情况,我们将ZPLM的目标值设置为5,权重设置为1。第二种情况,我们将WFNO的目标值设置为5,权重设置为1。按下图设置评价函数:

图片

我们使用DLS优化,可以看到执行的时间大约4.4s:

图片

点击F3撤销优化,将ZPLM操作数权重设置为0,WFNO目标值设置为5,权重设置为1,再次优化。

图片

可以看出两者计算的时间相差并不大。

因此,即使我们使用了自定义的宏,Zemax OpticStudio依旧可以高效的执行计算。

 

总结

 

在使用Zemax OpticStudio的过程中,我们有时会遇到内建的优化操作数不能满足我们要计算/返回的数值情况。这时我们需要利用ZPLM和宏结合或使用外部定义和汇编程序对这些数值进行计算和优化。两种方法,ZPLM和宏结合更为简单,与Zemax OpticStudio集成的更好,需要更少的编程技巧。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2062128.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【SpringCloud】(一文通)多机部署, 负载均衡-LoadBalance

目 录 一. 负载均衡介绍1.2 什么是负载均衡1.3 负载均衡的⼀些实现 二. Spring Cloud LoadBalancer2.1 快速上手2.1.1 使用 Spring Cloud LoadBalancer 实现负载均衡2.1.2 启动多个product-service实例 2.2 负载均衡策略2.3 LoadBalancer 原理 三. 服务部署(Linux)3.2 服务构建…

(24)(24.4) MultiWii/DJI/HDZero OSD (version 4.2 and later)(一)

文章目录 前言 1 基于遥测的OSD 前言 ArduPilot 使用基于MSP(MultiWii 串行协议)的协议支持多种类型的屏幕显示(OSD): 基于 MSP 遥测的操作系统,如大疆 FPV 护目镜 V1/V2、大疆护目镜 RE、FatShark Byte…

QML----QML+VTK+CMake示例

为了创建一个使用QML和VTK的示例项目,并使用CMake进行构建,将遵循以下步骤: 创建C++类以集成VTK和QML:这个类将负责设置VTK渲染数据,并与QML进行交互。设置CMake配置:配置CMake以找到并链接Qt和VTK库。创建QML界面:设计QML界面以显示VTK渲染的内容。编写主函数:初始化应…

C语言实现通讯录-动态版本与文件版本

C语言实现通讯录-动态版本与文件版本 1.前言2.动态版本2.1联系人信息之前的:改版: 2.2初始化之前的:改版: 2.3自动扩容 3.文件版本3.1自动保存函数实现:效果: 3.2打开时加载信息函数实现:效果: …

day37-https实战

1.知识点补充: 四层代理转发数据库 目的: 通过10.0.0.4 使用ssh远程连接到web01 ssh--->10.0.0.4:2222 ---------->172.16.1.7:22 xshell-->创建会话-->10.0.0.4 端口 2222 Linux系统 ssh 10.0.0.4 -p2222作业: 目的: 实现连接10.0.0.4的5555端口转发到后端数据库…

【hot100篇-python刷题记录】【只出现一次的数字】

R5-技巧篇 思路:使用哈希记录次数即可 class Solution:def singleNumber(self, nums: List[int]) -> int:dictdefaultdict(int)for num in nums:dict[num]1for num in nums:if dict[num]1:return num

【hot100篇-python刷题记录】【爬楼梯】

R5-真正的动态规划 动态规划核心&#xff1a; 第i步是怎么来的&#xff08;即动态规划公式&#xff09; 走到第i步阶梯的总方法数sum(走到第i-1步阶梯的总方法数&#xff0c;走到第i-2步阶梯的总方法数) class Solution:def climbStairs(self, n: int) -> int:if n<2:r…

云原生系列 - Nginx(高级篇)

前言 学习视频&#xff1a;尚硅谷Nginx教程&#xff08;亿级流量nginx架构设计&#xff09;本内容仅用于个人学习笔记&#xff0c;如有侵扰&#xff0c;联系删学习文档&#xff1a; 云原生系列 - Nginx(基础篇)云原生系列 - Nginx(高级篇) 一、扩容 通过扩容提升整体吞吐量…

OpenCV resize 的各插值方式的区别与用途

一、resize 函数中 interpolation 参数的区别和用途 cv2.resize 函数中的 interpolation 参数用于指定图像缩放时使用的插值方法。不同的插值方法会影响缩放后图像的质量和处理速度。以下是cv2.INTER_AREA、cv2.INTER_CUBIC、cv2.INTER_NEAREST、cv2.INTER_LINEAR 和 cv2.INTE…

有关应用层面试题有关库的思维导体

面试题目&#xff1a; TCP通信中3次握手和四次挥手&#xff1f; 答&#xff1a; 第一次握手&#xff1a;客户端发送SYN包&#xff08;SYN1, seq0&#xff09;给服务器&#xff0c;并进入SYN_SENT状态&#xff0c;等待服务器返回确认包。第二次握手&#xff1a;服务器接收到S…

什么是Redis大key问题?如何解决?

目录 Key多大算大呢&#xff1f; 识别big key 处理big key Big Key是Redis中存储了大量的数据的Key&#xff0c;不要误以为big key只是表示Key的值很大&#xff0c;他还包括这个Key对应的value占用空间很多的情况&#xff0c;通常在String、list、hash、set、zset等类型中出…

三、Socket多路复用介绍

一、Socket连接方式 二、多路复用 三、Socket连接包含的内容

搭建TestBench,收藏这几条基本框架就够了

Verilog功能模块HDL设计完成后&#xff0c;并不代表设计工作的结束&#xff0c;还需要对设计进行进一步的仿真验证。掌握验证的方法&#xff0c;即如何调试自己的程序非常重要。在RTL逻辑设计中&#xff0c;要学会根据硬件逻辑来写测试程序即写Testbench。Verilog测试平台是一个…

MATLAB中qr函数用法

目录 语法 说明 示例 Q-Less QR 分解 矩阵的完整 QR 分解 置换 QR 分解 用精简 QR 因子求解线性系统 求解稀疏线性系统 求解矩形稀疏线性系统 提示 qr函数的功能是对矩阵进行QR 分解。 语法 R qr(A) [Q,R] qr(A) [Q,R,P] qr(A) [___] qr(A,"econ") […

sklearn转换器和估计器

转换器 实例化一个转换器类 调用fit_transform() 转换器调用有以下几种形式&#xff1a; fit_transform fit transform估计器&#xff08;sklearn机器学习算法的实现&#xff09; 在sklearn中&#xff0c;估计器是一个重要的角色&#xff0c;是一类实现了算法的API 1、用于…

深入理解 C# 中的 dynamic 类型详解与示例

文章目录 1. 什么是 dynamic 类型&#xff1f;2. dynamic 的工作原理3. dynamic 类型的使用4. 使用 dynamic 的场景5. dynamic 的优缺点6. dynamic 类型的注意事项7. 总结 在 C# 编程中&#xff0c;dynamic 类型是一个非常特殊的类型&#xff0c;它在编译时并不会进行类型检查&…

TCP协议中的建立连接机制

目录 客户端与服务器间的三次握手 1、关于SYN_RCVD状态 2、关于系统调用listen的第二个参数 3、为什么服务端操作系统内核中的全连接队列不能太长&#xff1f; 4、服务端操作系统内核中可以没有全连接队列&#xff1f; 客户端与服务器间的三次握手 要想成功创建连接需要客…

【Docker深入浅出】Docker镜像

文章目录 一. Docker镜像简介二. Docker镜像详解1. 镜像和容器的关系2. 镜像通常比较小3. 拉取镜像4. 镜像命名4.1. 镜像仓库服务4.2. 官方和非官方镜像仓库4.3. 镜像的命名和标签 5. 为镜像打多个标签6. 过滤镜像内容6.1. 虚空镜像6.2. 删除虚空镜像6.3. 过滤器与格式化输出 7…

【C++题解】1004 - 编程求1*2*3*...*n

欢迎关注本专栏《C从零基础到信奥赛入门级&#xff08;CSP-J&#xff09;》 问题&#xff1a;1004 - 编程求1 * 2 * 3 * … * n 类型&#xff1a;简单循环 题目描述&#xff1a; 编程求 123⋯n 。 输入&#xff1a; 输入一行&#xff0c;只有一个整数 n(1≤n≤10)&#xf…

监狱单位如何选择适合的FTP传输替代方案?

监狱单位是我国司法体系中的重要组成部分&#xff0c;监狱对于维持社会稳定也有重要作用。监狱的正常运作中&#xff0c;少不了文件的传输。由于监狱的封闭性和特殊性&#xff0c;所有传输到监狱的文件都需要经过严格的审核和登记手续&#xff0c;以确保文件的安全性和合法性。…