Ejercicio: 1Eva_IIT2007_T2 Aplicar Gauss-Seidel
Probando solución con Jacobi, enviado como tarea
Desarrrollo Analítico
– Verificar que la matriz es diagonal dominante
No es necesario realizar el pivoteo por filas, ya la matriz tiene la diagonal dominante.
A = [[7.63, 0.30, 0.15, 0.50, 0.34, 0.84],
[0.38, 6.40, 0.70, 0.90, 0.29, 0.57],
[0.83, 0.19, 8.33, 0.82, 0.34, 0.37],
[0.50, 0.68, 0.86, 10.21, 0.53, 0.70],
[0.71, 0.30, 0.85, 0.82, 5.95, 0.55],
[0.43, 0.54, 0.59, 0.66, 0.31, 9.25]]
B = [ -9.44, 25.27, -48.01, 19.76, -23.63, 62.59]
– revisar el número de condición
cond(A) = || A||.||A-1||
El número de condición no es «muy alto», los valores de la diagonal son los mayores en toda la fila, por lo que el sistema converge.
>>> np.linalg.cond(A)
2.0451853966291011
– realizar iteraciones
Dado que no se establece en el enunciado el vector inicial, se usará el vector cero. La tolerancia requerida es 10-5
X0 = [ 0. 0. 0. 0. 0. 0.]
iteración 1
x0 = (-9.44 -0.30(0) -0.15(0)
-0.50(0) -0.34(0) -0.84(0))/7.63
= -9.44/7.63 = -1.23722149
x1 = (25.27 -0.38(0) -0.70(0)
-0.90(0) -0.29(0) -0.57(0))/6.40
= 25.27/6.40 = 3.9484375
x2 = (-48.01 -0.83(0) -0.19(0) -0.82(0)
-0.34(0) -0.37(0))/8.33
= -48.01/8.33 = -5.7635054
x3 = (19.76 -0.50(0) -0.68(0) -0.86(0)
-0.53(0) -0.70(0))/10.21
= 19.76/10.21 = 1.93535749
x4 = (-23.63 - 0.71(0) -0.30(0) -0.85(0)
-0.82(0) -0.55(0))/5.95
= -23.63/5.95 = -3.97142857
x5 = (62.59 - 0.43(0) -0.54(0) -0.59(0)
-0.66(0) -0.31(0))/9.25
= 62.59/9.25 = 6.76648649
X1 = [-1.23722149 3.9484375 -5.7635054 1.93535749 -3.97142857 6.76648649]
diferencia = X1 - X0 = X1
errado = max(|diferencia|) = 6.76648649
iteración 2
x0 = (-9.44 -0.30(3.9484375) -0.15(-5.7635054)
-0.50(1.93535749) -0.34(-3.97142857) -0.84(6.76648649))/7.63
= -9.44/7.63 = -1.23722149
x1 = (25.27 -0.38(-1.23722149) -0.70(-5.7635054)
-0.90(1.93535749) -0.29(-3.97142857) -0.57(6.76648649))/6.40
= 25.27/6.40 = 3.9484375
x2 = (-48.01 -0.83(-1.23722149) -0.19(3.9484375)
-0.82(1.93535749) -0.34(-3.97142857) -0.37(6.76648649))/8.33
= -48.01/8.33 = -5.7635054
x3 = (19.76 -0.50(-1.23722149) -0.68(3.9484375)
-0.86(-5.7635054) -0.53(-3.97142857) -0.70(6.76648649))/10.21
= 19.76/10.21 = 1.93535749
x4 = (-23.63 - 0.71(-1.23722149) -0.30(3.9484375)
-0.85(-5.7635054) -0.82(1.93535749) -0.55(6.76648649))/5.95
= -23.63/5.95 = -3.97142857
x5 = (62.59 - 0.43(-1.23722149) -0.54(3.9484375)
-0.59(-5.7635054) -0.66(1.93535749) -0.31(-3.97142857))/9.25
= 62.59/9.25 = 6.76648649
X1 = [-1.97395113 3.95743644 -6.05925771 1.96068604 -4.09171178 6.95612152]
diferencia = X1 - X0 = [-0.73672964, 0.00899894, -0.29575231, 0.02532855, -0.12028321, 0.18963504]
errado = max(|diferencia|) = 0.736729635697
iteración 3
x0 = (-9.44 -0.30(3.95743644) -0.15(-6.05925771)
-0.50(1.96068604) -0.34(-4.09171178) -0.84(6.95612152))/7.63
= -9.44/7.63 = -1.23722149
x1 = (25.27 -0.38(-1.97395113) -0.70(-6.05925771)
-0.90(1.96068604) -0.29(-4.09171178) -0.57(6.95612152))/6.40
= 25.27/6.40 = 3.9484375
x2 = (-48.01 -0.83(-1.97395113) -0.19(3.95743644)
-0.82(1.96068604) -0.34(-4.09171178) -0.37(6.95612152))/8.33
= -48.01/8.33 = -5.7635054
x3 = (19.76 -0.50(-1.97395113) -0.68(3.95743644)
-0.86(-6.05925771) -0.53(-4.09171178) -0.70(6.95612152))/10.21
= 19.76/10.21 = 1.93535749
x4 = (-23.63 - 0.71(-1.97395113) -0.30(3.95743644)
-0.85(-6.05925771) -0.82(1.96068604) -0.55(6.95612152))/5.95
= -23.63/5.95 = -3.97142857
x5 = (62.59 - 0.43(-1.97395113) -0.54(3.95743644)
-0.59(-6.059257710) -0.66(1.96068604) -0.31(-4.09171178))/9.25
= 62.59/9.25 = 6.76648649
X1 = [-1.98566781 4.0185268 -5.9920623 2.01431955 -3.98302285 7.01093224]
diferencia = X1 - X0 = [-0.01171668, 0.06109037, 0.0671954 , 0.05363351, 0.10868893, 0.05481072]
errado = max(|diferencia|) = 0.108688931048
Desarrollo numérico con Python
Se verifica el resultado obtenido realizando A.Xi y comparando con el vecto B
en la tabla se usa el signo de errado para la gráfica.
X0: [ 0. 0. 0. 0. 0. 0.]
Xi: [-1.23722149 3.9484375 -5.7635054 1.93535749 -3.97142857 6.76648649]
errado: 6.76648648649
Xi: [-1.97395113 3.95743644 -6.05925771 1.96068604 -4.09171178 6.95612152]
errado: -0.736729635697
Xi: [-1.98566781 4.0185268 -5.9920623 2.01431955 -3.98302285 7.01093224]
errado: 0.108688931048
Xi: [-2.00378293 3.99452422 -6.00443878 1.99576482 -4.0067623 6.9961552 ]
errado: -0.0240025781157
Xi: [-1.99869529 4.00195452 -5.99863447 2.00153846 -3.99769932 7.00130746]
errado: 0.00906298532211
Xi: [-2.00045097 3.99933614 -6.00047801 1.99948184 -4.00078219 6.99955127]
errado: -0.00308287453133
Xi: [-1.99984629 4.00022733 -5.99983706 2.00017793 -3.99973154 7.00015339]
errado: 0.0010506528253
Xi: [-2.00005265 3.9999222 -6.00005579 1.99993915 -4.00009178 6.9999475 ]
errado: -0.0003602430897
Xi: [-1.99998199 4.00002662 -5.99998091 2.00002082 -3.99996859 7.00001796]
errado: 0.000123195668206
Xi: [-2.00000616 3.99999089 -6.00000653 1.99999287 -4.00001075 6.99999385]
errado: -4.21623029112e-05
respuesta de A.X=B :
[-2.00000616 3.99999089 -6.00000653 1.99999287 -4.00001075 6.99999385]
iteraciones: 10
A.Xi: [ -9.44006312 25.26992175 -48.01007303 19.75990236 -23.63008584
62.58992368]
B: [ -9.44 25.27 -48.01 19.76 -23.63 62.59]
el gráfico de los errores vs iteraciones es:
Aplicando Gauss-Seidel
la tabla de aproximaciones sucesivas para el vector X es:
Tabla de iteraciones con AX=B:
[[ 0. 0. 0. 0. 0. 0. ]
[-1.23722149 4.02189753 -5.73196479 2.21089228 -3.51242077 6.91477852]
[-2.0322951 3.92844105 -6.03202587 1.98957766 -3.97864919 7.00774962]
[-1.9976784 4.00317297 -6.00049341 1.99807691 -4.00081785 6.99990294]
[-1.99994191 4.00036665 -5.99978715 2.00000392 -4.00004739 6.99996363]
[-2.00001274 3.99998231 -5.99999516 2.00000635 -3.99999579 7.00000072]
[-2.00000008 3.99999833 -6.00000078 1.99999991 -3.99999985 7.00000015]
[-1.99999994 4.00000007 -6.00000001 1.99999997 -4.00000002 7. ]]
>>>
que se obtiene aplicando la función de Gauss-Seidel, tomando como vector inicial el vector de ceros.
Tarea: X=TX+C
# Algoritmo Gauss-Seidel
# solución de matrices
# métodos iterativos
# Referencia: Chapra 11.2, p.310, pdf.334
# Rodriguez 5.2 p.162
import numpy as np
def gauss_seidel_tabla(A,B,tolera,X = [0], itermax=100):
tamano = np.shape(A)
n = tamano[0]
m = tamano[1]
if (len(X)==n):
X = np.zeros(n, dtype=float)
diferencia = np.ones(n, dtype=float)
errado = np.max(diferencia)
tabla = [np.copy(X)]
itera = 0
while (errado>tolera or itera>itermax):
for i in range(0,n,1):
xi = B[i]
for j in range(0,m,1):
if (i!=j):
xi = xi-A[i,j]*X[j]
xi = xi/A[i,i]
diferencia[i] = np.abs(xi-X[i])
X[i] = xi
errado = np.max(diferencia)
itera = itera + 1
tabla.append(np.copy(X))
tabla = np.array(tabla)
# No converge
if (itera>itermax):
X=0
return(tabla)
# Programa de prueba #######
# INGRESO
A = np.array([[7.63, 0.30, 0.15, 0.50, 0.34, 0.84],
[0.38, 6.40, 0.70, 0.90, 0.29, 0.57],
[0.83, 0.19, 8.33, 0.82, 0.34, 0.37],
[0.50, 0.68, 0.86, 10.21, 0.53, 0.70],
[0.71, 0.30, 0.85, 0.82, 5.95, 0.55],
[0.43, 0.54, 0.59, 0.66, 0.31, 9.25]])
B = np.array([[ -9.44],
[ 25.27],
[-48.01],
[ 19.76],
[-23.63],
[ 62.59]])
tolera = 0.00001
# PROCEDIMIENTO
n = len(A)
X = np.zeros(n, dtype=float)
respuesta = gauss_seidel_tabla(A,B, tolera, X)
# SALIDA
print('Tabla de iteraciones con AX=B: ')
print(respuesta)
En el caso de la norma infinito, para la matriz A, se puede usar el algoritmo desarrollado en clase.
Como valor para verificar su algoritmo, se obtuvo:
>>> np.linalg.norm(A, np.inf)
13.479999999999999
Tarea: incluir la norma infinito para T