exponenta event banner

fmincon Алгоритм внутренних точек с аналитическим гессенским

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

Вспомогательная функция bigtoleft является объективной функцией, которая быстро растет отрицательно, поскольку x(1) координата становится отрицательной. Его градиент является трёхэлементным вектором. Код для bigtoleft в конце этого примера появляется вспомогательная функция.

Набор ограничений для этого примера представляет собой пересечение интерьеров двух конусов - одного, указывающего вверх, и одного, указывающего вниз. Функция ограничения представляет собой двухкомпонентный вектор, содержащий по одному компоненту для каждого конуса. Поскольку этот пример является трехмерным, градиент зависимости является матрицей 3 на 2. Код для twocone в конце этого примера появляется вспомогательная функция.

Создайте фигуру ограничений, окрашенную с помощью целевой функции.

% Create figure
figure1 = figure;

% Create axes
axes1 = axes('Parent',figure1);
view([-63.5 18]);
grid('on');
hold('all');

% Set up polar coordinates and two cones
r=0:.1:6.5;
th=2*pi*(0:.01:1);
x=r'*cos(th);
y=r'*sin(th);
z=-10+sqrt(x.^2+y.^2);
zz=3-sqrt(x.^2+y.^2);

% Evaluate objective function on cone surfaces
newxf=reshape(bigtoleft([x(:),y(:),z(:)]),66,101)/3000;
newxg=reshape(bigtoleft([x(:),y(:),z(:)]),66,101)/3000;

% Create lower surf with color set by objective
surf(x,y,z,newxf,'Parent',axes1,'EdgeAlpha',0.25);

% Create upper surf with color set by objective
surf(x,y,zz,newxg,'Parent',axes1,'EdgeAlpha',0.25);
axis equal

Figure contains an axes. The axes contains 2 objects of type surface.

Создать функцию Гессена

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

∇xx2L (x, λ) =∇2f (x) +∑λi∇2ci (x) +∑λi∇2ceqi (x).

Здесь f (x) - это bigtoleft функция, и ci (x) являются двумя функциями ограничения конуса. hessinterior вспомогательная функция в конце этого примера вычисляет гессен лагранжиана в точке x со структурой множителя Лагранжа lambda. Функция сначала вычисляет ∇2f (x). Затем вычисляет два ограничения Гессен ∇2c1 (x) и ∇2c2 (x), умножает их на соответствующие множители Лагранжаlambda.ineqnonlin(1) и lambda.ineqnonlin(2)и добавляет их. Вы можете видеть из определения twocone функция ограничения, которая ∇2c1 (x) =∇2c2 (x), что упрощает вычисление.

Создание опций для использования производных

Позволить fmincon чтобы использовать целевой градиент, градиенты зависимостей и гессенский градиент, необходимо задать соответствующие параметры. HessianFcn опция с использованием гессена лагранжиана доступна только для алгоритма interior-point.

options = optimoptions('fmincon','Algorithm','interior-point',...
    "SpecifyConstraintGradient",true,"SpecifyObjectiveGradient",true,...
    'HessianFcn',@hessinterior);

Свернуть использование всей производной информации

Установка начальной точки x0 = [-1,-1,-1].

x0 = [-1,-1,-1];

Проблема не имеет линейных ограничений или границ. Задайте для этих аргументов значение [].

A = [];
b = [];
Aeq = [];
beq = [];
lb = [];
ub = [];

Решите проблему.

[x,fval,eflag,output] = fmincon(@bigtoleft,x0,...
           A,b,Aeq,beq,lb,ub,@twocone,options);
Local minimum found that satisfies the constraints.

Optimization completed because the objective function is non-decreasing in 
feasible directions, to within the value of the optimality tolerance,
and constraints are satisfied to within the value of the constraint tolerance.

Анализ решения и процесса решения

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

disp(x)
   -6.5000   -0.0000   -3.5000
disp(fval)
  -2.8941e+03
disp(eflag)
     1
disp([output.funcCount,output.iterations])
     7     6

Если функция Гессена не используется, fmincon требует больше итераций для схождения и больше оценок функций.

options.HessianFcn = [];
[x2,fval2,eflag2,output2] = fmincon(@bigtoleft,x0,...
           A,b,Aeq,beq,lb,ub,@twocone,options);
Local minimum found that satisfies the constraints.

Optimization completed because the objective function is non-decreasing in 
feasible directions, to within the value of the optimality tolerance,
and constraints are satisfied to within the value of the constraint tolerance.
disp([output2.funcCount,output2.iterations])
    13     9

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

options.SpecifyConstraintGradient = false;
options.SpecifyObjectiveGradient = false;
[x3,fval3,eflag3,output3] = fmincon(@bigtoleft,x0,...
           A,b,Aeq,beq,lb,ub,@twocone,options);
Local minimum found that satisfies the constraints.

Optimization completed because the objective function is non-decreasing in 
feasible directions, to within the value of the optimality tolerance,
and constraints are satisfied to within the value of the constraint tolerance.
disp([output3.funcCount,output3.iterations])
    43     9

Вспомогательные функции

Этот код создает bigtoleft функция помощника.

function [f gradf] = bigtoleft(x)
% This is a simple function that grows rapidly negative
% as x(1) becomes 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
end

Этот код создает twocone функция помощника.

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
end

Этот код создает hessinterior функция помощника.

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;
end

Связанные темы