fminunc не учитывает пользовательский гессиан
Прежде всего, извините, если я спрашиваю о тривиальной вещи, но я только изучаю многопараметрическое исчисление и набор инструментов оптимизации в matlab- оптимизация также:)
Я проверял свое понимание использования набора инструментов оптимизации в Matlab для простой 2D-функции и пытался найти некоторые локальные минимумы, но, для определенных точек, Matlab или fminunc
Функция дает мне точные начальные точки со следующим комментарием: " Начальная точка - локальный минимум ". Я предоставил как градиент, так и пользовательский гессиан. Я не знаю, MATLAB или я. Возможно, я ошибся в определении гессиана, но я думаю, что все правильно.
Для случайной начальной точки функция всегда дает надлежащий (ближайший) минимум. Однако для определенных точек при точных максимумах fminunc
возвращает точно такую же точку с приведенным выше утверждением. Должен ли я использовать другой алгоритм оптимизации или это просто вещь, которую MATLAB я должен принять? Я думал, что если вы предоставите гессиану, это будет решено Гессиан всегда является отрицательно определенной матрицей во всех проблемных точках, и это должно означать, что точка является максимумом!!! Я проверил это через возвращенные собственные значения eig(hessian)
, Это выглядит как fminunc
вообще не принимает во внимание Гессиана. Что я должен сделать, чтобы сделать 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)