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)
    
  • 0 ответов

    Другие вопросы по тегам