Main Content

Minimización con gradiente y matriz hessiana

Este ejemplo muestra cómo resolver un problema de minimización no lineal con una matriz hessiana explícita tridiagonal H(x). El problema consiste en encontrar x para minimizar

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

donde n = 1.000.

La función auxiliar brownfgh al final de este ejemplo calcula f(x), su gradiente g(x) y su matriz hessiana H(x). Para especificar que el solver fminunc debe utilizar la información de la derivada, establezca las opciones SpecifyObjectiveGradient y HessianFcn mediante optimoptions. Para utilizar una matriz hessiana con fminunc, debe utilizar el algoritmo 'trust-region'.

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

Establezca el parámetro n en 1.000 y el punto inicial xstart en –1 para componentes impares y en +1 para componentes pares.

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

Encuentre el valor mínimo de f.

[x,fval,exitflag,output] = fminunc(@brownfgh,xstart,options);
Local minimum found.

Optimization completed because the size of the gradient is less than
the value of the optimality tolerance.

Examine la solución y el proceso de resolución.

disp(fval)
   2.8709e-17
disp(exitflag)
     1
disp(output)
         iterations: 7
          funcCount: 8
           stepsize: 0.0039
       cgiterations: 7
      firstorderopt: 4.7948e-10
          algorithm: 'trust-region'
            message: 'Local minimum found....'
    constrviolation: []

La función f(x) es una suma de potencias de cuadrados, por lo que es no negativa. La solución fval es casi cero, así que es claramente un mínimo. El indicador de salida 1 también indica que fminunc encuentra una solución. La estructura output muestra que fminunc solo necesita siete iteraciones para obtener la solución.

Muestre los elementos más grandes y más pequeños de la solución.

disp(max(x))
   1.1987e-10
disp(min(x))
  -1.1987e-10

La solución está muy cerca del punto donde todos los elementos de x = 0.

Función auxiliar

Este código crea la función auxiliar brownfgh.

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

%   Copyright 1990-2008 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

Temas relacionados