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