首页 > 解决方案 > 为什么使用静态输入变量的有限差分来计算雅可比?(OpenMDAO 2.4)

问题描述

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

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

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

标签: pythonopenmdao

解决方案


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

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

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

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

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

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

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


推荐阅读