我最近在a paper中读过这句话:
OpenMDAO的一个重要功能是可以细分 问题变成具有少量输入和输出的组件 并包含相对简单的分析。
此外,查看手册中的示例,每个组件的输入和输出数量很少。
这将意味着使用execcomp效率更高,该execcomp从显式组件中获取两个输入并输出约束,而不是在explicitcomp中进行所有操作。我在这里尝试举一个例子:
x1,x2 --> ExplicitComp -->y1
y1 --> Execcomp --->constraint
OR
x1,x2 --->ExplicitComp -->y1,constraint
答案 0 :(得分:2)
这个想法是,通过将计算分解为较小的步骤,偏导数使它们更容易手动计算。然后,OpenMDAO将compute the total derivatives across the model for you.
因此,从某种意义上讲,您依靠的是OpenMDAO跨大型模型计算导数的功能,以减轻您的工作量。
从计算成本的角度来看,组件更多而不是更少会带来一些成本。极端地讲,如果在庞大的计算中每一行代码只有一个组件,那么框架开销可能会成为问题。 OpenMDAO中的某些功能可以帮助减轻串行模型的部分成本specifically the in-memory assembly of Jacobians。
具体来说,关于ExecComp,该组件用于简单而廉价的计算。它使用复杂步骤来计算其导数,如果涉及大型数组输入,这可能会很昂贵。它在那里使简单的步骤(如添加变量)变得更加容易。但是对于昂贵的计算,您不应该使用它。
在您的特定情况下,我建议您考虑是否很难将导数从x1,x1传递到约束。如果链式规则不难处理,那么我可能会将其全部汇总到一个计算中。如果由于某种原因,当您将所有计算组合在一起时,导数是讨厌的,然后将它们拆分即可。