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 restricciones enlazadas y preacondicionador con bandas

El objetivo en este problema es minimizar la función no lineal

f(x)=1+i=1n|(32xi)xixi1xi+1+1|p+i=1n/2|xi+xi+n/2|p,

tal que -10.0 ≤ xi ≤ 10.0, donde es 800 (debe ser un múltiplo de 4),nn p = 7/3Y x0 = xn + 1 = 0.

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

El archivo calcula el valor de la función y el degradado.tbroyfg.m Este archivo es largo y no se incluye aquí. Puede ver el código de esta función mediante el comando

type tbroyfg

El patrón de dispersión de la matriz Hessiana se ha predeterminado y se ha almacenado en el archivo.tbroyhstr.mat La estructura de la dispersión para el hessian de este problema está en bandas, como se puede ver en la siguiente trama.spy

load tbroyhstr
spy(Hstr)

En esta trama, la franja central es en sí misma una matriz de cinco bandas. La siguiente gráfica muestra la matriz más claramente:

spy(Hstr(1:20,1:20))

Se usa para establecer el parámetro en.optimoptionsHessPatternHstr Cuando un problema tan grande como este tiene una estructura de dispersión obvia, no establecer el parámetro requiere una gran cantidad de memoria innecesaria y computación.HessPattern Esto es porque intenta utilizar la diferenciación finita en una matriz completa de hessian de 640.000 entradas cero.fmincon

También debe establecer el parámetro que se va a usar, ya que el degradado se calcula en.SpecifyObjectiveGradienttrueoptimoptionstbroyfg.m A continuación, ejecute como se muestra en.fminconPaso 2

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

fun = @tbroyfg; load tbroyhstr          % Get Hstr, structure of the Hessian n = 800; xstart = -ones(n,1); xstart(2:2:n) = 1; lb = -10*ones(n,1); ub = -lb; options = optimoptions('fmincon','SpecifyObjectiveGradient',true,'HessPattern',Hstr,...     'Algorithm','trust-region-reflective');  
[x,fval,exitflag,output] = ... 
   fmincon(fun,xstart,[],[],[],[],lb,ub,[],options);

La medida de optimalidad de primer orden () y el número de iteraciones () son:exitflagfvaloutput.firstorderoptoutput.iterations

exitflag,fval,output.firstorderopt,output.iterations
exitflag =       3   fval =    270.4790   ans =      0.0163   ans =       7

Para los problemas restringidos enlazados, la optimalidad de primer orden es la norma de infinito de, donde se define como in, y es el degradado.v.*gvRestricciones de cuadrog

Debido a la franja central de cinco bandas, puede mejorar la solución mediante el uso de un preacondicionador de cinco bandas en lugar del preacondicionador diagonal predeterminado. Utilizando la función, restablezca el parámetro y resuelva el problema de nuevo.optimoptionsPrecondBandWidth2 (El ancho de banda es el número de diagonales superiores (o inferiores), sin contar la Diagonal principal.)

fun = @tbroyfg; load tbroyhstr          % Get Hstr, structure of the Hessian n = 800; xstart = -ones(n,1); xstart(2:2:n,1) = 1; lb = -10*ones(n,1); ub = -lb; options = optimoptions('fmincon','SpecifyObjectiveGradient',true,'HessPattern',Hstr, ...     'Algorithm','trust-region-reflective','PrecondBandWidth',2); 
[x,fval,exitflag,output] = ...
   fmincon(fun,xstart,[],[],[],[],lb,ub,[],options); 

El número de iteraciones aumenta en dos. Pero la medida de optimalidad de primer orden se reduce por un factor de:1e-3

exitflag,fval,output.firstorderopt,output.iterations
exitflag =       3   fval =    270.4790   ans =     7.5340e-05   ans =       9