Está en la página 1de 21

Tarea Puntuable del Tema 2

Solución de conjuntos de ecuaciones.


El firmante de este trabajo reconoce que todo él es original, de su única autoría,
escritura y redacción, y que allí donde han sido empleadas ideas o datos de otros
autores, su trabajo ha sido reconocido y ubicado, con suficiente detalle, como para que
el lector pueda consultar lo afirmado sobre él.
Rafael Padilla Muelas
rafael.padilla.radiofisica@gmail.com
Métodos Numéricos. Curso 2020-2021

a) Plantee el sistema de ecuaciones a resolver y reordénelo para que todos los elementos de la
diagonal sean no nulos. Escríbalo en forma matricial A~µ = ~b donde

µ1 
     
a11 a12 a13 a14  b1 
a21 a22 a23 a24  µ2 
~b = b2  .
 
A =   , ~
µ =   ,
µ3 
a31 a32 a33 a34  b3 
µ4
   
a41 a42 a43 a44 b4
Voy a mantener la letra A tanto para la matriz de coeficientes como para las atenuaciones pero mantén-
gase en mente no confundir ambos

µ1 + µ2 + + = − ln A1 (1)
+ µ2 + + µ4 = − ln A2 (2)
√ √
2µ1 + + + 2µ4 = − ln A3 (3)
√ √
+ 2µ2 + 2µ3 + = − ln A4 (4)

Expresado en forma matricial es, donde ya hemos intercambiado las filas (3) y (4),

0  µ1  − ln A1 


   
 1 1 0

 0 √1 √0 1  µ2  − ln A2 
    
  =  (5)
2 √0  µ4  − ln A4 
 0    
 √ 2
2 µ3 − ln A3
   
2 0 0
b) Sabiendo que L es una matriz triangular inferior y U una matriz triangular superior, halle la
factorización LU de Crout de la matriz A.
Buscamos una factorización de la forma A = LU donde en el método de Crout L es una matriz triangular
inferior y U es una triangular superior con 1’s en su diagonal, i.e.
  
 1 1 0 0  l11 ·
 
· ·  1 u12 u13 u14 
 0
√1 √0 1  l21 l22 ·

·   · 1 u23 u24 

  =  (6)
 √0 2 2 √0  l31 l32 l33 ·   · · 1 u34 
  
l41 l42 l43 l44 · · ·
   
2 0 0 2 1

1
donde · equivale a cero (para no sobrecargar la notación). A partir de (6) es sencillo ir obteniendo los valores
de los elementos desconocidos. Algunos son inmediatos (1 = l11 , 0 = l21 , ...) y otros requieren un poco más
de trabajo (u1,4 , u2,4 , u34 ,...). Los resultados son
 
 1 · · · 1 1 0 0 

 0 1 · ·  · 1 0 1 
  
√ √ 
  (7)
 0
 √ √ 2 2 ·
√   
 · · 1 −1 
2 − 2 0 2 2 · · · 1

| {z }| {z }
L U

Usando el método de reducción de Crout, obtenga la solución del sistema ~µ. Si A = LU, además, se
pide también calcular ~y = U~µ
El método de reducción de Crout consiste en resolver A~µ = ~b haciendo uso de la factorización de A, lo
que implica que LU~µ = L(U~µ) = L~y y por lo tanto
   
 1 · · ·  y1  − ln A1 

 0 1 · ·  y  − ln A 
  
 √ √   2  =  2  (8)
 0
 √ √ 2 2 ·  y3  − ln A4 
√     
2 − 2 0 2 2 y4 − ln A3

Debido a la forma triangular inferior de L vemos que y1 = − ln A1 , seguidamente que y2 = − ln A2 .


Luego con y2 podemos hallar y3 , i.e.

√ √ 1
2y2 + 2y3 = − ln A4 ⇒ y3 = ln A2 − √ ln A4 (9)
2

Por esta razón a este procedimiento se le llama en [1, p. 404] sustitución hacia delante. El resultado para y4
es
!
1 A1 1
y4 = ln − √ ln A3 (10)
2 A2 2 2
Así pues, tenemos ahora que resolver ahora ~y = U~µ, i.e.

1 1 0 0  µ1 


    
y1 
 2  =  · 1 0 1  µ2 
y    
y3   · · 1 −1 µ4  (11)
· · · 1 µ3
    
y4
|{z} | {z }
~y U

A diferencia de (8), en (11) la sustitución es hacia atrás, i.e. lo primero es despejar


!
1 A1 1
µ3 = y4 = ln − √ ln A3 (12)
2 A2 2 2

Seguidamente, usar este valor encontrado de µ3 para sacar µ4 , i.e.

2
1 1 1
µ4 = y3 + µ3 = ln(A1 A2 ) − √ ln A3 − √ ln A4 (13)
2 2 2 2
y acabaríamos con µ2 y finalmente µ1 .
A continuación se recompilan los resultados sustituyendo las atenuaciones An | n = 1, 2, 3, 4 del
enunciado:

!
1 A2 1
µ1 = ln − √ ln A3 ≈ 0,21
2 A1 2 2
1 1
µ2 = √ ln A3 − ln(A1 A2 ) ≈ 0,58
2 2 ! 2
1 A1 1
µ3 = ln − √ ln A3 ≈ 1,07
2 A2 2 2
1 1 1
µ4 = ln(A1 A2 ) − √ ln A3 − √ ln A4 ≈ 2,19 (14)
2 2 2 2
b) Sabiendo que L0 es una matriz triangular inferior y U 0 una matriz triangular superior, halle la
factorización L0 U 0 de Doolittle de la matriz A y con esa factorización resuelva el sistema de ecuaciones
para ~µ. Si A = L0 U 0 , además, se pide también calcular ~y = U 0~µ
En la factorización de Doolittle los 1’s se disponen en la diagonal de L0 , por lo que la descomposición
A = L0 U 0 toma la forma
  
 1 1 0 0   1 · · ·  u011 u012 u013 u014 
 
