带黑盒的 Adjoint 方法

Adjoint method with black boxes

如果多个求解器作为外部代码组件(完全黑盒)附加到模型,是否有办法实现伴随方法?

到目前为止我看到的很多openMDAO的用法似乎都使用了一些黑盒流求解器或结构求解器等

但我看不出如何在不接触源代码的情况下实现伴随方法。

因为它也不太可能实现复杂的步骤方法。如果要使用基于梯度的优化器,唯一的方法是有限差分?

您可以实施半解析伴随法,即使您的模型中没有任何解析导数。假设您有一个单一的黑块代码,它有一个内部求解器,可以在计算某些输出值集之前收敛一些隐式方程。 您使用自定义文件包装器将 OpenMDAO 中的代码包装为 ImplicitComponent。 (注意:您不能使用 ExternalCode 组件,因为它是 ExplicitComponent 的子 class)

在您的新包装器中,您将在自定义 ImplicitComponent 中实现两个方法:

  1. solve_nonlienar
  2. apply_nonlinear

第一种方法只是普通的 运行 代码。然而,第二种方法采用输入值和给定的输出值并计算残差。

然后为了得到偏导数,OpenMDAO 将对 apply_linear 方法进行有限差分来计算 dResidaul_dinputs 和 dResidual_dOutputs,然后它可以使用反向计算总导数(或伴随)模式。

与将代码包装为 ExplicitComponent 相比,这种方法通常更高效、更准确。首先,apply_nonlinear 方法(残差评估)应该比 solve_nonlinear 方法便宜得多,因此有限差分法应该便宜得多。或许更重要的是,残差评估的有限差分应该比围绕完整求解器收敛循环的有限差分更准确(请参阅此 technical paper 了解为什么会这样的示例)。

这种方法有几点需要注意。首先,可能存在大量残差方程和隐变量。因此,与将代码包装为 ExplicitComponent 相比,您可能会进行更多的有限差分调用。但是,由于残差评估便宜得多,因此应该可以接受。其次,并非所有代码都具有 return 残差评估的能力,因此可能需要对黑盒进行一些修改。没有残差评估,就不能使用伴随法。

另一种通用方法是将代码与解析导数和有限差分偏导数混合使用。假设您有一个昂贵的 CFD 分析,它确实有一个现有的伴随,并且您想要耦合一个廉价的黑盒代码。您可以对黑盒代码进行有限差分以计算其部分,然后 OpenMDAO 将使用那些具有现有伴随的代码来计算半解析全导数。