【问题标题】:Finite difference between old and new OpenMDAO新旧 OpenMDAO 之间的有限差异
【发布时间】:2016-02-23 03:43:16
【问题描述】:

所以我将代码从旧的 OpenMDAO 转换为新的 OpenMDAO。所有输出和部分梯度已被验证为正确。起初这个问题根本没有优化,然后我意识到旧代码有一些不提供梯度的组件,所以它们是自动有限差分的。所以我在这些组件中添加了 fd_options['force_fd'] = True ,但它仍然没有优化到正确的值。我检查了总导数,它仍然不正确。与旧的 OpenMDAO 相比,每次迭代也需要更长的时间。我可以让我的新代码优化到与旧 OpenMDAO 代码相同的值的唯一方法是将每个组件设置为有限差分,即使在提供渐变的组件上也是如此。所以我对新旧 OpenMDAO 之间的有限差分如何工作有几个问题:

  1. 当旧的 OpenMDAO 进行自动有限差分时,它是只对优化所需的输出和输入进行,还是计算所有输入和输出的整个雅可比?当您将“force_fd”设置为 True 时,新的 OpenMDAO 也会出现同样的问题。
  2. 您能否提供组件的雅可比行列式的某些部分,并使其其余部分具有有限差分?在旧的 OpenMDAO 中,除非您输入 missing_deriv_policy = 'assume_zero',否则没有提供任何梯度的有限差分吗?

【问题讨论】:

    标签: openmdao


    【解决方案1】:
    1. 因此,旧的 OpenMDAO 寻找没有导数的组件组,并将它们捆绑在一起成为一个可以有限差分的组。新的 OpenMDAO 不这样做,因此这些组件中的每一个都将分别进行有限差分。

    2. 我们还不支持,旧的 OpenMDAO 也不支持。不过,我们的关键跟踪器确实有一个故事,所以我们最终会拥有这个功能。

    我怀疑您可能会遇到的情况是,有限差分分组恰好在经典 OpenMDAO 中更好。考虑一个具有 1 个输入和 10 个输出的组件连接到具有 10 个输入和 1 个输出的第二个组件。如果将它们有限差分在一起,则只需要执行一次。如果您分别对它们进行有限差分,则需要执行一次组件一,以及执行 10 次组件二。这可能会导致明显甚至严重的性能损失。

    如果有一个重要输入的缩放比例与其他变量有很大不同,那么单个 FD 与组 FD 也会导致精度问题,因此默认的 FD 步长 1.0e-6 是不好的。 (注意:您可以在添加参数或输出时设置step_size,它会覆盖该变量的默认值。)

    幸运的是,新的 OpenMDAO 可以重新创建旧 OpenMDAO 中的内容,但这不是自动的。您需要做的是查看您的模型并找出可以将哪些组件一起FD,然后创建一个子组并将这些组件移动到该组中。您可以在组上将fd_options['force_fd'] 设置为True,并且该组的差异有限。因此,例如,如果您有 A -> B -> C,中间没有组件,并且没有派生项,您可以将 A、B 和 C 移动到一个新的子组中,并将 force_fd 设置为 True。

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

    【讨论】:

    • 所以我认为你是对的,但我很难实现它。代码有很多依赖于很多其他组件的组件。我很难在任何地方找到所有有限群。每次我尝试做一个有限差分组时,它总是希望我改变求解器,以便它可以做一个循环。我会尽力而为,但我认为将新的 OpenMDAO 更改为也进行自动有限差分会很棒。谢谢!
    • 如果您的模型非常复杂,以至于您无法轻松识别不提供导数的组件链,那么您可能遇到了需要首先解决的模型复杂性问题。但另一种选择是为所有组件实现派生类!
    猜你喜欢
    • 1970-01-01
    • 2021-11-27
    • 2023-02-16
    • 2018-10-12
    • 1970-01-01
    • 1970-01-01
    • 2012-04-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多