我在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
从这最后2次迭代中,我们可以计算出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,我不知道如何得到这些值。
此外,有时一个大的步骤,甚至没有计算导数在这一点上。可能是因为前一步太大,导致函数远离最小值。
我希望有人能给我解释或给予一个有用的来源,确切的算法是使用,或给任何提示,可以用来更好地理解它。谢谢!
1条答案
按热度按时间z18hc3ub1#
Dieter Kraft描述的算法是一种拟牛顿法(使用BFGS),应用于由损失函数和等式约束及不等式约束组成的拉格朗日函数。由于在每次迭代中,一些不等式约束是活动的,一些不是,因此在下一次迭代中忽略不活动的不等式。在每一步中,使用拉格朗日函数中约束的活动子集来求解等式约束问题。