0

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

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

1 回答 1

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

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

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

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

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

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

于 2016-02-22T19:43:16.127 回答