首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >新旧OpenMDAO的有限差分

新旧OpenMDAO的有限差分
EN

Stack Overflow用户
提问于 2016-02-22 19:18:44
回答 1查看 103关注 0票数 0

因此,我正在将代码从旧的OpenMDAO转换为新的OpenMDAO。所有的输出和偏梯度都被证实是正确的。起初,这个问题根本不会优化,然后我意识到旧代码中有一些组件没有提供梯度,所以它们会自动地被有限差分。因此,我在这些组件中添加了fd‘’force_fd‘= True,但它仍然没有优化到正确的值。我检查了总导数,结果仍然不正确。与旧的OpenMDAO相比,每次迭代也要花费相当长的时间。要使我的新代码优化到与旧的OpenMDAO代码相同的值,唯一的方法是将每个组件设置为有限差分,即使是在提供梯度的组件上。关于旧的和新的OpenMDAO之间的有限差分是如何工作的,我有几个问题:

  1. 当旧的OpenMDAO做自动有限差分时,它是只对优化所需的输出和输入进行计算,还是对所有的输入和输出计算整个雅可比?对于新的OpenMDAO,当您将“force_fd”转换为True时,也会遇到相同的问题。
  2. 你能提供一个部件的Jacobian的某些部分,其余的部分有有限差分吗?在旧的OpenMDAO中,是否存在有限差分,除非将missing_deriv_policy =‘missing_deriv_policy_零’放入,否则没有提供任何梯度?
EN

回答 1

Stack Overflow用户

发布于 2016-02-22 19:43:16

  1. 因此,旧的OpenMDAO寻找一组没有导数的组件,并将它们捆绑在一起,形成一个可以有限差分在一起的组。新的OpenMDAO不能做到这一点,所以每个组件都是有限差分的。
  2. 我们还不支持这一点,在旧的OpenMDAO中也不支持。我们确实有一个关于我们的关键跟踪器的故事,所以我们最终会有这个功能。

我怀疑可能会发生的是,有限差分分组恰好在经典的OpenMDAO中更好。考虑一个具有一个输入和10个输出的组件与具有10个输入和1个输出的第二个组件连接。如果有限地将它们相加,只需要执行一次。如果您分别对它们进行有限差分,则需要执行一次组件一次,以及执行十次组件二。这可能会导致一个明显的,甚至主要的性能打击。

如果有一个重要的输入与其他变量有很大的不同,那么单个FD和组FD也会导致准确性问题,因此默认的FD步长1.0e-6是不好的。(注意:您可以在添加param或step_size输出并重写该var的默认值时设置该变量。)

幸运的是,新OpenMDAO有一种方法可以重新创建旧OpenMDAO中的内容,但它不是自动的。您需要做的是查看您的模型,并确定哪些组件可以放在一起,然后创建一个子组并将这些组件移动到该组中。您可以在组上将fd_options['force_fd']设置为True,然后将该组的有限差分设置为True。因此,例如,如果您有A -> B -> C,中间没有组件,也没有导数,您可以将A、B和C移动到一个新的子组中,force_fd设置为True。

如果这不能解决问题,我们可能不得不更深入地研究你的模型。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35562004

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档