Método de Gauss-Seidel



 -Fundamento Teórico-

El método de Gauss-Seidel se basa en el principio de la convergencia iterativa para encontrar la solución de un sistema de ecuaciones lineales. El proceso se puede resumir en los siguientes pasos:
  1. Sistema de Ecuaciones: Se parte de un sistema de ecuaciones lineales de la forma AX = B, donde A es la matriz de coeficientes, X es el vector de incógnitas y B es el vector de términos constantes. 
  2. Desarrollo de las Ecuaciones: Se despeja cada incógnita (xᵢ) de su respectiva ecuación. 
  3. Iteración Inicial: Se asignan valores iniciales (estimados) a las incógnitas. 
  4. Iteración Sucesiva: En cada iteración, se calcula el nuevo valor de cada incógnita (xᵢ) utilizando los valores recién calculados de las incógnitas anteriores en la misma iteración, y los valores iniciales de las incógnitas que aún no han sido calculadas en esa iteración. 
  5. Evaluación de la Convergencia: Se continúa iterando hasta que la diferencia entre los valores de las incógnitas en dos iteraciones consecutivas sea menor que un umbral predefinido (tolerancia). 

-Algoritmo del Método-

  1. 1. Inicialización:
    Asignar valores iniciales a las incógnitas del sistema. 
  2. 2. Iteración:
    • Para cada ecuación:
      • Despejar la incógnita principal de la ecuación. 
      • Reemplazar las otras incógnitas en la ecuación con sus valores más recientes (calculados en la iteración actual o en una iteración anterior). 
      • Resolver la ecuación para obtener el nuevo valor de la incógnita principal. 
    • Repetir este paso para todas las ecuaciones del sistema. 
  3. 3. Verificación de convergencia:
    Calcular la diferencia entre los valores de las incógnitas de la iteración actual y la iteración anterior. 
  4. 4. Continuación:
    Si la diferencia es menor que un umbral predefinido, el método ha convergido y la solución se ha encontrado. De lo contrario, volver al paso 2 y repetir la iteración. 
Consideraciones:
  • El método de Gauss-Seidel converge si la matriz de coeficientes del sistema de ecuaciones es diagonalmente dominante.
  • El método de Gauss-Seidel generalmente converge más rápidamente que el método de Jacobi.
  • El número de iteraciones necesarias para la convergencia puede variar según el sistema de ecuaciones y los valores iniciales. 

-Ejercicio Resuelto Paso a Paso-

resolver:

