Método de Gauss- Seidel
Es un método iterativo que comienza con un conjunto de formulas y una solución inicial .
Las formulas del método consisten en el despeje de cada incógnita en cada ecuación, es decir:
- Se despeja x1 de la primera ecuación.
- Se despeja x2 de la segunda ecuación y así sucesivamente se Se despeja xn de la ultima ecuación.
Ejemplo. Sea el sistema:
2X1-7X2+4X3=9
X1+9X2+6X3=25
-3X1+8X2+5X3=6
Despejamos X1, X2,Y X3
- X1=(9+7X2-4X3)/2
- X2=(25-X1-6X3)/9
- X3=(6+3X1-8X2)/5
las formulas anteriores son las formulas iterativas, los valores iniciales pueden ser cualquier valor pero se acostumbra a tomar x1=0, x2=0, ..xn=0
Vamos iterando de 1 hasta un numero máximo de iteraciones: N y se calcula el error en cada iteración.
Cuando el error sea menor que la tolerancia deseada se termina el “programa”.
Es de hacer notar que el método de Gauss-Seidel converge a la solución de un sistema de ecuaciones lineales si se cumple la condición de que la matriz de coeficientes del sistema sea una matriz diagonalmente dominante, es decir, si se cumple la siguiente condición:
La condición de ser una matriz diagonalmente dominante simplemente significa que los elementos de la diagonal son mayores (en valor absoluto) que la suma de los valores absolutos de los demás elementos del mismo renglón. Nótese que en el ejemplo anterior, la matriz sí es diagonalmente dominante y por lo tanto, el método de Gauss-Seidel sí converge a la solución del sistema.
Sin embargo, la condición de la matriz diagonalmente dominante, solamente es una condición suficiente pero no necesaria, es decir, existen sistemas de ecuaciones que no cumplen con la condición y que sí convergen a la solución y también existen sistemas de ecuaciones que no cumplen con la condición y que no convergen a la solución.
PROGRAMA EN LENGUAJE PYTHON
a=np.array([[1,1,-1],[4,-1,5],[2,2,-3]])
b=np.array([7,4,0])
tol=0.01; N=10
#valores iniciales:
x=0; y=0; z=0
for i in range(1,N):
xnew=(b[0]-(a[0,1]*y+a[0,2]*z))/a[0,0]
ynew=(b[1]-(a[1,0]*x+a[1,2]*z))/a[1,1]
znew=(b[2]-(a[2,0]*x+a[2,1]*y))/a[2,2]
ex=abs(x-xnew); ey=abs(y-ynew); ez=abs(z-znew)
print(“Solución parcial:”)
print(“x:”,round(xnew,3),”\ny:”,round(ynew,3),”\nz:”,round(znew,3))
if ((ex<tol) and (ey <tol) and (ez< tol)):
print(“convergencia alcanzada en “,i,”iteraciones, resultado:
( x, y, z) =”,round(xnew,3),round(ynew,3),round(znew,3))
x=xnew, y=ynew, z=znew