1  l21 1 · ·   · u022 u023 u024 
  0
 0 √1 √0

 =  0 0
   (15)
 0
 √ 2 2 √0  l31 l32 1 ·   · · u022 u034 
 0 0 0
1 · · · u044
 
2 0 0 2 l41 l42 l43
La forma de averiguar los valores de estos elementos es análoga al método de Crout. Algunos elementos
son más directos (1 = u011 , 1 = u012 , ...) otros como l41 0
, l42
0
, ... requieren más cuentas. Los resultados son
  
 1 · · ·  1 1 0 0 
 0 1 · ·   · 1 √0 1√ 
  
√    (16)
 0
 √ √ 2 1 ·   · ·
 
  2 − 2
√ 
2 − 2 0 1 · · · 2 2
Resolvemos ahora L0~y = ~b mediante substitución hacia delante. Los resultados para y1 e y2 salen iguales
que el método de Crout, los otros dos no. Muestro aquí la cuadrupla de resultados:

y1 = − ln A1 (17)
y2 = − ln A2 (18)

y3 = 2 ln A2 − ln A4 (19)

!
A1
y4 = 2 ln − ln A3 (20)
A2

3
Por último, con estos valores de ~y podemos obtener ~µ mediante subtitución hacia atrá en ~y = U 0~µ, i.e.

0  µ1 
    
y1  1 1 0
y2   · 1 0 1√  µ2 
 
  =  √ (21)
√  µ4 
  
y3   · · 2 − 2  
· 2 2 µ3
  
y4 · ·

!
1 A1 1
Por ejemplo, de la última fila es inmediato ver que 2 2µ3 = y4 ⇒ µ3 = 2 √2 = ln y4
− √ ln A3
2 A2 2 2
y sacaríamos el resto de valores de forma ascendente. Los resultados para µn | n = 1, 2, 3, 4 son los mismos
que obtuvimos en (14) con el método de Crout.
d) Resuelva el sistema lineal del apartado a) con los métodos iterativos tradicionales:

el método de Jacobi

Los métodos iterativos para resolver sistemas de ecuaciones del tipo Ax = b de orden n dependen del
reordenamiento de las ecuaciones de la siguiente manera [2]
n
bi X ai j
xi = − x j, i = 1, 2, ..., n (22)
aii j=1, j,i aii
en nuestro caso n = 4 y (22) se descompone en estas cuatro ecuaciones usando los valores de ai j y bi de (5):
0 0
b1 a12 a13*
 a14
*
x1 = − x2 −  x3 −  x4 = −x2 − ln A1 (23)
a11 a11 a11 a11
x2 = ... = −x4 − ln A2 (24)
ln A4
x3 = ... = −x2 − √ (25)
2
ln A3
x4 = ... = −x1 − √ (26)
2
donde recordemos que x3 = µ4 y x4 = µ3 ya que habíamos intercambiado las dos últimas ecuaciones de sitio
en (5). Entonces el método de Jacobi para la iteración k toma la forma

x1(k+1) = − x2(k)



 − ln A1
x2(k+1) = x4(k)



 − − ln A2
Método iterativo de Jacobi (27)




 x3(k+1) = − x2(k) − √12 ln A4

x4(k+1) = −x1(k) − √12 ln A3


Las primeras iteraciones resultan

 x1 = 0 = 0,79  x1 = −0,86


 (0)   (1)   (2) 
 x1
 x2 = 0 = 1,65  x2 = 0,37 
 (0)  (1)  (2)
 x2
  
 → → → ... (28)
 x3 = 0 = 2,77  x3 = 1,12 
 (0)  (1)   (2)
 x3

x4(0) = 0 x4(1) = 1,28 x4(2) = 0,49

4
En el Anexo se incluye el programa Jacobi.f90 que intenta resolver el problema por medio de este
método. En la Figura 5 se muestran los resultados del programa. En las líneas 1-4 el programa muestra la
matriz del sistema de ecuaciones. En las líneas 6 y 7 podemos ver que los resultados de la dos primeras
iteraciones coinciden con los calculados a mano anteriormente en (28).

