如何检查丢失的部分

How to check for missing partials

我实现了一个由几个组和多个组件组成的系统。它相对复杂并且具有组件 inputs/outputs,其中一些部分是 dependent/non 依赖等

基于梯度的优化器似乎卡在初始值上,并且永远不会超过迭代 0(不卡在局部最优)。我以前遇到过这个错误,因为我缺少某些变量的 declare_partials。有没有一种方法可以自动检查哪个组件 input/output 缺少类似于 N^2 图中缺少连接的部分。

您需要使用两种工具来检查不良衍生品。第一个是 check_partials。这将逐个组件进行,并使用有限差分法或复步法来验证每个组件的偏导数(无论您是否在该组件的设置中声明了它们)。如果您缺少任何部分,这将解决问题,因为 check-fd 会将它们视为非零,并会告诉您存在错误。

Check_partials 应该始终是您的第一站。如果可以,请使用 complex-step 来验证您的导数。这样你就知道它们是完全准确的。此外,check_partials 将检查当前初始化的任何点。所以有时你可能有一个退化的情况(例如你有一些输入是 0)所以你的 check_passes,但你的导数仍然是错误的。例如,如果您的组件表示 y=2*x,而您忘记定义导数,但您 运行 check_partials at x=0,则检查将通过。但是如果你在 x=1 处 运行 它,那么检查将显示错误。

如果您的所有偏导数都正确,但您仍然得到不好的结果,那么您可以尝试 check_totals. Depending on the structure of your model, and if you have any coupling in it (i.e. you need to use some kind of nonlinear solver) then its possible that you don't have a correctly configured linear solver setup to solve for total derivatives correctly. In a lot of cases, if you have coupling you can just put a DirectSolver 就在与您放入模型中的非线性求解器相同的级别。