Алгоритм Внутренней точки fmincon с Аналитическим Гессианом

fmincon алгоритм внутренней точки может принять функцию Гессиана как вход. Когда вы предоставляете Гессиан, можно получить более быстрое, более точное решение ограниченной проблемы минимизации.

Ограничительное множество для этого примера является пересечением внутренностей двух конусов — один, обращенный вверх и один, обращенный вниз. Ограничительная функция c двухкомпонентный вектор, один компонент для каждого конуса. Поскольку это - 3D пример, градиент ограничения c 3-на-2 матрица.

function [c ceq gradc gradceq] = twocone(x)
% This constraint is two cones, z > -10 + r
% and z < 3 - r

ceq = [];
r = sqrt(x(1)^2 + x(2)^2);
c = [-10+r-x(3);
    x(3)-3+r];

if nargout > 2

    gradceq = [];
    gradc = [x(1)/r,x(1)/r;
       x(2)/r,x(2)/r;
       -1,1];

end
Целевая функция становится быстро отрицательной как x(1) координата становится отрицательной. Его градиент является трехэлементным вектором.
function [f gradf] = bigtoleft(x)
% This is a simple function that grows rapidly negative
% as x(1) gets negative
%
f=10*x(1)^3+x(1)*x(2)^2+x(3)*(x(1)^2+x(2)^2);

if nargout > 1

   gradf=[30*x(1)^2+x(2)^2+2*x(3)*x(1);
       2*x(1)*x(2)+2*x(3)*x(2);
       (x(1)^2+x(2)^2)];

end
Вот график проблемы. Штриховка представляет значение целевой функции. Вы видите, что целевая функция минимизирована около x = [-6.5,0,-3.5]:

 Код для генерации фигуры

Гессиан функции Лагранжа дан уравнением:

xx2L(x,λ)=2f(x)+λi2ci(x)+λi2ceqi(x).

Следующая функция вычисляет Гессиан в точке x со структурой множителя Лагранжа lambda:

function h = hessinterior(x,lambda)

h = [60*x(1)+2*x(3),2*x(2),2*x(1);
    2*x(2),2*(x(1)+x(3)),2*x(2);
    2*x(1),2*x(2),0];% Hessian of f
r = sqrt(x(1)^2+x(2)^2);% radius
rinv3 = 1/r^3;
hessc = [(x(2))^2*rinv3,-x(1)*x(2)*rinv3,0;
    -x(1)*x(2)*rinv3,x(1)^2*rinv3,0;
    0,0,0];% Hessian of both c(1) and c(2)
h = h + lambda.ineqnonlin(1)*hessc + lambda.ineqnonlin(2)*hessc;

Запустите эту проблему с помощью алгоритма внутренней точки в fmincon. Сделать это использование приложения Оптимизации:

  1. Установите проблему как в следующем рисунке.

  2. Для итеративного выхода прокрутка к нижней части Options разделяет на области и выбирает Level of display, iterative.

  3. В панели Options дайте аналитический указатель на функцию Гессиана.

  4. Под Run solver and view results нажмите Start.

Выполнять минимизацию в командной строке:

  1. Установка опций можно следующим образом:

    options = optimoptions(@fmincon,'Algorithm','interior-point',...
            'Display','off','SpecifyObjectiveGradient',true,'SpecifyConstraintGradient',true,...
            'HessianFcn',@hessinterior);
  2. Запустите fmincon с начальной точкой [–1, –1, –1], с помощью options структура:

    [x,fval,mflag,output] = fmincon(@bigtoleft,[-1,-1,-1],...
               [],[],[],[],[],[],@twocone,options);

Исследуйте решение, значение целевой функции, выходной флаг и количество вычислений функции и итераций:

x,fval,mflag,output.funcCount,output.iterations
x =

   -6.5000   -0.0000   -3.5000


fval =

  -2.8941e+03


mflag =

     1


ans =

     7


ans =

     6

Если вы не используете функцию Гессиана, fmincon берет 9 итераций, чтобы сходиться, вместо 6:

options = optimoptions(@fmincon,'Algorithm','interior-point',...
        'Display','off','SpecifyObjectiveGradient',true,'SpecifyConstraintGradient',true);

[x fval mflag output]=fmincon(@bigtoleft,[-1,-1,-1],...
           [],[],[],[],[],[],@twocone,options);

x,output.funcCount,output.iterations

x =

   -6.5000   -0.0000   -3.5000


ans =

    13


ans =

     9
Оба вывода запусков к аналогичным решениям, но F-количество и количество итераций ниже при использовании аналитического Гессиана.

Похожие темы