Page 1 [* Console *]
1 ( 1.00000000 1.00000000 0.00000000 0.00000000 || 0.789999545
2 ( 0.00000000 1.00000000 0.00000000 1.00000000 || 1.64999950
3 ( 0.00000000 1.41421354 1.41421354 0.00000000 || 3.91738749
4 ( 1.41421354 0.00000000 0.00000000 1.41421354 || 1.81019640
5
6 Iteración = 1 Resultados: 0.789999545 1.64999950 2.77001119
7 Iteración = 2 Resultados: -0.859999955 0.369997382 1.12001169
8 Iteración = 3 Resultados: 0.420002162 1.15999687 2.40001392
9 Iteración = 4 Resultados: -0.369997323 -0.490002751 1.61001432
10 Iteración = 5 Resultados: 1.28000236 0.789999425 3.26001406
11 Iteración = 6 Resultados: 1.19209290E-07 -1.19209290E-07 1.98001182
12 Iteración = 7 Resultados: 0.789999664 1.64999962 2.77001143
13 Iteración = 8 Resultados: -0.860000074 0.369997382 1.12001169
14 Iteración = 9 Resultados: 0.420002162 1.15999699 2.40001392
15 Iteración = 10 Resultados: -0.369997442 -0.490002751 1.61001432
16 Iteración = 11 Resultados: 1.28000236 0.789999425 3.26001406
17 Iteración = 12 Resultados: 1.19209290E-07 -1.19209290E-07 1.98001182
18 Iteración = 13 Resultados: 0.789999664 1.64999962 2.77001143
19 Iteración = 14 Resultados: -0.860000074 0.369997382 1.12001169
20 Iteración = 15 Resultados: 0.420002162 1.15999699 2.40001392
21 Iteración = 16 Resultados: -0.369997442 -0.490002751 1.61001432
22 Iteración = 17 Resultados: 1.28000236 0.789999425 3.26001406
23 Iteración = 18 Resultados: 1.19209290E-07 -1.19209290E-07 1.98001182
24 Iteración = 19 Resultados: 0.789999664 1.64999962 2.77001143
25 Iteración = 20 Resultados: -0.860000074 0.369997382 1.12001169
26
27 Han acabado las iter. y no se alcanzó la precisión deseada.
28 Programa finalizado
29
Figura 1: Resultados Método iterativo de Jacobi.

Solo mirando la Fig. 5 uno podría percatarse que los resultados se repiten cada seis iteraciones. Esto se
hace más evidente si representamos x1 frente a k (Figura 2). Recordemos que k era el número de iteraciones.
No añado las gráficas para el resto de incógnitas pero lo mismo ocurre con x2 , x3 y x4 , oscilan pero no
convergen a ninguna solución.

La pregunta es ¿ por qué no hay convergencia? Para responder a esta pregunta primero observemos que
podemos escribir A = L + D + U donde L, D y U son las siguientes matrices (triangular inferior, diagonal y
triangular superior respectivamente):

5
x1 (Jacobi)
1,5
x1 (Jacobi)
1

0,5

0
0 5 10 15 20 25
-0,5

-1

Figura 2: Comportamiento oscilante de x1 .

     
 1 1 0 0   · · · · 1 · · ·
 
 · 1 0 0
 0 √1 √0 1   0 · · ·  · 1 √· · · · 0 1
     
=  √ + +
  
 0 2 2 √0   √0 2 · ·  · · 2 √·
· · · 0
 
 √   
· · · ·

2 0 0 2 2 0 0 · · · · 2
  
| {z } | {z } | {z } | {z }
A = L + D + U
(29)
Así pues, Ax = b es (L + D + U)x = b, de donde podemos separar el término Dx = −(L + U)x + b, para
despejar x = −D−1 (L + U)x + D−1 b. A partir de esta expresión se tiene, identificando x a la izquierda como
la nueva iteración [2]

x(k+1) = −D−1 (L + U) x(k) + D−1 b (30)


| {z }
T Jacobi

La matrix T J recibe el nombre de matriz de iteracción de Jacobi. Podemos calcularla directamente a


partir de D, L y U tal que así
  
1 · · ·  · 1 0 0
 
0 1 0 0
· 1 ·√ ·  0 √· 0 1
   0 0 0 1
T Jacobi = −   = −  (31)
 · · 1/ 2 ·√  √0 2 · 0 0 1 0 0

 
· · · 1/ 2 2 0 0 · 1 0 0 0
 
| {z }| {z }
D−1 L+U

o simplemente mirando la ecuación (27) donde además podemos comprobar que los términos independientes
son de la forma D−1 b como indicaba la ecuación (30)1 . Pues bien, los autovalores de esta matriz T Jacobi son:
√ √
1 3 1 3
λ1 = − + i ; λ2 = − − i ; λ3 = 1 ; λ4 = 0 (32)
2 2 2 2
Se define el radio espectral de la matriz de iteración ρ ≡ máx|λ|. El corolario 7.20 de [1, Pág 458] afirma
que T Jacobi nos conducirá a una solución si ρ < 1, sin embargo se puede comprobar tomando el valor absoluto
de (32) que en nuestro caso ρ = 1 y por lo tanto es explicable que nuestro programa iterativo de Jacobi no
converja.

1
Ecuación (15) del pdf de los ejercicios resueltos [2]

6
el método de Gauss-Seidel
La diferencia entre el método iterativo de Jacobi y el de Gauss-Seidel es que este último, utiliza en cada
iteración los valores actualizados (o más recientes, es decir, obtenidos en el propio paso) de las variables.
En el caso del problema concreto que nos ocupa, los valores de x1 y x2 que calculamos en una iteración se
usan inmediatamente en esa iteración para calcular x3 y x4 , i.e.

x1(k+1) = − x2(k)



 − ln A1
x2(k+1) = − x4(k)



 − ln A2
Método iterativo de Gauss Seidel (33)




 x3(k+1) = − x2(k+1) − √12 ln A4

x4(k+1) = −x1(k+1) − √12 ln A3


Esto implica que aunque nos dicen que usemos la semilla xn = 0 los valores de x3 y x4 = 0 nunca llegan
a usarse, i.e.

x1(1) = 0 − ln A1 = 0,79 (34)


x2(1) = 0 − ln A2 = 1,65 (35)

x3(1) = −1,65 − ln A4 / 2 = 1,12 (36)

x4(1) = −0,79 − ln A3 / 2 = 0,49 (37)
Estos cuatro resultados vemos que coinciden con los Resultados de la línea 6 de la Figura 3. El
código del programa se puede encontrar el Anexo.

Page 1 [* Console *]
1 ( 1.00000000 1.00000000 0.00000000 0.00000000 || 0.789999545 )
2 ( 0.00000000 1.00000000 0.00000000 1.00000000 || 1.64999950 )
3 ( 0.00000000 1.41421354 1.41421354 0.00000000 || 3.91738749 )
4 ( 1.41421354 0.00000000 0.00000000 1.41421354 || 1.81019640 )
5
6 Iteraciones= 1 Resultados: 0.789999545 1.64999950 1.12001169 0.490002632
7 Iteraciones= 2 Resultados: -0.859999955 1.15999687 1.61001432 2.14000225
8 Iteraciones= 3 Resultados: -0.369997323 -0.490002751 3.26001406 1.64999962
9 Iteraciones= 4 Resultados: 1.28000236 -1.19209290E-07 2.77001143 -1.68587391E-07
10 Iteraciones= 5 Resultados: 0.789999664 1.64999962 1.12001169 0.490002483
11 Iteraciones= 6 Resultados: -0.860000074 1.15999699 1.61001432 2.14000225
12 Iteraciones= 7 Resultados: -0.369997442 -0.490002751 3.26001406 1.64999962
13 Iteraciones= 8 Resultados: 1.28000236 -1.19209290E-07 2.77001143 -1.68587391E-07
14 Iteraciones= 9 Resultados: 0.789999664 1.64999962 1.12001169 0.490002483
15 Iteraciones= 10 Resultados: -0.860000074 1.15999699 1.61001432 2.14000225
16 Iteraciones= 11 Resultados: -0.369997442 -0.490002751 3.26001406 1.64999962
17 Iteraciones= 12 Resultados: 1.28000236 -1.19209290E-07 2.77001143 -1.68587391E-07
18 Iteraciones= 13 Resultados: 0.789999664 1.64999962 1.12001169 0.490002483
19 Iteraciones= 14 Resultados: -0.860000074 1.15999699 1.61001432 2.14000225
20 Iteraciones= 15 Resultados: -0.369997442 -0.490002751 3.26001406 1.64999962
21 Iteraciones= 16 Resultados: 1.28000236 -1.19209290E-07 2.77001143 -1.68587391E-07
22 Iteraciones= 17 Resultados: 0.789999664 1.64999962 1.12001169 0.490002483
23 Iteraciones= 18 Resultados: -0.860000074 1.15999699 1.61001432 2.14000225
24 Iteraciones= 19 Resultados: -0.369997442 -0.490002751 3.26001406 1.64999962
25 Iteraciones= 20 Resultados: 1.28000236 -1.19209290E-07 2.77001143 -1.68587391E-07
26 Programa finalizado
27
Figura 3: Resultados Gauss-Seidel.

7
Vemos que, de nuevo, nuestro programa no converge a la solución. La razón es la misma que con Jacobi,
ρ = 1. Veámoslo. En este caso la matriz iterativa es:

 −1 
 1 · · ·  · 1 0 0

 0 1√ √· ·  · · 0 1
   
T Gauss-Seidel = (D − L) U = 
−1
· · · 0 =

  
 0√ − 2 2
√   · 

· · · ·

− 2 0 0 2

 
1 0 0 0  · 1 0 0

0 1 0√ 0  · · 0 1
   
=     =
0 1 1/ 2 0√  · · · 0
1/ 2 · · · ·
 
1 0 0

 
0 1 0 0
0 0 0 1
=  (38)
0 0 0 1


0 1 0 0

y los autovalores de esta matriz son -1, 1 y 0 por lo que ρ = 1 y el método puede no converger, como así
ocurre.

el método de sobrerrelajación con factor de sobrerrelajación w = 1,25.

El método de sobrerrelajación es una extrapolación del método de Gauss-Seidel, que consiste en realizar
un promedio ponderado para cada incógnita xi , a partir de dos iteraciones consecutivas obtenidas por el
método de Gauss-Seidel

x̄i(k+1) = wxi(k+1) + (1 − w)xi(k) (39)


donde w es el factor de sobrerrelajación. La implementación del este método en fortran90 puede encon-
trarse también en el Anexo. Si Gauss-Seidel no converge, el de sobrerrelajación que es una variante del
mismo, tampoco lo hace, por lo que no se incluyen los resultados aqui.
Resuelva numéricamente el sistema de ecuaciones del apartado a) implementando el algoritmo de
Kaczmarz usando la semilla dada en el apartado d).
En el Anexo puede encontrase la implementación del Kaczmarz, donde en la líneas 68 y 69 he defini-
do la variables auxiliares “aux” y “dummy” que almacenan temporalmente los productos escalares indicados
en (40).
aux
z }| {
p~i · ~x bi
Li (~x) = ~x − p~i + p~i (40)
p~i · p~i p~i · p~i
| {z } | {z }
dummy dummy

A continuación se muestran los resultados.

8
Page 1 [* Console *]
1 ( 1.00000000 1.00000000 0.00000000 0.00000000 || 0.789999545 )
2 ( 0.00000000 1.00000000 0.00000000 1.00000000 || 1.64999950 )
3 ( 0.00000000 1.41421354 1.41421354 0.00000000 || 3.91738749 )
4 ( 1.41421354 0.00000000 0.00000000 1.41421354 || 1.81019640 )
5
6 Iteración= 1 Resultados: 0.523751020 1.89625549 0.873755872 0.756251156
7 Iteración= 2 Resultados: 0.163125217 1.44187772 1.32813346 1.11687696
8 Iteración= 3 Resultados: 8.46877694E-02 1.11281347 1.65719771 1.19531441
9 Iteración= 4 Resultados: 9.64067578E-02 0.897343695 1.87266755 1.18359542
10 Iteración= 5 Resultados: 0.127735078 0.764139891 2.00587130 1.15226722
11 Iteración= 6 Resultados: 0.156133652 0.684803724 2.08520794 1.12386858
12 Iteración= 7 Resultados: 0.176700085 0.638768137 2.13124323 1.10330200
13 Iteración= 8 Resultados: 0.190167010 0.612566888 2.15744448 1.08983517
14 Iteración= 9 Resultados: 0.198492259 0.597874463 2.17213678 1.08150995
15 Iteración= 10 Resultados: 0.203450859 0.589732349 2.18027878 1.07655144
16 Iteración= 11 Resultados: 0.206327945 0.585263431 2.18474793 1.07367420
17 Iteración= 12 Resultados: 0.207965612 0.582829833 2.18718147 1.07203674
18 Iteración= 13 Resultados: 0.208883852 0.581513643 2.18849778 1.07111835
19 Iteración= 14 Resultados: 0.209392786 0.580805779 2.18920565 1.07060957
20 Programa finalizado
21
Figura 4: Resultados Método iterativo de Kaczmarz.

En el Anexo se puede ver que la tolerancia impuesta era de 0.001 y vemos que se alcanza tras 14
iteraciones. Si nos fijamos en los resultados finales (línea 19 de la Figura 4) y los comparamos con las
soluciones analíticas de (14) vemos que ambos coinciden. El método converge.
Extraiga para el método de Kaczmarz su correspondiente matriz iterativa T Kaczmarz y analice su
radio espectral. Calcule los autovalores de dicha matriz.
Lo voy a hacer a mano, aunque sea más laborioso. Seguramente haya una forma más elegante de llegar
a la matriz iterativa de Kaczmarz pero no se me ocurre, así básicamente voy a hacer cálculos hasta llegar a
una expresión de la forma

~x(k+1) = T Kaczmarz ~x(k) + ~cKaczmarz . (41)


Empiezo por

p~1 · ~x b1
L1 (~x) = ~x − p~1 + p~1 (42)
p~1 · p~1 p~1 · p~1
y recordamos que p~1 es la primera fila de la matriz A de (5), i.e. p~1 = (1 1 0 0) por lo que (42) se traduce
en

9
     
 x1  1 1
 x2  (1 1 0 0) · (x1 x1 x3 x4 ) 1 b1 1
L1 (~x) =   −   +  
 x3  (1 1 0 0) · (1 1 0 0) 0 (1 1 0 0) · (1 1 0 0) 0
x4 0 0
     
 x1  1 1
 x  x + x 1 b 1
1 2   + 1  
=  2  −
 x3  2 0 2 0
x4 0 0
   
 x1  1
 x  b − x − x 1
1 1 2 
=  2  +  
0 (43)
 x3  2  
x4 0
   
 x1  1
 x  1
Ahora tenemos que hacer L2 L1 (~x) = L2 L1 (~x) = L2  2  + b1 −x21 −x2  . No desarrollo aquí las cuentas,

 x3  0
x4 0
pongo directamente el resultado:
     
 x1  1 0
 x2  b1 − x1 − x2 1 2b2 − x2 − b1 + x1 − 2x4 1
L2 L1 (~x) =   +   +
0
 
0 (44)
 x3  2   4  
x4 0 1
y a este resultado tendríamos que aplicarle L3 que resulta en:

     
 x1  1 0
 x  b − x − x 1 2b − x − b + x − 2x 1
1 1 2   + 2 2 1 1 4
L3 L2 L1 (~x) =  2  + 0
 
0
 x3  2   4  
x4 0 1
 
√ √ √ √ √ √  √0 
4b3 + 2x1 − 2x2 − 4 2x3 + 2 2x4 − 2b1 − 2 2b2  √2
 
+
16  2
 
0
(45)

10
y por último
     
 x1  1 0
 x  b − x − x 1 2b − x − b + x − 2x 1
1 1 2   + 2 2 1 1 4
L4 L3 L2 L1 (~x) =  2  + 0
 
0
 x3  2   4  
x4 0 1
 
√ √ √ √ √ √  √0 
4b3 + 2x1 − 2x2 − 4 2x3 + 2 2x4 − 2b1 − 2 2b2  √2
 
+
16  2
 
0
√ 
√ √ √ √ √  2
4b4 − 3 2x1 + 3 2x2 − 2 2x4 − 2b1 − 2 2b2  0 
 
+  0  =
16  √ 
2

2x1 − 2x2 − 4x4 + 6b1 − 4b2 + 4 2b√
 
 4 
1 −2x1 + 2x2 − 8x3 − 4x4 + 2b1 + 4b2 + 4 2b3 
 
= √ (46)
16  2x1 − 2x2 + 8x3 + 4x4 − 2b1 − 4b2 +√4 2b3 
 
−2x1 + 2x2 + 4x4 − 6b1 + 4b2 + 4 2b4
 

En este último cálculo hemos ido más allá ya que nos interesa ir buscando una expresión de la forma
~x = T Kaczmarz ~x(k) + ~cKaczmarz . Mirando (46) es fácil ver que esas matrices son:
(k+1)

 √  
  
 2 −2 0 −4  x1   6 −4 0 4 2 b1 
 √   
1 −2 2 −8 −4  x2  1  2 4 4 2
     0  b2 
~x(k+1)
= L4 L3 L2 L1 (~x) =    + √ (47)
16  2 −2 8 4   x3  16 −2 −4 4 2 b3 
    
   0
√    
 

−2 2 0 4 x4 
−6 4 0 4 2 b4
| {z } | {z }
T Kaczmarz ~cKaczmarz

Los autovalores de T Kaczmarz son 0 y 1/2 por lo que ρ = 0,5 < 1 lo que explica que el método converja.

Una forma de comprobar que hemos calculado bien tanto T Kaczmarz como cKaczmarz es hacer un par de
iteraciones y comparar los resultados con la Figura 4.

f) Para los métodos iterativos convergentes, compare el error absoluto cometido en cada itera-
ción con respecto a la solución exacta del problema. Analizando gráficamente el logaritmo del error
cometido, estime el orden de convergencia de los métodos y obtenga las conclusiones pertinentes.
Como el único método convergente ha sido el de Kaczmarz vamos a analizar este. A continuación se
muestra una captura de excell de las cuentas. En la gráfica se representa, como nos indica el enunciado, el
logaritmo del error cometido en cada iteración. Únicamente se muestra el error cometido para x1 y x2 (los
datos de x3 y x4 no aportan mucha más información adicional y he preferido no mostrarlos).

Obviando los primeros tres o cuatro datos, vemos que ambas gráficas muestran un patrón lineal. Si uno
ajusta estos datos a una recta (cómo hacer esto es el objetivo del próximo Capítulo de la asignatura) se verá
que siguen bastante bien una de pendiente -0.5, lo que implicaría que en el método de Kaczmarz

11
Iteración x1 x2 x3 x4 x1(exacta)-x1 x21(exacta)-x2 x3(exacta)-x3 x4(exacta)-x4
1 0,52375102 1,89625549 0,873755872 0,75625116 0,313749936 1,316257025 1,316256835 0,313749903
2 0,163125217 1,44187772 1,32813346 1,11687696 0,046875867 0,861879255 0,861879247 0,046875901
3 0,084687769 1,11281347 1,65719771 1,19531441 0,125313314 0,532815005 0,532814997 0,125313351
4 0,096406758 0,897343695 1,87266755 1,18359542 0,113594326 0,31734523 0,317345157 0,113594361
5 0,127735078 0,764139891 2,0058713 1,15226722 0,082266006 0,184141426 0,184141407 0,082266161
6 0,156133652 0,684803724 2,08520794 1,12386858 0,053867432 0,104805259 0,104804767 0,053867521
7 0,176700085 0,638768137 2,13124323 1,103302 0,033300999 0,058769672 0,058769477 0,033300941
8 0,19016701 0,612566888 2,15744448 1,08983517 0,019834074 0,032568423 0,032568227 0,019834111
9 0,198492259 0,597874463 2,17213678 1,08150995 0,011508825 0,017875998 0,017875927 0,011508891
10 0,203450859 0,589732349 2,18027878 1,07655144 0,006550225 0,009733884 0,009733927 0,006550381
11 0,206327945 0,585263431 2,18474793 1,0736742 0,003673139 0,005264966 0,005264777 0,003673141
12 0,207965612 0,582829833 2,18718147 1,07203674 0,002035472 0,002831368 0,002831237 0,002035681
13 0,208883852 0,581513643 2,18849778 1,07111835 0,001117232 0,001515178 0,001514927 0,001117291
14 0,209392786 0,580805779 2,18920565 1,07060957 0,000608298 0,000807314 0,000807057 0,000608511
Solucines
exactas: 0,210001084 0,579998465 2,190012707 1,070001059
1
LN F LN G
A1 Iteración 0,453845 -1,159158991 0,274792121
0 A2 0,19205 -3,060252309 -0,148640094
0 2 4 A36 8 10 12
0,163622 14 16 -2,076938165 -0,629580998
A4 0,019893 -2,175121724 -1,147765045
-1
-2,497797312 -1,692051199
-2,921229223 -2,255651331
-2 -3,402167897 -2,834129346
-3,920353935 -3,424412092
-4,464641188 -4,024296382
Ln (error)

-3
ln(error) [para x1] -5,028255951 -4,632142326
-5,606708799 -5,246680667
-6,197027779 -5,866995434
-4
-6,796901507 -6,49222262
ln(error) [para x2]
-7,404846446 -7,121798367
-5

-6

-7

-8

Figura 5: Análisis de los errores para Kaczmarz.


error ∝ 1/ k

siendo k la nueva iteración. Me ha resultado interesante la lectura de la publicación [3]; en ese artículo se
explica como es posible acelerar la convergencia del método de Kaczmarz si en vez de llevar a cabo las
operaciones lineales L4 L3 L2 L1 de forma ordenada, se implementa un algoritmo que las aplique de forma
aleatoria (por ejemplo, L4 L2 L1 L3 y en la siguiente iteración L1 L2 L3 L4 ) el método converge aún más rápido.

Referencias
[1] R. L. Burden, Numerical Analysis. Editorial Cengage Learning, 9th ed., 2011. ISBN 9786074816631.

[2] Equipo Docente Métodos Numéricos., “Problemas Resueltos del Tema 2,” 2020. UnedCampusVirtual,
Último acceso 11-11-2020.

12
[3] T. Strohmer and R. Vershynin, “A randomized kaczmarz algorithm with exponential convergence,” Jour-
nal of Fourier Analysis and Applications, vol. 15, p. 262–278, Apr 2008.

13
Page 1 [C:\Users\Usuario\Fortran\Jacobi\Ejercicio_Jacobi.f90]
1 parameter (n=4)
2 dimension a(n,n), b(n), x(n), xold(n)
3
4 do i=1,n !inicializo a cero para evitar escribir luego elementos nulos
5 do j=1,n
6 a(i,j)=0.0
7 end do
8 end do
9
10 i=1 !fila 1
11 a(i,1)=1.0
12 a(i,2)=1.0
13 b(i)=-log(0.453845)
14
15 i=2 !fila 2
16 a(i,2)=1.0
17 a(i,4)=1.0
18 b(i)=-log(0.192050)
19
20 i=3 !fila 3
21 a(i,2)=sqrt(2.0)
22 a(i,3)=sqrt(2.0)
23 b(i)=-log(0.019893)
24
25 i=4 !fila 4
26 a(i,1)=sqrt(2.0)
27 a(i,4)=sqrt(2.0)
28 b(i)=-log(0.163622)
29
30 tol=0.001 !tolerancia
31 kmax=20 !iteraciones
32
33 do i=1,n
34 xold(i)=0.0
35 end do
36
37 call subrutina_Jacobi(n,a,b,xold,tol,kmax,k,x)
38 write(*,*) ' Programa finalizado'
39 stop
40 end program
41
42 ! subrutina_Jacobi
43 !***********************************
44 ! Descripción: subrutina para calcular las soluciones de un sistema
por el método de Jacobi con un goto que se sale del bucle de las
iteraciones si se cumple una tol
45 ! Rafael Padilla Muelas
46 ! 08-11-2020
47 !***********************************
48 !***********************************
49 subroutine subrutina_Jacobi(n,a,b,xold,tol,kmax,k,x)
50 !***************************************************************
51 dimension a(n,n),b(n),x(n),xold(n)
52 !***************************************************************
53 ! para escribir en pantalla la matriz para asegurarme que lo hago bien
54 do i=1,n
55 write(*,*)'(',(a(i,j),j=1,n),' ||',b(i),' )'
56 end do
57 write(*,*)
58 !***************************************************************
59 ! MÉTODO DE JACOBI
60 !***************************************************************
Page 2 [C:\Users\Usuario\Fortran\Jacobi\Ejercicio_Jacobi.f90]
61 do k=1,kmax !comienzan las iteraciones
62 difmax=0.0
63 do i=1,n !recorrido por filas (las ecuaciones)
64 suma=0.0
65
66 do j=1,i-1 !recorrido por columnas
67 suma=suma+a(i,j)*xold(j)
68 end do
69 do j=j+1,n
70 suma=suma+a(i,j)*xold(j)
71 end do
72 x(i)=(b(i)-suma)/a(i,i)
73 dif=abs(x(i)-xold(i))
74 if(dif.gt.difmax) difmax=dif
75 end do
76 if(difmax.lt.tol) goto 100
77 write(*,*) 'Iteración =', k, 'Resultados:', (x(i),i=1,n)
78
79 !una vez finalizado el recorrido por todas las filas, actualizo
los valores de las "xold" que voy a usar en la siguiente iteración
80 do i=1,n
81 xold(i)=x(i)
82 end do
83 end do
84 write(*,*)
85 write(*,*) ' Han acabado las iter. y no se alcanzó la precisión
deseada.'
86 100 return
87 end subroutine
Page 1 [C:\Users\Usuario\Fortran\GS\MN_GS.f90]
1 parameter (n=4)
2 dimension a(n,n),b(n),x(n)
3
4 do i=1,n
5 do j=1,n
6 a(i,j)=0.0
7 end do
8 b(i)=0.0
9 end do
10
11 i=1 !fila 1
12 a(i,1)=1.0
13 a(i,2)=1.0
14 b(i)=-log(0.453845)
15
16 i=2 !fila 2
17 a(i,2)=1.0
18 a(i,4)=1.0
19 b(i)=-log(0.192050)
20
21 i=3 !fila 3
22 a(i,2)=sqrt(2.0)
23 a(i,3)=sqrt(2.0)
24 b(i)=-log(0.019893)
25
26 i=4 !fila 4
27 a(i,1)=sqrt(2.0)
28 a(i,4)=sqrt(2.0)
29 b(i)=-log(0.163622)
30
31 tol=0.001
32 !Con este método no hay que pasar las las xold
33 kmax=20
34 call subrutina_GaussSeidel(n,a,b,tol,kmax,k,x)
35 write(*,*) 'Programa finalizado'
36 stop
37 end program
38
39
40 subroutine subrutina_GaussSeidel(n,a,b,tol,kmax,k,x)
41 dimension a(n,n), b(n), x(n), xold(n)
42 do i=1,n
43 write(*,*) '(', (a(i,j),j=1,n),' ||', b(i), ')'
44 end do
45 write(*,*)
46
47 do i=1,n
48 x(i)=0.0
49 xold(i)=0.0
50 end do
51 do k=1,kmax
52 do i=1,n
53 suma=0.0
54 do j=1,i-1
55 suma=suma+a(i,j)*x(j)
56 end do
57 do j=i+1,n
58 suma=suma+a(i,j)*x(j)
59 end do
60 x(i)=(b(i)-suma)/a(i,i)
61 end do
62 do i=1,n !criterio de convergencia
Page 2 [C:\Users\Usuario\Fortran\GS\MN_GS.f90]
63 difmax=0.0
64 dif=abs(xold(i)-x(i))
65 difmax=max(difmax,dif)
66 xold(i)=x(i)
67 end do
68 write(*,*) 'Iteraciones=',k, 'Resultados:', (x(i), i=1,n)
69 if (difmax.le.tol) goto 100
70 end do
71 100 return
72 end subroutine
Page 1 [C:\Users\Usuario\Fortran\Sobrerrelajacion\EjercicioSobrerrelajacion.f90]
1 parameter (n=4)
2 dimension a(n,n),b(n),x(n),xnew(n)
3
4 do i=1,n
5 do j=1,n
6 a(i,j)=0.0
7 end do
8 b(i)=0.0
9 end do
10
11 i=1 !fila 1
12 a(i,1)=1.0
13 a(i,2)=1.0
14 b(i)=-log(0.453845)
15
16 i=2 !fila 2
17 a(i,2)=1.0
18 a(i,4)=1.0
19 b(i)=-log(0.192050)
20
21 i=3 !fila 3
22 a(i,2)=sqrt(2.0)
23 a(i,3)=sqrt(2.0)
24 b(i)=-log(0.019893)
25
26 i=4 !fila 4
27 a(i,1)=sqrt(2.0)
28 a(i,4)=sqrt(2.0)
29 b(i)=-log(0.163622)
30
31
32 tol=0.001
33
34 !Con este método no hay que pasarla las xold
35 kmax=4
36 call subrutina_sobrerrelajacion(n,a,b,tol,kmax,k,xnew)
37
38 write(*,*) 'Iteraciones=',k
39 write(*,*)
40 write(*,*) 'Resultados:', (xnew(i), i=1,n)
41 write(*,*)
42 write(*,*) 'Programa finalizado'
43 stop
44 end program
45
46
47 subroutine subrutina_sobrerrelajacion(n,a,b,tol,kmax,k,xnew)
48 dimension a(n,n), b(n), x(n), xold(n), xnew(n)
49 do i=1,n
50 write(*,*) '(', (a(i,j),j=1,n),' ||', b(i), ')'
51 end do
52 write(*,*)
53
54 do i=1,n
55 x(i)=0.0
56 xold(i)=0.0
57 xnew(i)=0.0
58 end do
59 do k=1,kmax
60 do i=1,n
61 suma=0.0
62 do j=1,i-1
Page 2 [C:\Users\Usuario\Fortran\Sobrerrelajacion\EjercicioSobrerrelajacion.f90]
63 suma=suma+a(i,j)*x(j)
64 end do
65 do j=i+1,n
66 suma=suma+a(i,j)*x(j)
67 end do
68 x(i)=(b(i)-suma)/a(i,i)
69 end do
70 do i=1,n !criterio de convergencia
71 difmax=0.0
72 dif=abs(xold(i)-x(i))
73 difmax=max(difmax,dif)
74 xnew(i)=1.25*x(i)-0.25*xold(i) !sobrerrelajación con w=1.25
75 end do
76 write(*,*) (xold(i), i=1,n), 'x:', (x(i), i=1,n), 'xnew:', (xnew(i),
i=1,n)
77 do i=1,n
78 xold(i)=x(i)
79 end do
80 if (difmax.le.tol) goto 100
81 end do
82
83 100 return
84 end subroutine
Page 1 [C:\Users\Usuario\Fortran\Kaczmarz\EjercicioKaczmarz.f90]
1 parameter (n=4)
2 dimension a(n,n), b(n), x(n), xold(n)
3
4 do i=1,n !inicializo a cero para evitar escribir luego elementos nulos
5 do j=1,n
6 a(i,j)=0.0
7 end do
8 end do
9
10 i=1 !fila 1
11 a(i,1)=1.0
12 a(i,2)=1.0
13 b(i)=-log(0.453845)
14
15 i=2 !fila 2
16 a(i,2)=1.0
17 a(i,4)=1.0
18 b(i)=-log(0.192050)
19
20 i=3 !fila 3
21 a(i,2)=sqrt(2.0)
22 a(i,3)=sqrt(2.0)
23 b(i)=-log(0.019893)
24
25 i=4 !fila 4
26 a(i,1)=sqrt(2.0)
27 a(i,4)=sqrt(2.0)
28 b(i)=-log(0.163622)
29
30 tol=0.0001 !tolerancia
31 kmax=20 !iteraciones
32
33 do i=1,n
34 xold(i)=0.0
35 end do
36
37 call subrutina_Kaczmarz(n,a,b,xold,tol,kmax,k,x)
38 write(*,*) ' Programa finalizado'
39 stop
40 end program
41
42 ! subrutina_Kaczmarz
43 !***********************************
44 ! Descripción: subrutina para calcular las soluciones de un sistema
por el método de Kaczmarz con un goto que se sale del bucle de las
iteraciones si se cumple una tol
45 ! Rafael Padilla Muelas
46 ! 19-11-2020
47 !***********************************
48 !***********************************
49 subroutine subrutina_Kaczmarz(n,a,b,xold,tol,kmax,k,x)
50 !***************************************************************
51 dimension a(n,n),b(n),x(n),xold(n)
52 !***************************************************************
53 ! para escribir en pantalla la matriz para asegurarme que lo hago bien
54 do i=1,n
55 write(*,*)'(',(a(i,j),j=1,n),' ||',b(i),' )'
56 end do
57 write(*,*)
58 !***************************************************************
59 ! MÉTODO DE KACZMARZ
60 !***************************************************************
Page 2 [C:\Users\Usuario\Fortran\Kaczmarz\EjercicioKaczmarz.f90]
61 do k=1,kmax !comienzan las iteraciones
62 do l=1,n
63 difmax=0.0
64 dummy=0.0
65 aux=0.0
66
67 do i=1,n
68 dummy=dummy + a(l,i)*a(l,i)
69 aux= aux + a(l,i)*xold(i)
70 end do
71 do i=1,n
72 x(i)=xold(i)- aux/dummy*a(l,i)+b(l)/dummy*a(l,i)
73 end do
74 do i=1,n
75 dif=abs(x(i)-xold(i))
76 if(dif.gt.difmax) difmax=dif
77 end do
78 if(difmax.lt.tol) goto 100
79 do i=1,n
80 xold(i)=x(i)
81 end do
82 end do
83 write(*,*) 'Iteración=', k, 'Resultados:', (x(i), i=1,n)
84 end do
85 write(*,*)
86 write(*,*) ' Han acabado las iter. y no se alcanzó la precisión
deseada.'
87 100 return
88 end subroutine

También podría gustarte