我实现了一个由几个组和多个组件组成的系统。它相对复杂,具有组件输入/输出,某些部分是从属/非从属等。
基于梯度的优化器似乎停留在初始值,并且永远不会超过迭代0(不会停留在局部最优值)。我之前遇到过此错误,因为我缺少某些变量的clarify_partials。有没有一种方法可以自动检查哪个组件输入/输出缺少部分零件,类似于N ^ 2图中的缺少连接。
答案 0 :(得分:2)
您需要使用两种工具来检查不良衍生工具。第一个是check_partials。这将逐个组件进行,并使用有限差分或复杂步骤来验证每个组件的偏导数(无论您是否在该组件的设置中声明了它们)。如果您遗漏了任何部分,那将抓住问题,因为check-fd会将其视为非零,并会向您显示错误。
Check_partials应该永远是您的第一站。如果可以,请使用复杂步骤来验证您的导数。这样,您就知道它们是完全准确的。另外,check_partials将围绕当前初始化的任何点进行检查。因此,有时您可能会遇到简写的情况(例如,您输入的某些内容为0),因此您的check_passes仍然有效,但您的派生方式仍然是错误的。例如,如果您的组件表示y = 2 * x,而您忘记定义导数,但是您在x = 0处运行check_partials,则检查将通过。但是,如果您在x = 1上运行它,则检查将显示错误。
如果您所有的偏导数都正确,但是结果仍然很差,那么您可以尝试check_totals。根据模型的结构以及其中是否存在任何耦合(即您需要使用某种非线性求解器),这可能是因为您没有正确配置的线性求解器设置来正确求解总导数。在很多情况下,如果您有耦合,则可以将DirectSolver与放置在模型中的非线性求解器放置在同一水平上。