1

首先,对不起,如果我问的是微不足道的事情,但我只是在 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)
    
  • 4

    0 回答 0