Esta página aún no se ha traducido para esta versión. Puede ver la versión más reciente de esta página en inglés.

Minimización con gradiente y patrón de Sparsity de hessian

Este ejemplo muestra cómo resolver un problema de minimización no lineal con matriz Hessiana tridiagonales aproximada por diferencias finitas dispersas en lugar de computación explícita.

El problema es encontrar para minimizarx

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

donde =.n1000

Para utilizar el método, calcule el degradado en; es opcional como en el método.trust-regionfminuncmustfunnotquasi-newton

El archivo calcula la función objetiva y el degradado.brownfg

Paso 1: escriba un archivo brownfg. m que calcule la función objetiva y el degradado del objetivo.

Este archivo de función se suministra con el software.

function [f,g] = brownfg(x) % BROWNFG Nonlinear minimization test problem %  % 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   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

Para permitir la computación eficiente de la aproximación de diferencias finitas dispersas de la matriz de hessian (), la estructura de la dispersión de debe ser predeterminada.HxH En este caso, suponga que esta estructura, una matriz dispersa, está disponible en el archivo.Hstrbrownhstr.mat Usando el comando se puede ver que es de hecho disperso (sólo 2998 nonceros).spyHstr Se usa para establecer la opción.optimoptionsHessPatternHstr Cuando un problema tan grande como este tiene una estructura de dispersión obvia, no establecer la opción requiere una gran cantidad de memoria innecesaria y computación porque intenta usar la diferenciación finita en una matriz completa de hessian de 1 millón entradas que no son diferentes a cero.HessPatternfminunc

También debe establecer la opción de usar, ya que el degradado se calcula en.SpecifyObjectiveGradienttrueoptimoptionsbrownfg.m A continuación, ejecute como se muestra en el paso 2.fminunc

Paso 2: llame a una rutina de minimización no lineal con un punto de partida XStart.

fun = @brownfg; load brownhstr % Get Hstr, structure of the Hessian spy(Hstr) % View the sparsity structure of Hstr

n = 1000; xstart = -ones(n,1);  xstart(2:2:n,1) = 1; options = optimoptions(@fminunc,'Algorithm','trust-region',...     'SpecifyObjectiveGradient',true,'HessPattern',Hstr); [x,fval,exitflag,output] = fminunc(fun,xstart,options); 

Este problema de variable 1000 se resuelve en siete iteraciones y siete iteraciones de degradado conjugada con una convergencia de indicación positiva.exitflag El valor final de la función y la medida de optimalidad en la solución son ambos cercanos a cero (para, la optimalidad de primer orden es la norma de infinito del gradiente de la función, que es cero en un mínimo local):xfminunc

exitflag,fval,output.firstorderopt
exitflag =       1   fval =     7.4738e-17   ans =     7.9822e-10

Temas relacionados