吾爱光设

会员须知
会员须知
实用帮助
实用帮助
查看: 1818|回复: 9

[求助] [已解决]CODEV表面切线斜率?

[复制链接]
  • TA的每日心情
    奋斗
    2024-11-5 08:39
  • 签到天数: 449 天

    [LV.9]以坛为家II

    86

    主题

    708

    回帖

    43

    积分

    新手

    积分
    43
    发表于 2023-12-29 13:13 | 显示全部楼层 |阅读模式
    佬们,CODEV去控制表面切线斜率,只能Y相减,Z相减,然后相除,得到斜率吗?这样挺麻烦的。
    ZEMAX是可以直接通过矢高,然后来读斜率的,虽然也很麻烦,但感觉比CODEV要稍微方便一点。
    请问有可以直接求出表面对应矢高切线斜率(角度)的特定用法吗?

    最佳答案
    2024-5-9 20:04
    正好最近也在研究SDERIVF这个函数,感觉也研究的比较明白了,也分享一点个人的经验。
    关于SDERIVF的使用方法
    1. 新建一个.seq文件,比如function.seq,然后在这个文件中写入自定义函数@slope,@slope函数中包含SDERIVF并返回你所需要的值,比如说某个特定点的矢高、斜率、二阶导数,具体的写法可以参考帖子里其他小伙伴给出的写法或者翻阅CODE V手册(注1);
    2. 在自己的优化文件aut.seq中写入一下两行
    DRO FCT SLOPE
    IN SLOPE
    其中DRO这一行是为了清除可能已经存在的自定义函数slope,为什么要加这一行感兴趣可以看看后面的内容。IN这一行则是为了调用我们的slope.seq,这一行写成IN SLOPE.SEQ也是可以正常运行的。需要注意的是aut.seq和slope.seq需要放在同一个文件夹下;
    3. 在约束部分可以调用自定义函数@slope,例如@suf_slope == @slope,此时给出的约束数值就是@slope的返回值;
    4. 自定义函数也可以接受一些SDERIVF的变量,例如面数、变焦位置等,这样可以复用同一个自定义文件。

    关于为什么SDERIVF使用比SAGF麻烦?
    我认为是因为SDERIVF所返回的数据类型导致的,与SAGF返回单个值不同,SDERIVF返回的是一个6个数据的数组,并存在指定的长度为6的一维数组变量^data(6)中。因此我们需要定义^data来存储这一系列数组,但是在CODE V的宏语言中,变量定义要先于任何可执行指令,这就意味着要把变量放在AUT之前,但是如果把变量放在AUT之前,SDERIVF并不能接受到这个变量,会认为这个变量没有被定义……所以直接调用这条路被挡住了。
    接下来是为什么自定义函数要放在第二个.seq文件里去调用。其实直接把自定义函数写在AUT之前,是有概率正常运行的,但是留有一个隐患就是有时候中断.seq的运行会使得自定义函数@slope保留在变量空间内,这就是为什么要有DRO这一行指令来清理掉SLOPE。那理论上我们可以按照FCT-AUT-GO-DRO或者DRO-FCT-AUT-GO来保证自定义函数被及时清理。我一开始也是这么想的,结果发现CODE V在执行.seq的时候会把编译自定义函数放在最前面,而非顺序编译。也就是说即使写成DRO-FCT-AUT-GO,最开始也是先编译FCT,如果这个时候变量空间已经有了这个函数,那么就会报错“该函数已经被定义”,DRO没有被执行(当然我也好奇有没有优先度更高的清楚指令,希望有知道的小伙伴也分享一下)。把FCT放在另一个.seq文件,就是为了保证DRO的执行,因为这种情况下的运行顺序是DRO-IN-(进入到.seq中编译FCT)-AUT-GO,这样就能让程序稳定运行而不出错。
    相比之下SAGF只返回单个数值,因此可以在特定约束中直接调用,而我们写的function.seq本质上也是在将SDERIVF变成一个只返回单个量的函数。


    1. 当在自定义函数中使用SDERIVF时必须要定义一个变量来接受SDERIVF的返回值(也就是^a == SDERIVF()里的^a),因为这样SDERIVF才会被视作一个函数(function)而不是指令(command)。后者会报错:自定义函数中无法使用指令。

    本帖子中包含更多资源

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

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

    使用道具 举报

  • TA的每日心情
    无聊
    2024-7-12 14:59
  • 签到天数: 574 天

    [LV.9]以坛为家II

    22

    主题

    431

    回帖

    80

    积分

    入门

    积分
    80
    发表于 2023-12-29 13:36 | 显示全部楼层
    养成翻手册的好习惯,F1-SDERIVF。另外论坛已经好多人问过类似问题了,自己检索一下也可以,没必要那么懒
    发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2024-11-5 08:39
  • 签到天数: 449 天

    [LV.9]以坛为家II

    86

    主题

    708

    回帖

    43

    积分

    新手

    积分
    43
     楼主| 发表于 2024-1-2 10:20 | 显示全部楼层
    shishenlaoba 发表于 2023-12-29 13:36
    养成翻手册的好习惯,F1-SDERIVF。另外论坛已经好多人问过类似问题了,自己检索一下也可以,没必要那么懒

    哥,搜是搜到了,但是最后一个的用法不会用。。。。。。。。尝试过许多次,还是没搞明白

    本帖子中包含更多资源

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

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

    使用道具 举报

  • TA的每日心情

    2024-11-4 10:16
  • 签到天数: 1017 天

    [LV.10]以坛为家III

    14

    主题

    654

    回帖

    211

    积分

    初级

    积分
    211
    发表于 2024-1-29 11:04 | 显示全部楼层
    hhhddd 发表于 2024-1-2 10:20
    哥,搜是搜到了,但是最后一个的用法不会用。。。。。。。。尝试过许多次,还是没搞明白

    sderivf函数要用自定义函数去编写,调用返回自定义函数获取output中的参数,从使用便捷性上,远比不过y相减再相除高效。
    发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2024-11-5 08:39
  • 签到天数: 449 天

    [LV.9]以坛为家II

    86

    主题

    708

    回帖

    43

    积分

    新手

    积分
    43
     楼主| 发表于 2024-1-29 13:05 | 显示全部楼层
    Gavin_1 发表于 2024-1-29 11:04
    sderivf函数要用自定义函数去编写,调用返回自定义函数获取output中的参数,从使用便捷性上,远比不过y相 ...

    这个确实,我也感觉到了,不管是用这个,还是用表面入射角的那个函数,感觉都起不到太大作用,可能加权重会好很多,YZ相减虽然比较麻烦点,但确实效果好些
    发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
    回复

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-11-5 10:01
  • 签到天数: 387 天

    [LV.9]以坛为家II

    2

    主题

    58

    回帖

    4

    积分

    小白

    积分
    4
    发表于 2024-4-22 21:02 | 显示全部楼层
    hhhddd 发表于 2024-1-2 10:20
    哥,搜是搜到了,但是最后一个的用法不会用。。。。。。。。尝试过许多次,还是没搞明白

    ...

    大哥你研究明白了吗?我尝试了好久一直没成功,手册翻来覆去也看不明白,论坛里也没搜到准确的用法
    发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
    回复

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-11-5 10:01
  • 签到天数: 387 天

    [LV.9]以坛为家II

    2

    主题

    58

    回帖

    4

    积分

    小白

    积分
    4
    发表于 2024-4-22 21:07 | 显示全部楼层
    违规腻称12138 发表于 2024-4-22 21:02
    大哥你研究明白了吗?我尝试了好久一直没成功,手册翻来覆去也看不明白,论坛里也没搜到准确的用法
    ...

    虽然可以用SAGF,但我也想学会用SDERIVF控制斜率
    发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2024-11-5 09:10
  • 签到天数: 254 天

    [LV.8]以坛为家I

    5

    主题

    67

    回帖

    11

    积分

    小白

    积分
    11
    发表于 2024-5-9 17:49 | 显示全部楼层
    本帖最后由 HyperXF 于 2024-5-9 17:51 编辑
    违规腻称12138 发表于 2024-4-22 21:07
    虽然可以用SAGF,但我也想学会用SDERIVF控制斜率

    FCT @angle(num ^z,num ^Surno, num ^Rad, num ^x)

    lcl num ^output(6)
    gbl num ^pi
    ^pi == 3.141592653589

    if ^x = 2
    ^angle == sderivf(^Surno,^z,^Rad,0,^output)
    ^Solve == atanf(^output(^x))*180/^pi
    else if ^x = 4
    ^angle== sderivf(^Surno,^z,^Rad,0,^output)
    ^Solve == atanf(^output(^x))*180/^pi
    else
    ^angle == sderivf(^Surno,^z,0,^Rad,^output)
    ^Solve == atanf(^output(^x))*180/^pi
    end if

    end fct ^solve



    可以参考这个宏,不仅可以得到斜率还可以得到二阶导等等

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

    使用道具 举报

  • TA的每日心情
    开心
    2024-11-6 08:22
  • 签到天数: 135 天

    [LV.7]常住居民III

    0

    主题

    34

    回帖

    6

    积分

    小白

    积分
    6
    发表于 2024-5-9 20:04 | 显示全部楼层    本楼为最佳答案   
    正好最近也在研究SDERIVF这个函数,感觉也研究的比较明白了,也分享一点个人的经验。
    关于SDERIVF的使用方法
    1. 新建一个.seq文件,比如function.seq,然后在这个文件中写入自定义函数@slope,@slope函数中包含SDERIVF并返回你所需要的值,比如说某个特定点的矢高、斜率、二阶导数,具体的写法可以参考帖子里其他小伙伴给出的写法或者翻阅CODE V手册(注1);
    2. 在自己的优化文件aut.seq中写入一下两行
    DRO FCT SLOPE
    IN SLOPE
    其中DRO这一行是为了清除可能已经存在的自定义函数slope,为什么要加这一行感兴趣可以看看后面的内容。IN这一行则是为了调用我们的slope.seq,这一行写成IN SLOPE.SEQ也是可以正常运行的。需要注意的是aut.seq和slope.seq需要放在同一个文件夹下;
    3. 在约束部分可以调用自定义函数@slope,例如@suf_slope == @slope,此时给出的约束数值就是@slope的返回值;
    4. 自定义函数也可以接受一些SDERIVF的变量,例如面数、变焦位置等,这样可以复用同一个自定义文件。

    关于为什么SDERIVF使用比SAGF麻烦?
    我认为是因为SDERIVF所返回的数据类型导致的,与SAGF返回单个值不同,SDERIVF返回的是一个6个数据的数组,并存在指定的长度为6的一维数组变量^data(6)中。因此我们需要定义^data来存储这一系列数组,但是在CODE V的宏语言中,变量定义要先于任何可执行指令,这就意味着要把变量放在AUT之前,但是如果把变量放在AUT之前,SDERIVF并不能接受到这个变量,会认为这个变量没有被定义……所以直接调用这条路被挡住了。
    接下来是为什么自定义函数要放在第二个.seq文件里去调用。其实直接把自定义函数写在AUT之前,是有概率正常运行的,但是留有一个隐患就是有时候中断.seq的运行会使得自定义函数@slope保留在变量空间内,这就是为什么要有DRO这一行指令来清理掉SLOPE。那理论上我们可以按照FCT-AUT-GO-DRO或者DRO-FCT-AUT-GO来保证自定义函数被及时清理。我一开始也是这么想的,结果发现CODE V在执行.seq的时候会把编译自定义函数放在最前面,而非顺序编译。也就是说即使写成DRO-FCT-AUT-GO,最开始也是先编译FCT,如果这个时候变量空间已经有了这个函数,那么就会报错“该函数已经被定义”,DRO没有被执行(当然我也好奇有没有优先度更高的清楚指令,希望有知道的小伙伴也分享一下)。把FCT放在另一个.seq文件,就是为了保证DRO的执行,因为这种情况下的运行顺序是DRO-IN-(进入到.seq中编译FCT)-AUT-GO,这样就能让程序稳定运行而不出错。
    相比之下SAGF只返回单个数值,因此可以在特定约束中直接调用,而我们写的function.seq本质上也是在将SDERIVF变成一个只返回单个量的函数。


    1. 当在自定义函数中使用SDERIVF时必须要定义一个变量来接受SDERIVF的返回值(也就是^a == SDERIVF()里的^a),因为这样SDERIVF才会被视作一个函数(function)而不是指令(command)。后者会报错:自定义函数中无法使用指令。
    发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2021-11-16 11:11
  • 签到天数: 49 天

    [LV.5]常住居民I

    8

    主题

    69

    回帖

    7

    积分

    小白

    积分
    7
    发表于 2024-6-14 19:09 | 显示全部楼层
    kmty9216 发表于 2024-5-9 20:04
    正好最近也在研究SDERIVF这个函数,感觉也研究的比较明白了,也分享一点个人的经验。
    关于SDERIVF的使用方 ...

    不用那么麻烦吧,aut之前定义成gbl,go之后dro就好了
    发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
    回复

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-11-6 08:31 , Processed in 0.125000 second(s), 25 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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