【问题标题】:Why are finite differences of static input variables used to calculate the Jacobian? (OpenMDAO 2.4)为什么使用静态输入变量的有限差分来计算雅可比? (OpenMDAO 2.4)
【发布时间】:2019-03-30 07:02:10
【问题描述】:

我一直在使用 SLSQP 算法来运行一些仅与 ExplicitComponents 相关的 MDO 问题。每个组件的运行时间约为 10 秒和 60-100 个输入变量。大多数输入变量是静态输入变量,在整个优化过程中将保持不变。静态输入变量源自IndepVarCompExplicitComponents 是黑盒子,因此没有关于部分的信息。

我注意到,当在 compute_totals() 中计算雅可比行列式时,分量相对于它们的所有输入值都是线性化的。在compute_approximations() 中,计算所有输入值的有限差分,包括静态输入值。所以,我的问题是:为什么要对这些静态输入变量进行有限差分计算?由于值保持不变,我不确定为什么这些信息会有用?

此外,如果我理解正确,组件会被线性化以获得子雅可比,然后用于计算总雅可比。但是,是否可以直接计算整个组的有限差分而不是线性化每个分量?随着我的组件的运行时间和输入变量的数量,执行每个组件的线性化需要很长时间。然而,优化问题只有 3 个设计变量。因此,如果我可以在整个 MDA 上执行三个有限差分计算来计算总雅可比行列式,那么总运行时间将显着减少。

【问题讨论】:

    标签: python openmdao


    【解决方案1】:

    以相反的顺序回答您的问题:

    1) 你能对整个模型而不是每个单独的组件进行 FD 吗?是的!

    您可以在模型中设置FD over any group,包括顶级组。然后 FD 被跨该组而不是跨其中的每个组件。 我们称之为计算半全导数,因为通常您可以在模型中选择一个子组,在这种情况下,FD 正在逼近该组的全导数,但该全导数仍然是有效的偏导数为整体模型。因此是半全导数。

    2) 为什么要对这些静态输入变量进行有限差分计算?

    理论上,您确实不需要无法更改的输入的偏导数。从 OpenMDAO 2.4 开始,我们不会自动处理这种情况,而且我们没有计划在不久的将来添加这种情况。但是,该框架仅将 FD 用于您告诉它的部分。听起来您正在像这样声明您的部分:

    self.declare_partials(of=['*'], wrt=['*'], method='fd')
    

    因此,您专门要求框架计算所有这些部分。相反,您可以在 wrt 参数中仅指定您知道实际更改的输入。当然,这在数学上是不正确的,因为静态输入存在导数。如果后来有人将某些东西连接到这些输入并尝试和优化,他们会得到错误的答案。但只要你小心,你可以专门从任何组件中只要求你想要的部分,而简单地将不变的输入保留为有效的 0。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-08
      • 1970-01-01
      • 1970-01-01
      • 2020-03-28
      • 2020-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多