我遇到了大优化的收敛问题,我相信问题可能与我宣布目标的方式以及与各个组件提供的梯度相关的约束有关。
是否有办法为以下列方式定义的约束或目标提供渐变(使用约束/目标语句中的数学):self.driver.add_constraint('separation/10 > %s/10' % minimum_distance)
当组件仅提供separation
的渐变时,而不是separation/10
。
答案 0 :(得分:0)
我的第一个想法是使其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.)