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 cuadrática con restricciones enlazadas

Para minimizar un cuadrático a gran escala con los límites superior e inferior, puede utilizar la función con el algoritmo.quadprog'trust-region-reflective'

El problema almacenado en el archivo MAT es un cuadrático definitivo y positivo, y la matriz Hessiana es tridiagonal, sujeta a los límites superior () y inferior ().qpbox1.matHublb

Paso 1: Cargue el hessian y defina f, lb y UB.

load qpbox1   % Get H lb = zeros(400,1); lb(400) = -inf; ub = 0.9*ones(400,1); ub(400) = inf; f = zeros(400,1); f([1 400]) = -2;

Paso 2: llame a una rutina de minimización cuadrática con un punto de partida XStart.

xstart = 0.5*ones(400,1); options = optimoptions('quadprog','Algorithm','trust-region-reflective'); [x,fval,exitflag,output] = ...          quadprog(H,f,[],[],[],[],lb,ub,xstart,options);

Observando los valores resultantes de, y,exitflagoutput.iterationsoutput.cgiterations

exitflag,output.iterations,output.cgiterations
exitflag =       3   ans =      19   ans =          1637

Usted puede ver que mientras que la convergencia ocurrió en 19 iteraciones, el número alto de iteraciones CG indica que el costo de resolver el sistema lineal es alto. A la luz de este costo, intente utilizar un solucionador directo en cada iteración estableciendo la opción para:SubproblemAlgorithm'factorization'

options = optimoptions(options,'SubproblemAlgorithm','factorization'); [x,fval,exitflag,output] = ...          quadprog(H,f,[],[],[],[],lb,ub,xstart,options);

Ahora el número de iteraciones ha caído a 10:

exitflag,output.iterations,output.cgiterations
exitflag =       3   ans =      10   ans =       0

El uso de un solucionador directo en cada iteración suele hacer que disminuya el número de iteraciones, pero suele tardar más tiempo por iteración. Para este problema, la contrapartida es beneficiosa, ya que el tiempo para resolver el problema disminuye en un factor de 10.quadprog

Usted puede también utilizar el algoritmo predeterminado para resolver este problema convexo:'interior-point-convex'

options = optimoptions('quadprog','Algorithm','interior-point-convex'); [x,fval,exitflag,output] = ...          quadprog(H,f,[],[],[],[],lb,ub,[],options);

Marque el indicador de salida y las iteraciones (el algoritmo del punto interior no utiliza las iteraciones CG):

exitflag,output.iterations
exitflag =       1   ans =       8