为什么静态输入变量的有限差分用于计算雅可比矩阵?(第2.4节)

2024-09-27 22:33:35 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我注意到,当在compute_totals()中计算雅可比矩阵时,分量相对于其所有输入值都是线性化的。在compute_approximations()中,计算所有输入值的有限差分,包括静态输入值。所以,我的问题是:为什么要对这些静态输入变量进行有限差分计算?由于值保持不变,我不知道为什么这些信息会有用?你知道吗

此外,如果我理解正确的话,这些分量被线性化得到子雅可比矩阵,然后用来计算总雅可比矩阵。但是,是否可以直接计算整个组的有限差分,而不是将每个分量线性化?由于我的组件的运行时和输入变量的数量,执行每个组件的线性化需要很长时间。然而,优化问题只有3个设计变量。因此,如果我可以在整个MDA中执行三次有限差分计算来计算总的Jacobian,那么总的运行时间将显著减少。你知道吗


Tags: 算法信息过程时间静态组件矩阵差分
1条回答
网友
1楼 · 发布于 2024-09-27 22:33:35

按相反顺序回答问题:

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

可以在模型中设置FD over any group,包括顶级组。然后FD在该组中取,而不是在其中的每个组件中取。 我们称之为计算半全导数,因为一般来说,你可以在你的模型中选择一个子组,在这种情况下,FD近似于该组的总导数,但总导数仍然是整个模型的有效偏导数。因此是半全导数。你知道吗

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

理论上,你是对的,你不需要对不能改变的输入进行偏导数。到openmdao2.4为止,我们不会自动处理这种情况,我们也没有计划在不久的将来添加这种情况。然而,这个框架只是将FD带到您告诉它的部分。听起来你是这样宣布你的部分:

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

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

相关问题 更多 >

    热门问题