En álgebra lineal numérica , el método de Gauss-Seidel , también conocido como método de Liebmann o método de desplazamiento sucesivo , es un método iterativo utilizado para resolver un sistema de ecuaciones lineales . Recibe su nombre de los matemáticos alemanes Carl Friedrich Gauss y Philipp Ludwig von Seidel . Si bien puede aplicarse a cualquier matriz con elementos no nulos en las diagonales, la convergencia solo está garantizada si la matriz es estrictamente diagonalmente dominante [ 1 ] o simétrica y definida positiva . Gauss solo lo mencionó en una carta privada a su alumno Gerling en 1823 [ 2 ] . Seidel no publicó nada al respecto hasta 1874 [ 3 ] .
Descripción
DejarSea un sistema cuadrado de n ecuaciones lineales, donde:
Cuandoyson conocidos ySi se desconoce, se puede utilizar el método de Gauss-Seidel para aproximarlo iterativamente.. El vectordenota la estimación inicial para, a menudoparaDenotemos porel-ésima aproximación o iteración dey porla aproximación deen el próximo (o-th) iteración.
Fórmula basada en matrices
La solución se obtiene iterativamente mediante donde la matrizse descompone en un componente triangular inferiory un componente triangular superior estrictode tal manera que. [ 4 ] Más específicamente, la descomposición deenyestá dado por:
Por qué funciona la fórmula basada en matrices
El sistema de ecuaciones lineales se puede reescribir como:
El método de Gauss-Seidel ahora resuelve el lado izquierdo de esta expresión para, utilizando el valor anterior paraen el lado derecho. Analíticamente, esto se puede escribir como
Fórmula basada en elementos
Sin embargo, aprovechando la forma triangular de, los elementos dese puede calcular secuencialmente para cada filautilizando sustitución hacia adelante : [ 5 ]
Observe que la fórmula utiliza dos sumatorias por iteración, que pueden expresarse como una sola sumatoria.que utiliza la iteración calculada más recientemente de. El procedimiento generalmente continúa hasta que los cambios realizados por una iteración estén por debajo de cierta tolerancia, como un residuo suficientemente pequeño .
Discusión
La fórmula elemento a elemento para el método de Gauss-Seidel está relacionada con la del método de Jacobi (iterativo) , con una diferencia importante:
En Gauss-Seidel, el cálculo deutiliza los elementos deque ya han sido calculados, y solo los elementos deque no se han calculado en el-ésima iteración. Esto significa que, a diferencia del método de Jacobi, solo se requiere un vector de almacenamiento, ya que los elementos se pueden sobrescribir a medida que se calculan, lo que puede ser ventajoso para problemas muy grandes.
Sin embargo, a diferencia del método de Jacobi, los cálculos para cada elemento suelen ser mucho más difíciles de implementar en paralelo , ya que pueden tener una ruta crítica muy larga , y por lo tanto, son más factibles para matrices dispersas . Además, los valores en cada iteración dependen del orden de las ecuaciones originales.
Gauss-Seidel es lo mismo que la sobre-relajación sucesiva con.
Convergencia
Las propiedades de convergencia del método de Gauss-Seidel dependen de la matriz.. Es decir, se sabe que el procedimiento converge si se cumple alguna de las siguientes condiciones:
- es simétrica definida positiva , [ 6 ] o
- es estrictamente o irreductiblemente diagonalmente dominante . [ 7 ]
El método de Gauss-Seidel puede converger incluso si no se cumplen estas condiciones.
Golub y Van Loan dan un teorema para un algoritmo que divideen dos partes. Supongamoses no singular. Seasea el radio espectral de. Luego las iteracionesdefinido porconverger apara cualquier vector inicialsies no singular y. [ 8 ]
Algoritmo
Dado que los elementos se pueden sobrescribir a medida que se calculan en este algoritmo, solo se necesita un vector de almacenamiento y se omite la indexación de vectores. El algoritmo es el siguiente:
El algoritmo del método Gauss-Seidel tiene como entradas: A , b y como salida: φElija una estimación inicial φ para la solución repita hasta converger para i desde 1 hasta n haga σ ← 0 para j desde 1 hasta n haga si j ≠ i entonces σ ← σ + a ij φ j fin si fin ( j -bucle) φ i ← ( b i − σ ) / a ii fin ( i -bucle) comprobar si se ha alcanzado la convergencia fin (repetir)
Ejemplos
Un ejemplo para la versión matricial
Un sistema lineal mostrado comoestá dado por:
Utilice la ecuación en la forma dónde:
Descomponeren la suma de un componente triangular inferiory un componente triangular superior estricto:
Lo contrario dees:
Ahora encuentra:
Conylos vectoresse puede obtener de forma iterativa.
En primer lugar, elige, Por ejemploCuanto más se acerque la estimación a la solución final, menos iteraciones necesitará el algoritmo.
Luego calcula:
Como era de esperar, el algoritmo converge a la solución: .
De hecho, la matriz A es estrictamente diagonalmente dominante, pero no definida positiva.
Otro ejemplo para la versión matricial
Otro sistema lineal mostrado comoestá dado por:
Utilice la ecuación en la forma dónde:
Descomponeren la suma de un componente triangular inferiory un componente triangular superior estricto:
Lo contrario dees:
Ahora encuentra:
Conylos vectoresse puede obtener de forma iterativa.
En primer lugar, tenemos que elegir, Por ejemplo
Luego calcula:
En una prueba de convergencia encontramos que el algoritmo diverge. De hecho, la matrizno es ni diagonalmente dominante ni definida positiva. Entonces, converge a la solución exacta. No está garantizado y, en este caso, no ocurrirá.
Un ejemplo para la versión de la ecuación
Supongamos que se daecuaciones y un punto de partidaEn cualquier paso de una iteración de Gauss-Seidel, resuelva la primera ecuación paraen términos de; luego resuelve la segunda ecuación paraen términos derecién encontrado y el resto; y continuar aLuego, repita las iteraciones hasta que se logre la convergencia, o deténgase si la divergencia en las soluciones comienza a superar un nivel predefinido.
Consideremos un ejemplo:
Resolver parayda:
Supongamos que (0, 0, 0, 0) es la aproximación inicial, entonces la primera solución aproximada viene dada por:
Utilizando las aproximaciones obtenidas, se repite el procedimiento iterativo hasta alcanzar la precisión deseada. A continuación se muestran las soluciones aproximadas tras cuatro iteraciones.
La solución exacta del sistema es (1, 2, −1, 1) .
Un ejemplo usando Python y NumPy
El siguiente procedimiento iterativo produce el vector solución de un sistema de ecuaciones lineales:
import numpy as npLÍMITE_DE_ITERACIÓN = 1000# Inicializar la matriz A = np.array ( [ [ 10.0 , - 1.0 , 2.0 , 0.0 ] , [ - 1.0 , 11.0 , - 1.0 , 3.0 ], [ 2.0 , - 1.0 , 10.0 , - 1.0 ], [ 0.0 , 3.0 , - 1.0 , 8.0 ], ] ) # Inicializar el vector RHS b = np.array ( [ 6.0 , 25.0 , - 11.0 , 15.0 ] )print ( "Sistema de ecuaciones:" ) for i in range ( A . shape [ 0 ]): row = " + " . join ( f " { A [ i , j ] : 3g } *x { j + 1 } " for j in range ( A . shape [ 1 ])) print ( f "[ { row } ] = [ { b [ i ] : 3g } ]" )x = np.zeros_like ( b ) para it_count en range ( 1 , ITERATION_LIMIT ) : x_new = np.zeros_like ( x ) print ( f " Iteración { it_count } : { x } " ) para i en range ( A.shape [ 0 ] ) : s1 = A [ i , : i ] @ x_new [: i ] s2 = A [ i , i + 1 :] @ x [ i + 1 : ] x_new [ i ] = ( b [ i ] - s1 - s2 ) / A [ i , i ] if np.allclose ( x , x_new , rtol = 1e - 8 ) : break x = x_newprint ( f "Solución: { x } " ) error = A @ x - b print ( f "Error: { error } " )Produce el siguiente resultado:
Sistema de ecuaciones: [ 10*x1 + -1*x2 + 2*x3 + 0*x4] = [ 6] [ -1*x1 + 11*x2 + -1*x3 + 3*x4] = [ 25] [ 2*x1 + -1*x2 + 10*x3 + -1*x4] = [-11] [ 0*x1 + 3*x2 + -1*x3 + 8*x4] = [ 15] Iteración 1: [ 0. 0. 0. 0.] Iteración 2: [ 0.6 2.32727273 -0.98727273 0.87886364] Iteración 3: [ 1.03018182 2.03693802 -1.0144562 0.98434122] Iteración 4: [ 1.00658504 2.00355502 -1.00252738 0.99835095] Iteración 5: [ 1.00086098 2.00029825 -1.00030728 0.99984975] Iteración 6: [ 1.00009128 2.00002134 -1.00003115 0.9999881 ] Iteración 7: [ 1.00000836 2.00000117 -1.00000275 0.99999922] Iteración 8: [ 1.00000067 [ 2.00000002 -1.00000021 0.99999996] Iteración 9: [ 1.00000004 1.99999999 -1.00000001 1. ] Iteración 10: [ 1. 2. -1. 1.] Solución: [ 1. 2. -1. 1.] Error: [ 2.06480930e-08 -1.25551054e-08 3.61417563e-11 0.00000000e+00]Programa para resolver un número arbitrario de ecuaciones usando Matlab.
El siguiente código utiliza la fórmula
función x = gauss_seidel ( A, b, x, iters ) para i = 1 : iters para j = 1 : tamaño ( A , 1 ) x ( j ) = ( b ( j ) - suma ( A ( j ,:) '.* x ) + A ( j , j ) * x ( j )) / A ( j , j ); fin fin finVéase también
- Método del gradiente conjugado
- propagación de creencias gaussiana
- Método iterativo: Sistemas lineales
- Método de Kaczmarz (un método "orientado a filas", mientras que el de Gauss-Seidel está "orientado a columnas". Véase, por ejemplo, este artículo ).
- División de matrices
- Iteración de Richardson
Notas
- ↑ Sauer, Timothy (2006). Análisis numérico (2.ª ed.). Pearson Education, Inc. pág. 109. ISBN 978-0-321-78367-7.
- ↑ Gauss 1903 , pág. 279 ; enlace directo .
- ↑ Seidel, Ludwig (1874). "Über ein Verfahren, die Gleichungen, auf welche die Methode der kleinsten Quadrate führt, sowie lineäre Gleichungen überhaupt, durch sucesive Annäherung aufzulösen" [ Sobre un proceso para resolver mediante aproximaciones sucesivas las ecuaciones a las que conduce el método de mínimos cuadrados, así como las ecuaciones lineales en general ] . Abhandlungen der Mathematisch-Physikalischen Klasse der Königlich Bayerischen Akademie der Wissenschaften (en alemán). 11 (3): 81-108 .
- ^ Préstamo Golub y Van 1996 , pág. 511 .
- ↑ Golub y Van Loan 1996 , ecuación (10.1.3)
- ↑ Golub y Van Loan 1996 , Teorema 10.1.2 .
- ↑ Bagnara, Roberto (marzo de 1995). "Una prueba unificada para la convergencia de los métodos de Jacobi y Gauss-Seidel". SIAM Review . 37 (1): 93– 97. CiteSeerX 10.1.1.26.5207 . doi : 10.1137/1037008 . JSTOR 2132758 .
- ↑ Golub y Van Loan 1996 , Teorema 10.1.2
Referencias
- Gauss, Carl Friedrich (1903), Werke (en alemán), vol. 9, Gotinga: Köninglichen Gesellschaft der Wissenschaften.
- Golub, Gene H .; Van Loan, Charles F. (1996), Matrix Computations (3.ª ed.), Baltimore: Johns Hopkins, ISBN 978-0-8018-5414-9.
- Black, Noel y Moore, Shirley. "Método de Gauss-Seidel" . MathWorld .
Este artículo incorpora texto del artículo Gauss-Seidel_method en CFD-Wiki , que está bajo la licencia GFDL .
Enlaces externos
- "Método Seidel" , Enciclopedia de Matemáticas , EMS Press , 2001 [1994]
- Gauss-Seidel de www.math-linux.com
- Gauss-Seidel del Instituto de Métodos Numéricos Holísticos
- Iteración de Gauss Siedel de www.geocities.com
- El método de Gauss-Seidel
- Bickson
- Código Matlab
- Ejemplo de código C
- Álgebra lineal numérica
- Relajación (métodos iterativos)