El método del gradiente conjugado también se puede utilizar para resolver problemas de optimización sin restricciones, como la minimización de energía . Se atribuye comúnmente a Magnus Hestenes y Eduard Stiefel , [1] [2] quienes lo programaron en el Z4 , [3] y lo investigaron exhaustivamente. [4] [5]
para el vector , donde la matriz conocida es simétrica (es decir, A T = A ), definida positiva (es decir, x T Ax > 0 para todos los vectores distintos de cero en R n ), y real , y también se conoce. Denotamos la solución única de este sistema por .
La derivación como método directo
El método del gradiente conjugado se puede derivar desde varias perspectivas diferentes, incluida la especialización del método de dirección conjugada para la optimización y la variación de la iteración de Arnoldi / Lanczos para problemas de valores propios . A pesar de las diferencias en sus enfoques, estas derivaciones comparten un tema común: probar la ortogonalidad de los residuos y la conjugación de las direcciones de búsqueda. Estas dos propiedades son cruciales para desarrollar la conocida formulación sucinta del método.
Decimos que dos vectores distintos de cero u y v son conjugados (con respecto a ) si
Como es simétrico y definido positivo, el lado izquierdo define un producto interno
Dos vectores son conjugados si y sólo si son ortogonales respecto de este producto interno. Ser conjugado es una relación simétrica: si es conjugado a , entonces es conjugado a . Supóngase que
es un conjunto de vectores mutuamente conjugados con respecto a , es decir, para todo . Entonces forma una base para , y podemos expresar la solución de en esta base:
Multiplicando por la izquierda el problema con el vector obtenemos
y entonces
Esto proporciona el siguiente método [4] para resolver la ecuación Ax = b : encontrar una secuencia de direcciones conjugadas y luego calcular los coeficientes .
Como método iterativo
Si elegimos los vectores conjugados con cuidado, es posible que no los necesitemos todos para obtener una buena aproximación a la solución . Por lo tanto, queremos considerar el método del gradiente conjugado como un método iterativo. Esto también nos permite resolver aproximadamente sistemas donde n es tan grande que el método directo tomaría demasiado tiempo.
Denotamos la estimación inicial para x ∗ por x 0 (podemos suponer sin pérdida de generalidad que x 0 = 0 , de lo contrario, consideremos el sistema Az = b − Ax 0 en su lugar). Comenzando con x 0 , buscamos la solución y en cada iteración necesitamos una métrica que nos diga si estamos más cerca de la solución x ∗ (que nos es desconocida). Esta métrica proviene del hecho de que la solución x ∗ es también el minimizador único de la siguiente función cuadrática
La existencia de un minimizador único es evidente ya que su matriz hessiana de derivadas segundas es simétrica positiva-definida.
y que el minimizador (usar D f ( x )=0) resuelve el problema inicial se deduce de su primera derivada
Esto sugiere tomar el primer vector base p 0 como el negativo del gradiente de f en x = x 0 . El gradiente de f es igual a Ax − b . Comenzando con una estimación inicial x 0 , esto significa que tomamos p 0 = b − Ax 0 . Los otros vectores en la base serán conjugados al gradiente, de ahí el nombre de método de gradiente conjugado . Tenga en cuenta que p 0 también es el residuo proporcionado por este paso inicial del algoritmo.
Como se observó anteriormente, es el gradiente negativo de en , por lo que el método de descenso de gradiente requeriría moverse en la dirección r k . Aquí, sin embargo, insistimos en que las direcciones deben ser conjugadas entre sí. Una forma práctica de hacer cumplir esto es requerir que la siguiente dirección de búsqueda se construya a partir del residuo actual y todas las direcciones de búsqueda anteriores. La restricción de conjugación es una restricción de tipo ortonormal y, por lo tanto, el algoritmo puede verse como un ejemplo de ortonormalización de Gram-Schmidt . Esto da la siguiente expresión:
(ver la imagen en la parte superior del artículo para ver el efecto de la restricción de conjugación en la convergencia). Siguiendo esta dirección, la siguiente ubicación óptima está dada por
con
donde la última igualdad se sigue de la definición de . La expresión para se puede derivar si se sustituye la expresión para x k +1 en f y se minimiza con respecto a
El algoritmo resultante
El algoritmo anterior proporciona la explicación más sencilla del método del gradiente conjugado. Aparentemente, el algoritmo tal como se indica requiere el almacenamiento de todas las direcciones de búsqueda anteriores y vectores de residuos, así como muchas multiplicaciones de matriz-vector, y por lo tanto puede ser computacionalmente costoso. Sin embargo, un análisis más detallado del algoritmo muestra que es ortogonal a , es decir , para i ≠ j. Y es -ortogonal a , es decir , para . Esto se puede considerar que a medida que avanza el algoritmo, y abarcan el mismo subespacio de Krylov . Donde forman la base ortogonal con respecto al producto interno estándar, y forman la base ortogonal con respecto al producto interno inducido por . Por lo tanto, se puede considerar como la proyección de en el subespacio de Krylov.
Es decir, si el método CG comienza con , entonces [6] A continuación se detalla el algoritmo para resolver donde es una matriz real, simétrica y definida positiva. El vector de entrada puede ser una solución inicial aproximada o 0 . Es una formulación diferente del procedimiento exacto descrito anteriormente.
Observamos que se calcula mediante el método de descenso de gradiente aplicado a . La configuración haría que se calcule mediante el método de descenso de gradiente de manera similar a partir de , es decir, se puede utilizar como una implementación simple de un reinicio de las iteraciones de gradiente conjugado. [4] Los reinicios podrían ralentizar la convergencia, pero pueden mejorar la estabilidad si el método de gradiente conjugado se comporta mal, por ejemplo, debido a un error de redondeo .
Cálculo de residuos explícitos
Las fórmulas y , que se cumplen en aritmética exacta, hacen que las fórmulas y sean matemáticamente equivalentes. La primera se utiliza en el algoritmo para evitar una multiplicación adicional por ya que el vector ya está calculado para evaluar . La última puede ser más precisa, sustituyendo el cálculo explícito por el implícito por la recursión sujeta a la acumulación de error de redondeo , y por lo tanto se recomienda para una evaluación ocasional. [7]
Normalmente, se utiliza una norma del residuo como criterio de parada. La norma del residuo explícito proporciona un nivel garantizado de precisión tanto en aritmética exacta como en presencia de errores de redondeo , donde la convergencia se estanca naturalmente. Por el contrario, se sabe que el residuo implícito se vuelve cada vez más pequeño en amplitud muy por debajo del nivel de errores de redondeo y, por lo tanto, no se puede utilizar para determinar el estancamiento de la convergencia.
Cálculo de alfa y beta
En el algoritmo, se elige α k de modo que sea ortogonal a . El denominador se simplifica a partir de
ya que . El β k se elige de manera que sea conjugado a . Inicialmente, β k es
usando
y equivalentemente
El numerador de β k se reescribe como
porque y son ortogonales por diseño. El denominador se reescribe como
Utilizando que las direcciones de búsqueda p k están conjugadas y nuevamente que los residuos son ortogonales, esto da el β en el algoritmo después de cancelar α k .
""" gradiente_conjugado!(A, b, x)Devuelve la solución a `A * x = b` usando el método de gradiente conjugado."""función conjugate_gradient! (A :: MatrizAbstracta , b :: VectorAbstracto , x :: VectorAbstracto ; tol = eps ( eltype ( b )))# Inicializar vector residualresiduo = b - A * x# Inicializar el vector de dirección de búsquedadireccion_busqueda = copiar ( residual )# Calcular la norma residual cuadrática inicialnorma ( x ) = sqrt ( suma ( x .^ 2 ))old_resid_norm = norma ( residual )# Iterar hasta la convergenciamientras que old_resid_norm > tolA_direccion_de_busqueda = A * direccion_de_busquedatamaño_de_paso = antigua_norma_resid ^ 2 / ( dirección_de_búsqueda ' * A_dirección_de_búsqueda )#Actualizar solución@. x = x + tamaño_de_paso * dirección_de_búsqueda# Actualizar residual@. residual = residual - tamaño_de_paso * A_dirección_de_búsquedanew_resid_norm = norma ( residual )# Actualizar vector de dirección de búsqueda@ .direccion_de_busqueda = residual +( nueva_norma_residual / antigua_norma_residual ) ^ 2 * dirección_de_búsqueda# Actualizar la norma residual al cuadrado para la siguiente iteraciónantigua_norma_resid = nueva_norma_residfindevolver xfin
Ejemplo numérico
Consideremos el sistema lineal Ax = b dado por
Realizaremos dos pasos del método del gradiente conjugado comenzando con la estimación inicial
con el fin de encontrar una solución aproximada al sistema.
Solución
Como referencia, la solución exacta es
Nuestro primer paso es calcular el vector residual r 0 asociado a x 0 . Este residual se calcula a partir de la fórmula r 0 = b - Ax 0 , y en nuestro caso es igual a
Dado que esta es la primera iteración, utilizaremos el vector residual r 0 como nuestra dirección de búsqueda inicial p 0 ; el método de selección p k cambiará en iteraciones posteriores.
Ahora calculamos el escalar α 0 usando la relación
Ahora podemos calcular x 1 usando la fórmula
Este resultado completa la primera iteración, y el resultado es una solución aproximada "mejorada" del sistema, x 1 . Ahora podemos continuar y calcular el siguiente vector residual r 1 utilizando la fórmula
Nuestro siguiente paso en el proceso es calcular el escalar β 0 que eventualmente se utilizará para determinar la siguiente dirección de búsqueda p 1 .
Ahora, utilizando este escalar β 0 , podemos calcular la siguiente dirección de búsqueda p 1 utilizando la relación
Ahora calculamos el escalar α 1 utilizando nuestro p 1 recién adquirido y utilizando el mismo método que utilizamos para α 0 .
Finalmente, encontramos x 2 usando el mismo método que usamos para encontrar x 1 .
El resultado, x 2 , es una aproximación "mejor" a la solución del sistema que x 1 y x 0 . Si en este ejemplo se utilizara aritmética exacta en lugar de precisión limitada, entonces teóricamente se habría alcanzado la solución exacta después de n = 2 iteraciones ( siendo n el orden del sistema).
Propiedades de convergencia
El método del gradiente conjugado puede considerarse teóricamente como un método directo, ya que en ausencia de error de redondeo produce la solución exacta después de un número finito de iteraciones, que no es mayor que el tamaño de la matriz. En la práctica, la solución exacta nunca se obtiene ya que el método del gradiente conjugado es inestable con respecto incluso a pequeñas perturbaciones, por ejemplo, la mayoría de las direcciones no son conjugadas en la práctica, debido a una naturaleza degenerativa de la generación de los subespacios de Krylov.
Como método iterativo , el método del gradiente conjugado mejora de manera monótona (en la norma de energía) las aproximaciones a la solución exacta y puede alcanzar la tolerancia requerida después de un número relativamente pequeño (en comparación con el tamaño del problema) de iteraciones. La mejora es típicamente lineal y su velocidad está determinada por el número de condición de la matriz del sistema : cuanto mayor sea, más lenta será la mejora. [8]
Si es grande, el preacondicionamiento se utiliza comúnmente para reemplazar el sistema original por uno que sea más pequeño que , vea a continuación.
Teorema de convergencia
Definir un subconjunto de polinomios como
donde es el conjunto de polinomios de grado máximo .
Sean las aproximaciones iterativas de la solución exacta y definamos los errores como . Ahora, la tasa de convergencia se puede aproximar como [4] [9]
Esto demuestra que las iteraciones son suficientes para reducir el error a cualquier .
Nótese que el límite importante tiende a
Este límite muestra una tasa de convergencia más rápida en comparación con los métodos iterativos de Jacobi o Gauss-Seidel que escalan como .
En el teorema de convergencia no se supone ningún error de redondeo, pero el límite de convergencia es comúnmente válido en la práctica, como lo explicó teóricamente [ 5 ] Anne Greenbaum .
Convergencia práctica
Si se inicializa aleatoriamente, la primera etapa de iteraciones suele ser la más rápida, ya que el error se elimina dentro del subespacio de Krylov que inicialmente refleja un número de condición efectiva más pequeño. La segunda etapa de convergencia suele estar bien definida por el límite de convergencia teórico con , pero puede ser superlineal, dependiendo de una distribución del espectro de la matriz y la distribución espectral del error. [5] En la última etapa, se alcanza la precisión más pequeña alcanzable y la convergencia se detiene o el método puede incluso comenzar a divergir. En aplicaciones típicas de computación científica en formato de punto flotante de doble precisión para matrices de grandes tamaños, el método de gradiente conjugado utiliza un criterio de detención con una tolerancia que termina las iteraciones durante la primera o segunda etapa.
El método del gradiente conjugado preacondicionado
En la mayoría de los casos, es necesario un preacondicionamiento para garantizar una convergencia rápida del método del gradiente conjugado. Si es simétrico positivo-definido y tiene un número de condición mejor que , se puede utilizar un método del gradiente conjugado preacondicionado. Tiene la siguiente forma: [10]
repetir
Si r k +1 es suficientemente pequeño , entonces finaliza el bucle de salida si
Fin de repetición
El resultado es x k +1
La formulación anterior es equivalente a aplicar el método del gradiente conjugado regular al sistema preacondicionado [11].
dónde
La descomposición de Cholesky del precondicionador debe utilizarse para mantener la simetría (y la definitividad positiva) del sistema. Sin embargo, no es necesario calcular esta descomposición y es suficiente saber que . Se puede demostrar que tiene el mismo espectro que .
La matriz preacondicionadora M debe ser simétrica, definida positiva y fija, es decir, no puede cambiar de iteración a iteración. Si se viola alguna de estas suposiciones sobre el preacondicionador, el comportamiento del método del gradiente conjugado preacondicionado puede volverse impredecible.
Es importante tener en cuenta que no queremos invertir la matriz explícitamente para poder usarla en el proceso, ya que invertirla demandaría más tiempo y recursos computacionales que resolver el algoritmo de gradiente conjugado en sí. Como ejemplo, digamos que estamos usando un precondicionador que proviene de una factorización de Cholesky incompleta. La matriz resultante es la matriz triangular inferior y la matriz del precondicionador es:
Luego tenemos que resolver:
Pero:
Entonces:
Tomemos un vector intermedio :
Como y y se conocen, y es triangular inferior, resolver para es fácil y computacionalmente económico usando sustitución hacia adelante . Luego, sustituimos en la ecuación original:
Dado que y son conocidos, y es triangular superior, resolver es fácil y computacionalmente económico mediante sustitución hacia atrás .
Usando este método, no hay necesidad de invertir ni de forma explícita, y aún así obtenemos .
El método del gradiente conjugado preacondicionado flexible
En aplicaciones numéricamente desafiantes, se utilizan preacondicionadores sofisticados, que pueden llevar a un preacondicionamiento variable, que cambia entre iteraciones. Incluso si el preacondicionador es simétrico positivo-definido en cada iteración, el hecho de que pueda cambiar hace que los argumentos anteriores sean inválidos y en pruebas prácticas conduce a una desaceleración significativa de la convergencia del algoritmo presentado anteriormente. Uso de la fórmula de Polak-Ribière
puede mejorar drásticamente la convergencia en este caso. [13] Esta versión del método de gradiente conjugado preacondicionado se puede llamar [14] flexible , ya que permite un preacondicionamiento variable. También se muestra [15] que la versión flexible es robusta incluso si el preacondicionador no es simétrico positivo definido (SPD).
La implementación de la versión flexible requiere almacenar un vector adicional. Para un preacondicionador SPD fijo, ambas fórmulas para β k son equivalentes en aritmética exacta, es decir, sin el error de redondeo .
La explicación matemática del mejor comportamiento de convergencia del método con la fórmula de Polak-Ribière es que el método es localmente óptimo en este caso, en particular, no converge más lento que el método de descenso más pronunciado localmente óptimo. [16]
Vs. el método de descenso más pronunciado óptimo a nivel local
En los métodos de gradiente conjugado originales y preacondicionados, solo es necesario establecer para que sean localmente óptimos, utilizando la búsqueda de línea , métodos de descenso más pronunciado . Con esta sustitución, los vectores p son siempre los mismos que los vectores z , por lo que no es necesario almacenar los vectores p . Por lo tanto, cada iteración de estos métodos de descenso más pronunciado es un poco más barata en comparación con la de los métodos de gradiente conjugado. Sin embargo, estos últimos convergen más rápido, a menos que se utilice un preacondicionador (altamente) variable y/o no SPD , consulte más arriba.
Método de gradiente conjugado como controlador de retroalimentación óptimo para integradores dobles
El método del gradiente conjugado se puede aplicar a una matriz arbitraria de n por m aplicándolo a las ecuaciones normales A T A y al vector del lado derecho A T b , ya que A T A es una matriz semidefinida positiva simétrica para cualquier A . El resultado es un gradiente conjugado en las ecuaciones normales ( CGN o CGNR ).
A T Ax = A T b
Como método iterativo, no es necesario formar A T A explícitamente en la memoria, sino solo realizar las multiplicaciones matriz-vector y matriz transpuesta-vector. Por lo tanto, CGNR es particularmente útil cuando A es una matriz dispersa, ya que estas operaciones suelen ser extremadamente eficientes. Sin embargo, la desventaja de formar las ecuaciones normales es que el número de condición κ( A T A ) es igual a κ 2 ( A ) y, por lo tanto, la tasa de convergencia de CGNR puede ser lenta y la calidad de la solución aproximada puede ser sensible a errores de redondeo. Encontrar un buen preacondicionador es a menudo una parte importante del uso del método CGNR.
Se han propuesto varios algoritmos (por ejemplo, CGLS, LSQR). El algoritmo LSQR supuestamente tiene la mejor estabilidad numérica cuando A está mal condicionado, es decir, A tiene un número de condición grande .
Método de gradiente conjugado para matrices hermíticas complejas
El método del gradiente conjugado con una modificación trivial es extensible para resolver, dada una matriz A y un vector b de valor complejo, el sistema de ecuaciones lineales para el vector x de valor complejo, donde A es hermítica (es decir, A' = A) y la matriz definida positiva , y el símbolo ' denota la transpuesta conjugada . La modificación trivial es simplemente sustituir la transpuesta conjugada por la transpuesta real en todas partes.
Ventajas y desventajas
Las ventajas y desventajas de los métodos de gradiente conjugado se resumen en las notas de clase de Nemirovsky y BenTal. [18] : Sec.7.3
Un ejemplo patológico
Este ejemplo es de [19]
Sea , y defina Dado que es invertible, existe una solución única para . Resolverlo por descenso de gradiente conjugado nos da una convergencia bastante mala: En palabras, durante el proceso de CG, el error crece exponencialmente, hasta que de repente se vuelve cero cuando se encuentra la solución única.
^ Hestenes, Magnus R. ; Stiefel, Eduard (diciembre de 1952). "Métodos de gradientes conjugados para resolver sistemas lineales" (PDF) . Revista de investigación de la Oficina Nacional de Normas . 49 (6): 409. doi : 10.6028/jres.049.044 .
^ Straeter, TA (1971). Sobre la extensión de la clase Davidon-Broyden de rango uno, métodos de minimización cuasi-Newton a un espacio de Hilbert de dimensión infinita con aplicaciones a problemas de control óptimo (tesis doctoral). Universidad Estatal de Carolina del Norte. hdl : 2060/19710026200 – vía NASA Technical Reports Server.
^ Speiser, Ambros (2004). "Konrad Zuse und die ERMETH: Ein weltweiter Architektur-Vergleich" [Konrad Zuse y ERMETH: una comparación mundial de arquitecturas]. En Hellige, Hans Dieter (ed.). Geschichten der Informatik. Visionen, Paradigmen, Leitmotive (en alemán). Berlín: Springer. pag. 185.ISBN3-540-00217-0.
^ abcd Polyak, Boris (1987). Introducción a la optimización.
^ abc Greenbaum, Anne (1997). Métodos iterativos para resolver sistemas lineales . doi :10.1137/1.9781611970937. ISBN978-0-89871-396-1.
^ Paquette, Elliot; Trogdon, Thomas (marzo de 2023). "Universalidad de los algoritmos de gradiente conjugado y MINRES en matrices de covarianza de muestra". Communications on Pure and Applied Mathematics . 76 (5): 1085–1136. arXiv : 2007.00640 . doi :10.1002/cpa.22081. ISSN 0010-3640.
^ Shewchuk, Jonathan R (1994). Introducción al método del gradiente conjugado sin el dolor agonizante (PDF) .
^ Saad, Yousef (2003). Métodos iterativos para sistemas lineales dispersos (2.ª ed.). Filadelfia, Pensilvania: Society for Industrial and Applied Mathematics. pp. 195. ISBN978-0-89871-534-7.
^ Hackbusch, W. (21 de junio de 2016). Solución iterativa de grandes sistemas dispersos de ecuaciones (2.ª ed.). Suiza: Springer. ISBN978-3-319-28483-5.OCLC 952572240 .
^ Barrett, Richard; Berry, Michael; Chan, Tony F.; Demmel, James; Donato, June; Dongarra, Jack; Eijkhout, Victor; Pozo, Roldan; Romine, Charles; van der Vorst, Henk. Plantillas para la solución de sistemas lineales: bloques de construcción para métodos iterativos (PDF) (2.ª ed.). Filadelfia, PA: SIAM. p. 13. Consultado el 31 de marzo de 2020 .
^ Golub, Gene H.; Van Loan, Charles F. (2013). Cálculos matriciales (4.ª ed.). Johns Hopkins University Press. Sec. 11.5.2. ISBN978-1-4214-0794-4.
^ Concus, P.; Golub, GH; Meurant, G. (1985). "Preacondicionamiento de bloques para el método del gradiente conjugado". Revista SIAM sobre computación científica y estadística . 6 (1): 220–252. doi :10.1137/0906018.
^ Golub, Gene H.; Ye, Qiang (1999). "Método de gradiente conjugado preacondicionado inexacto con iteración interna-externa". Revista SIAM de informática científica . 21 (4): 1305. CiteSeerX 10.1.1.56.1755 . doi :10.1137/S1064827597323415.
^ Notay, Yvan (2000). "Gradientes conjugados flexibles". Revista SIAM de informática científica . 22 (4): 1444–1460. CiteSeerX 10.1.1.35.7473 . doi :10.1137/S1064827599362314.
^ Bouwmeester, Henricus; Dougherty, Andrew; Knyazev, Andrew V. (2015). "Preacondicionamiento no simétrico para métodos de gradiente conjugado y descenso más pronunciado 1". Procedia Computer Science . 51 : 276–285. arXiv : 1212.6680 . doi : 10.1016/j.procs.2015.05.241 . S2CID 51978658.
^ Knyazev, Andrew V.; Lashuk, Ilya (2008). "Métodos de descenso más pronunciado y gradiente conjugado con preacondicionamiento variable". Revista SIAM sobre análisis de matrices y aplicaciones . 29 (4): 1267. arXiv : math/0605767 . doi :10.1137/060675290. S2CID 17614913.
^ ab Ross, IM , "Una teoría de control óptimo para la optimización acelerada", arXiv :1902.09004, 2019.
^ Pennington, Fabian Pedregosa, Courtney Paquette, Tom Trogdon, Jeffrey. "Tutorial de teoría de matrices aleatorias y aprendizaje automático". random-matrix-learning.github.io . Consultado el 5 de diciembre de 2023 .{{cite web}}: CS1 maint: multiple names: authors list (link)
Lectura adicional
Atkinson, Kendell A. (1988). "Sección 8.9". Introducción al análisis numérico (2.ª ed.). John Wiley and Sons. ISBN 978-0-471-50023-0.
Avriel, Mordecai (2003). Programación no lineal: análisis y métodos . Dover Publishing. ISBN 978-0-486-43227-4.
Golub, Gene H.; Van Loan, Charles F. (2013). "Capítulo 11". Cálculos matriciales (4.ª ed.). Johns Hopkins University Press. ISBN 978-1-4214-0794-4.
Saad, Yousef (1 de abril de 2003). "Capítulo 6" . Métodos iterativos para sistemas lineales dispersos (2.ª ed.). SIAM. ISBN 978-0-89871-534-7.
Gérard Meurant: "Detección y corrección de errores silenciosos en el algoritmo de gradiente conjugado", Numerical Algorithms, vol. 92 (2023), pp. 869-891. url=https://doi.org/10.1007/s11075-022-01380-1
Meurant, Gerard; Tichy, Petr (2024). Estimación de la norma de error en el algoritmo de gradiente conjugado . SIAM. ISBN 978-1-61197-785-1.