我正在使用openMDAO中的SLSQP算法,但我在理解它的实际工作原理时遇到了问题。我只是在看常见的抛物面例子,它有2个设计变量,目的是最小化f,没有任何约束。通过打印出每次迭代的x,y和f的值(迭代可能不是正确的词),我可以看到有时会对每个设计变量(x,y)使用前向有限差分来计算一阶导数。然后使用这些导数来找到下一个x和y值,但是我看不到模式。
另外,当我读到SLSQP方法时,二阶导数也是必需的。然而,我看不到它是经过计算的。让我给出一个输出的例子:
iteration 1:
x = 0
y = 0
f = 22
iteration 2:
x = 0.01
y = 0
f = 21.9401
iteration 3:
x = 0
y = 0.01
f = 22.0801
根据最后两次迭代,我们可以计算df/dx = 5.99,df/dy = -8.01
下一次迭代恰好是:
x = 5.99
y = -8.01
f = -25.9597
然后从这一点再次进行两次有限差分计算,得到: df/dx = 2.02,df/dy = 2.02
然后下一次迭代有变量:x= 8.372726,y= -6.66007,我不知道如何获得这些值。
此外,有时甚至不计算该点的导数就迈出了一大步。可能是因为上一步太大,导致函数偏离最小值。
我希望有人能给我解释,或者给出一个有用的资源来准确地使用算法,或者给出任何可以用来更好地理解它的提示。非常感谢!
发布于 2020-10-04 23:53:07
Dieter Kraft所描述的算法是应用于由损失函数和等式和不等式约束组成的拉格朗日函数的准牛顿法(使用BFGS)。因为在每次迭代中,一些不等式约束是有效的,而另一些则不是,所以在下一次迭代中省略了无效的不等式。在每个步骤中,使用拉格朗日函数中的约束的活动子集来解决等式约束问题。
https://stackoverflow.com/questions/59808494
复制相似问题