{4x+y+z=7x+3y+z=8x+y+5z=6\begin{cases} 4x + y + z = 7 \\ x + 3y + z = -8 \\ x + y + 5z = 6 \end{cases}

Paso 1: Despejar cada variable

Se despeja cada variable usando su ecuación correspondiente:

x=14(7yz)y=13(8xz)z=15(6xy)\begin{aligned} x &= \frac{1}{4}(7 - y - z) \\ y &= \frac{1}{3}(-8 - x - z) \\ z &= \frac{1}{5}(6 - x - y) \end{aligned}

Paso 2: Estimación inicial

Tomamos como punto de partida:

x(0)=0,y(0)=0,z(0)=0x^{(0)} = 0,\quad y^{(0)} = 0,\quad z^{(0)} = 0

🔁 Iteración 1

Usamos los valores iniciales y vamos actualizando inmediatamente:

  1. x(1)=14(700)=1.75x^{(1)} = \frac{1}{4}(7 - 0 - 0) = 1.75

  2. y(1)=13(81.750)=9.753=3.25y^{(1)} = \frac{1}{3}(-8 - 1.75 - 0) = \frac{-9.75}{3} = -3.25

  3. z(1)=15(61.75(3.25))=15(61.75+3.25)=7.55=1.5z^{(1)} = \frac{1}{5}(6 - 1.75 - (-3.25)) = \frac{1}{5}(6 - 1.75 + 3.25) = \frac{7.5}{5} = 1.5


🔁 Iteración 2

Usamos los valores de la iteración 1:

  1. x(2)=14(7(3.25)1.5)=14(7+3.251.5)=8.754=2.1875x^{(2)} = \frac{1}{4}(7 - (-3.25) - 1.5) = \frac{1}{4}(7 + 3.25 - 1.5) = \frac{8.75}{4} = 2.1875

  2. y(2)=13(82.18751.5)=11.68753=3.8958y^{(2)} = \frac{1}{3}(-8 - 2.1875 - 1.5) = \frac{-11.6875}{3} = -3.8958

  3. z(2)=15(62.1875(3.8958))=15(62.1875+3.8958)=7.70835=1.5417z^{(2)} = \frac{1}{5}(6 - 2.1875 - (-3.8958)) = \frac{1}{5}(6 - 2.1875 + 3.8958) = \frac{7.7083}{5} = 1.5417


🔁 Iteración 3

  1. x(3)=14(7(3.8958)1.5417)=14(7+3.89581.5417)=2.3385x^{(3)} = \frac{1}{4}(7 - (-3.8958) - 1.5417) = \frac{1}{4}(7 + 3.8958 - 1.5417) = 2.3385

  2. y(3)=13(82.33851.5417)=11.88023=3.9601y^{(3)} = \frac{1}{3}(-8 - 2.3385 - 1.5417) = \frac{-11.8802}{3} = -3.9601

  3. z(3)=15(62.3385(3.9601))=15(62.3385+3.9601)=7.62165=1.5243z^{(3)} = \frac{1}{5}(6 - 2.3385 - (-3.9601)) = \frac{1}{5}(6 - 2.3385 + 3.9601) = \frac{7.6216}{5} = 1.5243


Criterio de paro

Cuando el cambio entre iteraciones sea muy pequeño (por ejemplo < 0.01), podemos detenernos. En este caso vemos que se va estabilizando:

  • x2.34x \approx 2.34

  • y3.96y \approx -3.96

  • z1.52z \approx 1.52

-Código del Método-

import numpy as np
import matplotlib.pyplot as plt

# Sistema de ecuaciones:
# 4x + y + z = 7
# x + 3y + z = -8
# x + y + 5z = 6

# Coeficientes y términos independientes
A = np.array([[4.0, 1.0, 1.0],
              [1.0, 3.0, 1.0],
              [1.0, 1.0, 5.0]])
b = np.array([7.0, -8.0, 6.0])

# Condiciones iniciales
x = np.zeros(3)
max_iter = 25
tolerance = 1e-6

# Para graficar el historial de cada variable
history = [x.copy()]

# Método de Gauss-Seidel
for iteration in range(max_iter):
    x_new = x.copy()
    for i in range(len(A)):
        s1 = sum(A[i][j] * x_new[j] for j in range(i))
        s2 = sum(A[i][j] * x[j] for j in range(i + 1, len(A)))
        x_new[i] = (b[i] - s1 - s2) / A[i][i]

    history.append(x_new.copy())

    if np.allclose(x, x_new, atol=tolerance):
        print(f"Convergió en {iteration + 1} iteraciones.")
        break

    x = x_new

# Convertir historial a numpy array para graficar
history = np.array(history)

# Mostrar resultado
print("Aproximación final:")
print(f"x = {x[0]:.6f}, y = {x[1]:.6f}, z = {x[2]:.6f}")

# Graficar la convergencia de cada variable
plt.figure(figsize=(10, 6))
plt.plot(history[:, 0], label='x')
plt.plot(history[:, 1], label='y')
plt.plot(history[:, 2], label='z')
plt.xlabel('Iteración')
plt.ylabel('Valor de la variable')
plt.title('Convergencia del método de Gauss-Seidel')
plt.grid(True)
plt.legend()
plt.show()

-Grafica-


-Video Explicativo-


-Conclusión-

El método de Gauss-Seidel es una técnica iterativa para resolver sistemas de ecuaciones lineales, queconverge más rápido que el método de Jacobi, pero solo si la matriz de
coeficientes es diagonalmente dominante o si es simétrica y definida positiva.
Su eficiencia radica en utilizar los valores de las incógnitas recién calculados en la
misma iteración, acelerando la convergencia.

Comentarios