如果多个求解器作为外部代码组件(完整的黑盒子)附加到模型上,有没有办法实现伴随方法?
到目前为止,我见过的openMDAO的许多用法似乎都使用了一些黑盒流解算器或结构求解器等。
但是我没有看到如何在不触及源代码的情况下实现伴随方法。
因为它也不太可能实施复杂的步骤方法。如果想要使用基于梯度的优化器,唯一的方法是有限差分吗?
答案 0 :(得分:0)
即使模型中没有任何分析导数,也可以实现半解析伴随方法。假设您有一个黑色代码,它有一个内部求解器,用于在计算一组输出值之前收敛一些隐式方程。 使用自定义文件包装器将代码包装在OpenMDAO中ImplicitComponent。 (注意:您不能使用ExternalCode组件,因为它是ExplicitComponent的子类)
在新的包装器中,您将在自定义ImplicitComponent中实现两个方法:
第一种方法就是代码的正常运行。然而,第二种方法采用输入值和给定的输出值并计算残差。
然后,为了得到偏导数,OpenMDAO将有限差分apply_linear
方法来计算dResidaul_dinputs和dResidual_dOutputs,然后它可以用来计算使用反向(或伴随)模式的总导数。
这种方法通常比将代码包装为ExplicitComponent更有效,更准确。首先,apply_nonlinear
方法(残差评估)的solve_nonlinear
方法应该非常便宜,因此有限差异应该便宜得多。也许更重要的是,残差评估中的有限差异应该比围绕完全求解器收敛循环的有限差分更准确(请参阅此technical paper以获取原因的示例)。
这种方法有几点需要注意。首先,可能存在大量残差方程和隐含变量。因此,与将代码包装为ExplicitComponent相比,您可能会进行更多的有限差分调用。但是,由于剩余评估要便宜得多,所以应该可以接受。其次,并非所有代码都能够返回剩余评估,因此可能需要对黑盒进行一些修改。如果没有残差评估,则不能使用伴随方法。
另一种通用方法是将代码与分析导数和有限差分偏导数混合。让我们说你有一个昂贵的CFD分析确实有一个现有的伴随,你想要一个廉价的黑盒代码。您可以对黑盒代码进行有限差分来计算其偏差,然后OpenMDAO将使用具有exisiing伴随的代码来计算半分析总导数。