为什么静态输入变量的有限差分用于计算雅可比行列式? (OpenMDAO 2.4)

Why are finite differences of static input variables used to calculate the Jacobian? (OpenMDAO 2.4)

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

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

另外,如果我没理解错的话,将分量线性化得到子雅可比矩阵,然后用它来计算总雅可比矩阵。但是,是否可以直接计算整个组的有限差分而不是对每个分量进行线性化?以我的组件运行次和输入变量的数量,对每个组件进行线性化需要很长时间。然而,优化问题只有 3 个设计变量。因此,如果我可以对整个 MDA 执行三个有限差分计算来计算总雅可比行列式,则总 运行 时间将显着减少。

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

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

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

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

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

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

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