首先,抱歉,如果我要求琐碎的事情,但我只是在matlab中学习多变量微积分和优化工具箱 - 优化:)
我正在测试我对在 matlab 中使用优化工具箱对简单2D函数的理解,并试图找到一些局部最小值,但对于特定点, matlab 或fminunc
函数通过以下注释为我提供了确切的起始点:“初始点是本地最小值。”。我提供了渐变和用户提供的 Hessian 。我不知道是 MATLAB 还是我。也许我错误地定义了 Hessian ,但我认为一切都是正确的。
对于随机起点,函数始终给出适当的(最接近的)最小值。但是对于某些点,在精确的最大值处,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)