首先,对不起,如果我问的是微不足道的事情,但我只是在 matlab 中学习多变量微积分和优化工具箱——优化:)
我正在测试我对在matlab中对一个简单的 2D 函数使用优化工具箱的理解,并试图找到一些局部最小值,但是对于特定点,matlab或函数给了我确切的起点,并带有以下注释:“初始点是局部最小值. ". 我提供了渐变和用户提供的Hessian。我不知道是MATLAB还是我。也许我在定义Hessian 时犯了错误,但我认为一切都是正确的。fminunc
对于随机起点,该函数始终给出适当的(最接近的)最小值。然而,对于某些点,在精确的最大值处,fminunc
返回与上述语句完全相同的点。我应该使用不同的优化算法还是只是我需要接受的MATLAB东西?我认为提供Hessian会解决这个问题。Hessian在所有有问题的点上始终是负定义的矩阵,这应该意味着该点是最大值!!!我通过返回的特征值对它进行了测试eig(hessian)
。看起来fminunc
根本没有考虑 Hessian。我应该怎么做才能fminunc
与粗麻布一起工作?
干杯!
错误的地方fminunc
:
x0 = [0 -1.5*pi];
x = fminunc(F,x0,options)/pi
x =
0 -1.5000
x0 = [pi -pi/2];
x = fminunc(F,x0,options)/pi
x =
1.0000 -0.5000
x0 = [-pi 1.5*pi];
x = fminunc(F,x0,options)/pi
x =
-1.0000 1.5000
例如最后一点:
[minimum,gradient,hessian] = F([-pi 1.5*pi])
minimum =
1
gradient =
1.0e-15 *
-0.1225 0.1837
hessian =
-1.0000 -0.0000
-0.0000 -1.0000
我使用了下面的代码:
[X,Y]=meshgrid(-2*pi:4*pi/100:2*pi,-2*pi:4*pi/100:2*pi);
FF = @(X,Y) cos(X).*sin(Y);
surf(X,Y,FF(X,Y));
shading interp;
options = optimset('GradObj','on','Hessian','user-supplied','Display','iter');
F = @(x) deal(cos(x(1)).*sin(x(2)), [-sin(x(1)).*sin(x(2)) cos(x(1)).*cos(x(2))], [-cos(x(1)).*sin(x(2)) -sin(x(1)).*cos(x(2)); -sin(x(1)).*cos(x(2)) -cos(x(1)).*sin(x(2))]);
x0 = [0 pi/2];
x = fminunc(F,x0,options)