OpenMDAO:什么时候需要定义偏导数?

时间:2018-05-18 09:30:37

标签: openmdao

我注意到定义不必要的偏导数会显着减慢优化器的速度。因此,我试图理解:我怎么知道是否应该为某个输入/输出关系定义偏导数?

2 个答案:

答案 0 :(得分:1)

我认为如果它们与优化中的响应(约束或目标)相关,或者作为组内非线性求解的一部分,则需要定义它们。我个人的做法是始终定义它们。我是否应该每次都改变我的优化问题,我经常这样做,我不想再回过头来确保我总是定义合适的衍生产品。

OpenMDAO的主分支包含一些雅可比着色技术,如果您的问题特别稀疏,可以显着提高性能。通过在驱动程序上设置以下选项来启用此方法:

p.driver.options['dynamic_simul_derivs'] = True
p.driver.options['dynamic_simul_derivs_repeats'] = 5

此方法的工作原理是用随机数填写用户描述的稀疏模式(在声明部分中用rowscols指定)并计算总雅各比。重复选项是为了提高结果的可信度,因为它可能但不太可能一次通过将导致偶然的零"在jacobian中,它不是稀疏结构的真正组成部分。

使用这种技术,并通过计算而不是使用嵌套for循环进行矢量化,我已经能够在很多情况下获得非常好的性能。当然,这些方法的有效性将从模型转变为模型。

答案 1 :(得分:1)

当你说“不必要”时,你的意思是偏导数总是为零吗?

使用declare_partials('*', '*'),当组件实际上比它更稀疏时,会大大减慢模型的速度。在偏导数始终为零的任何地方,您都不应该声明它。

此外,如果你有矢量化操作,那么雅可比实际上是一个对角矩阵。在这种情况下,您应该通过向rows调用1提供colsdeclare_partial个参数来声明[稀疏偏导数]。这通常会大大加快您的代码速度。

从技术上讲,如果您遵循从所有设计变量,每个组件到目标和约束的数据路径,那么您传递的任何变量都需要定义其部分。但实际上你应该声明并指定每个输出w.r.t的所有部分。每个输入(除非它们为零),因此模型连接的更改不会破坏您的衍生产品。

需要更多的时间来更轻松地声明你的部分,但性能提升是非常值得的。