新旧OpenMDAO

时间:2016-02-22 19:18:45

标签: openmdao

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

  1. 当旧的OpenMDAO进行自动有限差分时,它是仅对优化所需的输出和输入进行的,还是计算所有输入和输出的整个雅可比行列?转向' force_fd'对于新的OpenMDAO也是同样的问题。真的。
  2. 你能提供一个组件雅可比行列的某些部分,其余部分是否有限差分?在旧的OpenMDAO中,除了你把missing_deriv_policy =' assume_zero'?
  3. 之外,没有提供任何渐变的有限差异。

1 个答案:

答案 0 :(得分:2)

  1. 因此,旧的OpenMDAO寻找没有衍生物的组件组,并将它们捆绑在一起,形成一个可以有限差分的组。新的OpenMDAO不会这样做,所以这些组件中的每一个都是有限差分的。

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

  3. 我怀疑可能正在发生的事情是,在经典的OpenMDAO中,有限差分组恰好更好。考虑一个具有一个输入的组件和一个连接到具有10个输入和1个输出的第二个组件的10个输出。如果将它们有限地区分开来,则只需执行一次。如果你单独地对它们进行有限差分,则需要执行第一个组件,并执行组件二的10次执行。这可能会导致明显甚至是重大的性能损失。

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

    Luckilly,新的OpenMDAO有一种方法可以重新创建旧的OpenMDAO,但它不是自动的。您需要做的是查看您的模型并找出哪些组件可以一起FD,然后创建一个子组并将这些组件移动到该组中。您可以在组中将fd_options['force_fd']设置为True,并将它组合在一起的有限差异。例如,如果你有A - > B - > C,中间没有任何组件,没有组件,你可以将A,B和C移动到一个新的子组中,并将force_fd设置为True。

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