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.
Paso 1: decidir qué parte de H pasar a quadprog como primer argumento.
Paso 2: escribir una función para computar productos de matriz hessian para H.
Paso 3: llama a una rutina de minimización cuadrática con un punto de partida.
La confianza-región-reflexivo método puede resolver grandes problemas donde el hessian es denso pero estructurado.quadprog
Para estos problemas, no se calcula con el hessian directamente, como lo hace para problemas de confianza-región-reflexivo con disperso, porque la formación sería la memoria intensiva.quadprog
H*YHHH En su lugar, debe proporcionar una función que, dada una matriz e información sobre, calcula =.quadprog
YHWH*Y
En este ejemplo, la matriz Hessiana tiene la estructura donde es una matriz simétrica dispersa 512-by-512, y es una matriz dispersa de 512 por 10 compuesta de un número de columnas densas.H
H = B + A*A'
B
A
Para evitar el uso excesivo de memoria que podría suceder al trabajar directamente porque es denso, el ejemplo proporciona una función de multiplicación de hessian,.H
H
qpbox4mult
Esta función, cuando se pasa una matriz, utiliza matrices dispersas y para calcular el producto de matriz de hessian.Y
A
B
W = H*Y = (B + A*A')*Y
En la primera parte de este ejemplo, las matrices y necesitan ser proporcionadas a la función de multiplicar de hessian.A
B
qpbox4mult
Puede pasar una matriz como el primer argumento, que se pasa a la función de multiplicar de hessian.quadprog
Puede utilizar una función anidada para proporcionar el valor de la segunda matriz.
La segunda parte del ejemplo muestra cómo apretar la tolerancia para compensar un preacondicionador aproximado en lugar de una matriz exacta.TolPCG
H
O bien se puede pasar como el primer argumento.A
B
quadprog
El ejemplo elige pasar como el primer argumento porque esto da como resultado un mejor preacondicionador (ver).B
Preacondicionamiento
quadprog(B,f,[],[],[],[],l,u,xstart,options)
Ahora, defina una función querunqpbox4
Contiene una función anidada que utiliza y para calcular el producto de matriz de hessian, donde.qpbox4mult
A
B
W
W = H*Y = (B + A*A')*Y
La función anidada debe tener el formulario
W = qpbox4mult(Hinfo,Y,...)
Los dos primeros argumentos y son obligatorios.Hinfo
Y
Carga los parámetros del problema desde.qpbox4.mat
Se usa para establecer la opción en un identificador de función que apunta a.optimoptions
HessianMultiplyFcn
qpbox4mult
Llamadas con el primer argumento.quadprog
B
El primer argumento de la función anidada debe ser el mismo que el primer argumento pasado, que en este caso es la matriz B.qpbox4mult
quadprog
El segundo argumento es la matriz (de).qpbox4mult
Y
W = H*Y
Porque espera ser utilizado para formar el producto matriz hessian, es siempre una matriz con filas, donde es el número de dimensiones en el problema.quadprog
Y
Y
n
n
El número de columnas en puede variar.Y
La función está anidada de modo que el valor de la matriz proviene de la función externa. software incluye el archivo.qpbox4mult
A
Optimization Toolbox™runqpbox4.m
function [fval, exitflag, output, x] = runqpbox4 %RUNQPBOX4 demonstrates 'HessianMultiplyFcn' option for QUADPROG with bounds. problem = load('qpbox4'); % Get xstart, u, l, B, A, f xstart = problem.xstart; u = problem.u; l = problem.l; B = problem.B; A = problem.A; f = problem.f; mtxmpy = @qpbox4mult; % function handle to qpbox4mult nested function % Choose algorithm and the HessianMultiplyFcn option options = optimoptions(@quadprog,'Algorithm','trust-region-reflective','HessianMultiplyFcn',mtxmpy); % Pass B to qpbox4mult via the H argument. Also, B will be used in % computing a preconditioner for PCG. [x, fval, exitflag, output] = quadprog(B,f,[],[],[],[],l,u,xstart,options); function W = qpbox4mult(B,Y) %QPBOX4MULT Hessian matrix product with dense structured Hessian. % W = qpbox4mult(B,Y) computes W = (B + A*A')*Y where % INPUT: % B - sparse square matrix (512 by 512) % Y - vector (or matrix) to be multiplied by B + A'*A. % VARIABLES from outer function runqpbox4: % A - sparse matrix with 512 rows and 10 columns. % % OUTPUT: % W - The product (B + A*A')*Y. % % Order multiplies to avoid forming A*A', % which is large and dense W = B*Y + A*(A'*Y); end end
Para llamar a la rutina de minimización cuadrática contenida en, ingreserunqpbox4
[fval,exitflag,output] = runqpbox4;
para ejecutar el código anterior. A continuación, muestre los valores para,, y.fval
exitflag
output.iterations
output.cgiterations
fval,exitflag,output.iterations, output.cgiterations fval = -1.0538e+03 exitflag = 3 ans = 18 ans = 30
Después de 18 iteraciones con un total de 30 iteraciones PCG, el valor de la función se reduce a
fval fval = -1.0538e+003
y la optimalidad de primer orden es
output.firstorderopt ans = 0.0043
A veces no se puede usar para calcular un preacondicionador porque solo existe implícitamente.quadprog
H
H
En su lugar, usa, el argumento pasado en lugar de, para calcular un preacondicionador. es una buena opción porque es del mismo tamaño que y se aproxima a algún grado.quadprog
B
H
B
H
H
Si no fueran del mismo tamaño que, calcularían un preacondicionador basado en algunas matrices de escalado diagonal determinadas a partir del algoritmo.B
H
quadprog
Típicamente, esto no llevaría a cabo también.
Dado que el preacondicionador es más aproximado que cuando está disponible explícitamente, puede ser necesario ajustar el parámetro a un valor algo más pequeño.H
TolPCG
Este ejemplo es el mismo que el anterior, pero se reduce del valor predeterminado 0,1 a 0,01.TolPCG
function [fval, exitflag, output, x] = runqpbox4prec %RUNQPBOX4PREC demonstrates 'HessianMultiplyFcn' option for QUADPROG with bounds. problem = load('qpbox4'); % Get xstart, u, l, B, A, f xstart = problem.xstart; u = problem.u; l = problem.l; B = problem.B; A = problem.A; f = problem.f; mtxmpy = @qpbox4mult; % function handle to qpbox4mult nested function % Choose algorithm, the HessianMultiplyFcn option, and override the TolPCG option options = optimoptions(@quadprog,'Algorithm','trust-region-reflective',... 'HessianMultiplyFcn',mtxmpy,'TolPCG',0.01); % Pass B to qpbox4mult via the H argument. Also, B will be used in % computing a preconditioner for PCG. % A is passed as an additional argument after 'options' [x, fval, exitflag, output] = quadprog(B,f,[],[],[],[],l,u,xstart,options); function W = qpbox4mult(B,Y) %QPBOX4MULT Hessian matrix product with dense structured Hessian. % W = qpbox4mult(B,Y) computes W = (B + A*A')*Y where % INPUT: % B - sparse square matrix (512 by 512) % Y - vector (or matrix) to be multiplied by B + A'*A. % VARIABLES from outer function runqpbox4prec: % A - sparse matrix with 512 rows and 10 columns. % % OUTPUT: % W - The product (B + A*A')*Y. % % Order multiplies to avoid forming A*A', % which is large and dense W = B*Y + A*(A'*Y); end end
Ahora, introduzca
[fval,exitflag,output] = runqpbox4prec;
para ejecutar el código anterior. Después de 18 iteraciones y 50 iteraciones PCG, el valor de la función tiene el mismo valor que cinco dígitos significativos
fval fval = -1.0538e+003
y la optimalidad de primer orden es esencialmente la misma.
output.firstorderopt ans = 0.0043
Nota
La disminución de demasiada puede aumentar sustancialmente el número de iteraciones PCG.TolPCG