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

Использование информации о производной второго порядка в fmincon решатель, вы должны создать гессен, который является гессеном лагранжиана. Гессен лагранжиана задаётся уравнением
+∑λi∇2ceqi (x).
Здесь ) - это bigtoleft функция, и ) являются двумя функциями ограничения конуса. hessinterior вспомогательная функция в конце этого примера вычисляет гессен лагранжиана в точке x со структурой множителя Лагранжа lambda. Функция сначала вычисляет ). Затем вычисляет два ограничения Гессен x) (x), умножает их на соответствующие множители Лагранжаlambda.ineqnonlin(1) и lambda.ineqnonlin(2)и добавляет их. Вы можете видеть из определения twocone функция ограничения, которая (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