我在进行大型优化时遇到了收敛问题,我相信这个问题可能与我声明目标的方式以及与各个组件提供的梯度相关的约束有关。
有没有办法为以下列方式定义的约束或目标提供梯度(在约束/目标语句中使用数学):self.driver.add_constraint('separation/10 > %s/10' % minimum_distance)
当组件仅提供 的梯度时separation
,而不是separation/10
。
我在进行大型优化时遇到了收敛问题,我相信这个问题可能与我声明目标的方式以及与各个组件提供的梯度相关的约束有关。
有没有办法为以下列方式定义的约束或目标提供梯度(在约束/目标语句中使用数学):self.driver.add_constraint('separation/10 > %s/10' % minimum_distance)
当组件仅提供 的梯度时separation
,而不是separation/10
。
我的第一个想法是让它10.
而不是10
避免任何整数除法的机会。此外,您应该替换%s
为%f
. %s 用于字符串。
OpenMDAO 使用复杂的步骤来计算这些类型的字符串定义函数的导数。它应该得到正确的导数值,但我不知道 minimum_distance 的值恰好是什么。如果它恰好是一个整数,或者如果它%s
为复杂的步骤搞砸了(字符串的复杂部分到底代表什么?)
所以先看看那个。我假设您通过 pyoptsparse 使用的 SNOPT 确实有一个梯度检查器。如果您担心渐变,您可能会考虑将其打开。
顺便说一句,在 OpenMDAO 1.0 中,我们将改变处理约束的方式。与其提供这样的字符串,不如计算变量的值separation
,然后调用类似
driver.add_constraint('separation', lower=minimum_distance/10., scaler=1/10.)