Минимизация с линейными ограничениями равенства, отражающий алгоритм доверительной области

The fmincon trust-region-reflective алгоритм может минимизировать нелинейную целевую функцию, удовлетворяющую только линейным ограничениям равенства (без ограничений или любых других ограничений). Для примера минимизируйте

f(x)=i=1n-1((xi2)(xi+12+1)+(xi+12)(xi2+1)),

удовлетворяющий некоторым линейным ограничениям равенства. Этот пример берётся n=1000.

Создайте задачу

The browneq.mat файл содержит матрицы Aeq и beq, которые представляют линейные ограничения   Aeq*x = beq. The Aeq матрица имеет 100 строк, представляющих 100 линейных ограничений (так Aeq является матрицей 100 на 1000). Загрузите browneq.mat данные.

load browneq.mat

The brownfgh Функция helper в конце этого примера реализует целевую функцию, включая ее градиент и Гессиан.

Задать опции

The trust-region-reflective алгоритм требует, чтобы целевая функция включала градиент. Алгоритм принимает Гессиана в целевой функции. Установите опции, чтобы включить всю информацию о производной.

options = optimoptions('fmincon','Algorithm','trust-region-reflective',...
    'SpecifyObjectiveGradient',true,'HessianFcn','objective');

Решите задачу

Установите начальную точку -1 для нечетных индексов и + 1 для четных индексов.

n = 1000;
x0 = -ones(n,1);
x0(2:2:n) = 1;

Задача не имеет границ, линейных ограничений неравенства или нелинейных ограничений, поэтому установите эти параметры равными [].

A = [];
b = [];
lb = [];
ub = [];
nonlcon = [];

Функции fmincon чтобы решить проблему.

[x,fval,exitflag,output] = ...
   fmincon(@brownfgh,x0,A,b,Aeq,beq,lb,ub,nonlcon,options);
Local minimum possible.

fmincon stopped because the final change in function value relative to 
its initial value is less than the value of the function tolerance.

Исследуйте процесс решения и решения

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

disp(exitflag)
     3
disp(fval)
  205.9313
disp(output.constrviolation)
   2.2604e-13

Значение exitflag 3 указывает, что fmincon останавливается, потому что изменение значения целевой функции меньше допуска FunctionTolerance. Окончательное значение целевой функции задается fval. Ограничения выполняются, как показано на output.constrviolation, который отображает очень маленькое число.

Чтобы вычислить нарушение ограничений самостоятельно, выполните следующий код.

norm(Aeq*x-beq,Inf)
ans = 2.2604e-13

Функция помощника

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

function [f,g,H] = brownfgh(x)
%BROWNFGH  Nonlinear minimization problem (function, its gradients
% and Hessian).
% Documentation example.         

%   Copyright 1990-2019 The MathWorks, Inc.

% Evaluate the function.
  n = length(x);
  y = zeros(n,1);
  i = 1:(n-1);
  y(i) = (x(i).^2).^(x(i+1).^2+1)+(x(i+1).^2).^(x(i).^2+1);
  f = sum(y);

% Evaluate the gradient.
  if nargout > 1
     i=1:(n-1);
     g = zeros(n,1);
     g(i) = 2*(x(i+1).^2+1).*x(i).*((x(i).^2).^(x(i+1).^2))+...
             2*x(i).*((x(i+1).^2).^(x(i).^2+1)).*log(x(i+1).^2);
     g(i+1) = g(i+1)+...
              2*x(i+1).*((x(i).^2).^(x(i+1).^2+1)).*log(x(i).^2)+...
              2*(x(i).^2+1).*x(i+1).*((x(i+1).^2).^(x(i).^2));
  end

% Evaluate the (sparse, symmetric) Hessian matrix
  if nargout > 2
     v = zeros(n,1);
     i = 1:(n-1);
     v(i) = 2*(x(i+1).^2+1).*((x(i).^2).^(x(i+1).^2))+...
            4*(x(i+1).^2+1).*(x(i+1).^2).*(x(i).^2).*((x(i).^2).^((x(i+1).^2)-1))+...
            2*((x(i+1).^2).^(x(i).^2+1)).*(log(x(i+1).^2));
     v(i) = v(i)+4*(x(i).^2).*((x(i+1).^2).^(x(i).^2+1)).*((log(x(i+1).^2)).^2);
     v(i+1) = v(i+1)+...
              2*(x(i).^2).^(x(i+1).^2+1).*(log(x(i).^2))+...
              4*(x(i+1).^2).*((x(i).^2).^(x(i+1).^2+1)).*((log(x(i).^2)).^2)+...
              2*(x(i).^2+1).*((x(i+1).^2).^(x(i).^2));
     v(i+1) = v(i+1)+4*(x(i).^2+1).*(x(i+1).^2).*(x(i).^2).*((x(i+1).^2).^(x(i).^2-1));
     v0 = v;
     v = zeros(n-1,1);
     v(i) = 4*x(i+1).*x(i).*((x(i).^2).^(x(i+1).^2))+...
            4*x(i+1).*(x(i+1).^2+1).*x(i).*((x(i).^2).^(x(i+1).^2)).*log(x(i).^2);
     v(i) = v(i)+ 4*x(i+1).*x(i).*((x(i+1).^2).^(x(i).^2)).*log(x(i+1).^2);
     v(i) = v(i)+4*x(i).*((x(i+1).^2).^(x(i).^2)).*x(i+1);
     v1 = v;
     i = [(1:n)';(1:(n-1))'];
     j = [(1:n)';(2:n)'];
     s = [v0;2*v1];
     H = sparse(i,j,s,n,n);
     H = (H+H')/2;
  end
end

Похожие темы