Sobrerrelajación sucesiva
En álgebra lineal numérica, el método de sobre-relajación sucesiva (SOR), es una variante del método de Gauss-Seidel para estimar la solución de un sistema lineal de ecuaciones, permitiendo una convergencia más rápida.
Fue propuesto simultáneamente por David M. Young Jr. y Stanley P. Frankel en 1950, con el propósito de resolver sistemas lineales en ordenadores digitales. Anteriormente ya existían métodos de tipo sobre-relajación, como el método de Lewis Fry Richardson, y los métodos desarrollados por R. V. Southwell. Sin embargo, estos últimos estaban diseñados para ser utilizados por calculadoras humanas, requiriendo alguna pericia para asegurar convergencia a la solución, lo que los hacía inaplicables para ordenadores digitales. Se pueden encontrar detalles de estos aspectos en la tesis de David M. Young Jr.[1]
Formulación matricial
[editar]Se considera un sistema lineal cuadrado, de ecuaciones, con variable desconocida :
La matriz A se puede escribir como la suma de: su componente diagonal , y sus componentes estrictamente triangular inferior y superior, y respectivamente: dónde:
De esta forma, el sistema de ecuaciones lineales puede ser escrito como:para cualquier constante , denominada factor de relajación. El método SOR es una técnica iterativa que en cada iteración "despeja" del lado izquierdo de esta igualdad, utilizando el valor de del paso anterior en el lado derecho. Analíticamente, esto puede ser escrito como:dónde es la k-ésima aproximación de , y es la nueva estimación que se quiere determinar. Como se puede ver, la matriz de iteración del método es:
Formulación por coordenadas
[editar]En la práctica se evita hallar la inversa de forma explícita al aplicar SOR. En su lugar se puede resolver el sistema de ecuaciones lineales que se obtiene al multiplicar cada lado de la iteración por a la izquierda:
Dado que la matriz es triangular inferior, se puede hallar mediante sustitución hacia adelante. De esta forma se obtiene una expresión para cada coordenada de la estimación :
Vínculo con el método de Gauss-Seidel
[editar]Como se puede ver en la expresión anterior, si se toma , se obtiene el método de Gauss-Seidel como caso particular de SOR. Para los demás valores de , la estimación de SOR es una combinación convexa de la estimación SOR del paso anterior, y la estimación que se obtendría aplicando un paso de Gauss-Seidel a la estimación SOR del paso anterior:
Convergencia
[editar]Una condición necesaria para que el algoritmo SOR sea convergente, es que se cumpla que .[2] En general esta condición no es suficiente para asegurar la convergencia, aunque sí lo es para cierto tipo de matrices. En 1947, Ostrowski probó que si es simétrica y definida positiva, el método SOR converge si y solo si .[2]
Tasa de convergencia
[editar]Generalmente es deseable seleccionar de forma que el método no solo sea convergente, sino que logre la convergencia lo más rápido posible. El valor de con el que se logra la mejor tasa de convergencia se denomina factor de relajación óptimo, y se denota . Esta tasa o velocidad de convergencia viene dada por el recíproco del radio espectral de la matriz de iteración, por lo que encontrar la mejor tasa de convergencia se reduce a minimizar como una función de . Por lo tanto, la elección de no siempre es sencilla, y depende de las propiedades de la matriz del sistema.
Bajo ciertas hipótesis, es posible obtener una expresión analítica para el radio espectral , y hallar en particular el donde éste se minimiza (mayor tasa de convergencia). Supongamos en particular que se cumplen las siguientes hipótesis:[3][4]
- el parámetro de relajación cumple la condición necesaria de convergencia: ,
- los valores propios de la matriz de iteración de Jacobi, son todos reales,
- el método de Jacobi es convergente: , y
- la descomposición matricial satisface la propiedad que para todo y .
Entonces el radio espectral de la matriz de iteración de SOR puede ser expresado como:
donde el parámetro de relajación óptimo que minimiza el radio espectral es
En particular, para (Gauss-Seidel) se cumple que .
La última hipótesis se satisface para matrices tridiagonales, pues para la matriz diagonal con componentes , y .
Pseudo-código del algoritmo
[editar]Dado que las estimaciones del algoritmo pueden ser sobre-escritas cuando están siendo computadas, la implementación del algoritmo requiere un único vector de almacenamiento en cada iteración. Por lo tanto, en el siguiente pseudo-código se omite la indexación de cada vector.
Entradas: A, b, ω Salida:
Escoger una estimación inicial de la solución while (no converge) for i de 1 hasta n hacer for j de 1 hasta n hacer if j ≠ i entonces end if end (j-bucle) end (i-bucle) verificar posible convergencia end
- Nota
- El término: , puede ser escrito como: . De esta forma se ahorra una multiplicación en cada iteración del bucle for exterior.
Ejemplo
[editar]Se considera el siguiente sistema de ecuaciones, de tamaño :
Para estimar su solución se aplica SOR con un factor de relajación y estimación inicial . En cada iteración se obtienen las estimaciones que se muestran en la siguiente tabla. El método converge a la solución exacta (3, −2, 2, 1).
Iteración | ||||
---|---|---|---|---|
0 | 0 | 0 | 0 | 0 |
1 | 0.25 | -2.78125 | 1.6289062 | 0.5152344 |
2 | 1.2490234 | -2.2448974 | 1.9687712 | 0.9108547 |
3 | 2.070478 | -1.6696789 | 1.5904881 | 0.76172125 |
... | ... | ... | ... | ... |
37 | 2.9999998 | -2.0 | 2.0 | 1.0 |
38 | 3.0 | -2.0 | 2.0 | 1.0 |
Implementación en Python
[editar]Una implementación en Python del pseudo-código proporcionado más arriba es:
import numpy as np
def sor_solver(A, b, omega, initial_guess, convergence_criteria):
"""
This is an implementation of the pseudo-code provided in the Wikipedia article.
Arguments:
A: nxn numpy matrix.
b: n dimensional numpy vector.
omega: relaxation factor.
initial_guess: An initial solution guess for the solver to start with.
convergence_criteria: The maximum discrepancy acceptable to regard the current solution as fitting.
Returns:
phi: solution vector of dimension n.
"""
phi = initial_guess[:]
residual = np.linalg.norm(np.matmul(A, phi) - b) #Initial residual
while residual > convergence_criteria:
for i in range(A.shape[0]):
sigma = 0
for j in range(A.shape[1]):
if j != i:
sigma += A[i][j] * phi[j]
phi[i] = (1 - omega) * phi[i] + (omega / A[i][i]) * (b[i] - sigma)
residual = np.linalg.norm(np.matmul(A, phi) - b)
print('Residual: {0:10.6g}'.format(residual))
return phi
# An example case that mirrors the one in the Wikipedia article
residual_convergence = 1e-8
omega = 0.5 #Relaxation factor
A = np.matrix([[4, -1, -6, 0],
[-5, -4, 10, 8],
[0, 9, 4, -2],
[1, 0, -7, 5]])
b = np.matrix([2, 21, -12, -6])
initial_guess = np.zeros(4)
phi = sor_solver(A, b, omega, initial_guess, residual_convergence)
print(phi)
Véase también
[editar]Referencias
[editar]- ↑ Young, David M. (1 de mayo de 1950), Iterative methods for solving partial difference equations of elliptical type, PhD thesis, Harvard University, consultado el 15 de junio de 2009.
- ↑ a b Demmel, J. W. (1997). Applied Numerical Linear Algebra. Society for Industrial and Applied Mathematics (SIAM).
- ↑ Hackbusch, Wolfgang (2016). «4.6.2». Iterative Solution of Large Sparse Systems of Equations | SpringerLink. Applied Mathematical Sciences (en inglés británico) 95. ISBN 978-3-319-28481-1. doi:10.1007/978-3-319-28483-5.
- ↑ Greenbaum, Anne (1997). «10.1». Iterative Methods for Solving Linear Systems. Frontiers in Applied Mathematics (en inglés británico) 17. ISBN 978-0-89871-396-1. doi:10.1137/1.9781611970937.