Método de relajación de Gauss-Seidel (RGS) A fin de lograr una convergencia más rápida a la proporcionada en el método implementado por Jacobi, se realizan cambios en el algoritmo. Sabemos que se definió a la matriz A como: A = L + R + D, llegando a la siguiente ecuación: DXK+1 = B + (D – A) XK Esta vez haremos el siguiente cambio: A=G+R ⇒ G–A=-R L+D=G ⇒ (3.24) Reemplazando en la ecuación (3.20), se obtiene: (G + R )(X K +1 − X K ) = B − (G + R )X K (3.25) Desarrollando: GX K +1 − GX K + RX K +1 − RX K = B − GX K − RX K Eliminando términos: GX K +1 = B − RX K +1 Ajustando el lado derecho para el proceso iterativo, se llega a la formula recursiva: GX K +1 = B − RX K (3.26) Desarrollando (3.26) en forma matricial, se tiene: a11 0 a 21 a 22 . + a a 31 32 . a 41 a 42 a nn a n1 a n 2 a nn −1 0 x1( k +1) b1 0 a12 a13 a1n x (2k +1) b1 . . . = − . . . ( k +1) x n bn 0 a n −1 n x1( k ) (k) x 2 (k) x n Desarrollando en forma explícita tenemos: K +1 ii i a x Dónde: N + ∑ ai j x j <i K +1 j N = bi − ∑ ai j x Kj j >i (3.27) i = 1, 2, 3,......., N K, es el orden de aproximación y N el orden del sistema de ecuaciones. Ejemplo: Usando el método de Relajación de Gauss-Seidel, resolver el siguiente sistema: 3x + y = 3 2x + 4 y = 2 Utilizaremos una tolerancia de 0.06 y el siguiente vector de aproximación: x10 = 1.2 X = 0 x = 0.2 2 0 Escribiendo en forma matricial: 3 1 x 3 = 2 4 y 2 x = x1, y = x2 y N = 2 Dónde: Para obtener la primera aproximación (K = 1), usaremos la ecuación (3.27) con K = 0 y N = 2, haciendo variar i desde 1 hasta N. i=1 2 2 j <1 j >1 a 11 x 11 + ∑ a 1j x 1j = b1 − ∑ a 1j x 0j a 11 x + 0 = b1 − a 12 x 1 1 b1 − a 12 x 02 3 − 1(0.2 ) ⇒ x = = = 0.933 a 11 3 0 2 1 1 i=2 2 2 j <2 j >2 a 22 x 12 + ∑ a 2j x 1j = b 2 − ∑ a 2j x 0j a 22 x 12 + a 21 x 11 = b 2 − 0 ⇒ x 12 = b 2 − a 21 x 11 2 − 2(0.933) = = 0.034 a 22 4 El vector solución en primera aproximación es: 0.933 X1 = 0.034 Evaluamos ahora la convergencia, calculando si se cumple ó no la condición de convergencia (evaluación de la diferencia). X K +1 − X K ≤ tolerancia (TOL) Operando: 0.933 1.2 0.267 − = 0.034 0.2 0.166 Dado que aún no se ha logrado cumplir la condición para detener las iteraciones, se continúa el proceso para una segunda aproximación (K = 2). Ahora para K = 1y N = 2 i=1 2 2 j <1 j >1 a11 x12 + ∑ a1 j x 2j = b1 − ∑ a1 j x1j a11 x12 + 0 = b1 − a12 x12 ⇒ x12 = b1 − a12 x12 3 − 1(0.034) = = 0.989 a11 3 i=2 2 2 j <2 j >2 a 22 x22 + ∑ a 2 j x 2j = b2 − ∑ a 2 j x1j a 22 x + a x = b2 − 0 ⇒ 2 2 2 21 1 b2 − a 21 x12 2 − 2 (0.989) x = = = 0.006 a 22 4 2 2 El vector solución en segunda aproximación es: 0.989 X 2 = 0.006 Evaluamos la condición de convergencia, con la tolerancia indicada (0.06) 0.989 0.933 0.056 − = 0.006 0.034 0.028 Se observa que cumple la condición y por lo tanto se detienen las iteraciones, la solución aproximada del sistema es: y = 0.006 y x = 0.989 Los resultados computacionales con el programa en Fortran son: SOLUCION DE SISTEMAS LINEALES GAUSS-SEIDEL ========================================== INGRESO DE DATOS ============================================= INGRESE LA DIMENSION DE LA MATRIZ 2 INGRESE LA TOLERANCIA 0.06 INGRESE MATRIZ DE COEFICIENTES A 3 1 2 4 INGRESE ELEMENTOS DE B 3 2 INGRESE ELEMENTOS DE VECTOR APROXIMADO 1.2 0.2 ============================================= RESULTADOS EN TODOS LOS ORDENES =============================== X: 1 1.2000 0.9333 0.9889 X: 2 0.2000 0.0333 0.0056 =============================== TOLERANCIA: 0.060000 NUM ITERACIONES: 2 Codificación La codificación que genera los resultados mostrados del ejemplo anterior es la siguiente: PROGRAM RELAJACION_GAUSS_SEIDEL REAL(4) A(100,100),B(100),XP(100,100) 5 10 WRITE WRITE WRITE WRITE WRITE (*,*)'' (*,*)' (*,*)' (*,*)'' (*,*)' SOLUCION DE SISTEMAS LINEALES GAUSS-SEIDEL' ==========================================' INGRESO DE DATOS' WRITE (*,*)' =============================================' WRITE (*,*)' INGRESE LA DIMENSION DE LA MATRIZ ' READ (*,*)M WRITE (*,*)' INGRESE LA TOLERANCIA' READ(*,*)TOL K2=0 WRITE (*,*)' INGRESE MATRIZ DE COEFICIENTES A' DO I=1,M READ (*,*)(A(I,J),J=1,M) END DO WRITE (*,*)' INGRESE ELEMENTOS DE B' DO I=1,M READ(*,*)B(I) END DO WRITE(*,*)'' WRITE (*,*)' INGRESE ELEMENTOS DE VECTOR APROXIMADO' K2=1 DO I=1,M READ(*,*)XP(K2,I) END DO WRITE (*,*)' =============================================' WRITE (*,*)'' DO I=1,M SUMA1=0 SUMA2=0 DO J=1,M IF (J.LT.I) THEN SUMA1=SUMA1+A(I,J)*XP(K2+1,J) END IF IF (J.GT.I) THEN SUMA2=SUMA2+A(I,J)*XP(K2,J) END IF XP(K2+1,I)=(B(I)-SUMA1-SUMA2)/A(I,I) END DO END DO DO I=1,M ER=ABS(XP(K2,I)-XP(K2+1,I)) IF (ER.GT.TOL)THEN K2=K2+1 GOTO 10 ELSE END IF END DO WRITE(*,*)' RESULTADOS EN TODOS LOS ORDENES' WRITE(*,*)' ===============================' DO J=1,M WRITE(*,25)J,(XP(MM,J),MM=1,K2+1) END DO WRITE(*,*)' ===============================' WRITE(*,23)TOL,K2 FORMAT (' TOLERANCIA:',F9.6,1X,'NUM ITERACIONES:',I3) FORMAT (' X:',I3,8(1x,F8.4)) END 20 23 25 Observaciones: • • • • El método de relajación de Jacobi y el método RGS convergen solo para matrices cuya diagonal es dominante. Es necesario calcular la tasa de convergencia para cada sistema evaluado. Para calcular la solución en primer orden (iniciando con K = 0), el programa necesita de una solución aproximada, esto determinara el número de iteraciones requeridas. Para detener el proceso iterativo debe compararse la diferencia en valor absoluto de cada uno de los componentes de los vectores aproximados con cierta tolerancia.