You are on page 1of 15

Universidad de Buenos Aires Facultad De Ingenier´ ıa

A˜ no 2013 - 1er Cuatrimestre

´ lisis Nume ´rico (75.12) Ana

´ TRABAJO PRACTICO No 1 TEMA: Resoluci´ on de ecuaciones lineales por m´ etodos iterativos. FECHA: 8 de mayo de 2013 INTEGRANTES: Fern´ andez, Mat´ ıas Prato, Emiliano

88673 87025

75.12 - An´ alisis Num´ erico

´ Miguel Angel Cavaliere

´ INDICE

´ Indice
1. Introduccion 2. Desarrollo 2.1. Parte A 2.2. Parte B 2.3. Parte C 2.4. Parte D 2.5. Parte E 2.6. Parte F 2.7. Parte G 3. Conclusiones 4. Apendice A 2 2 2 2 3 4 4 6 6 8 9

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

1

1 Introduccion

1.

Introduccion

El siguiente trabajo pr´ actico tiene como objetivo experimentar con el uso de m´ etodos iterativos para la resoluci´ on de sistemas de ecuaciones lineales representados por matrices sim´ etricas definidas positivas y tridiagonales en bloques (similares por ejemplo a los que se obtienen discretizando ecuaciones diferenciales por el m´ etodo de diferencias finitas). Por otra parte, se deben verificar experimentalmente los resultados te´ oricos mediante estimaciones emp´ ıricas respecto de la velocidad de convergencia del proceso iterativo.

2.

Desarrollo

Se presentan tres matrices (denominadas A6 , A9 y A1 2) que son simetricas definidas positivas con estructura tridiagonal en bloque y definidas a partir de submatrices de 3x3 (denominadas B,C,D y E) que constituyen los bloques. Las tres matrices presentadas sugieren un patr´ on con el cual generar matrices An siendo n un m´ ultiplo de 3 que corresponde a la dimensi´ on de las mismas.

2.1.

Parte A

Escriba uno o varios programas que permitan aplicar el m´ etodo SOR a sistemas de ecuaciones lineales representados por An .xn = bn (donde el sub´ ındice identifica la dimensi´ on del sistema de acuerdo con lo indicado previamente). Es requisito que se tenga en cuenta la estrucutura de estas matrices y que se opere solamente con los elementos no nulos de las mismas, o sea, que dichas matrices An no deber´ an estar representas computacionalmente por un arreglo bidimensional sino que las f´ ormulas del m´ etodo deber´ an escribirse teniendo presente la estructura de estas matrices Para ver el detalle del c´ odigo fuente utlizado, ver el Apendice A.

2.2.

Parte B

Para n = 6 y n = 30 calcular los vectores bn tal que las componentes de la soluci´ on xn se correspondan con la repetici´ on de la secuencia de las u ´ltimas 3 cifras del n´ umero de padr´ on del autor. En este caso se utilizar´ a el padr´ on 88673, para realizar el trabajo pr´ actico. A continuacion se muestra parte del algoritmo empleado para calcular los valores de bn para n = 6 y n = 30. ... static int N = 6; p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { double X [ ] = i n i c i a l i z a r p u n t o B ( ) ; double b [ ] = p r o d u c t o m a t r i z (X) ;

2

2.3 Parte C

show ( b ) ; } ... b0 2.500 b1 2.500 b2 -0.500 b3 5.000 b4 5.000 b5 -1.000 b6 8.500 b7 9.500 b8 2.500

Cuadro 2.1: Valores de bn obtenidos para n = 6.

b0 2.500

b1 2.500

b2 -0.500

b3 5.000

b4 5.000

b5 -1.000

... b25 ... 5.000

b26 -1.000

b27 8.500

b28 9.500

b29 2.500

Cuadro 2.2: Valores de bn obtenidos para n = 30.

2.3.

Parte C

Para los dos sistemas de ecuaciones definidos en el punto anterior obtener soluciones con una precisi´ on relativa RTOL = 0.001 aplicando el m´ etodo de Gauss Seidel(SOR w = 1) y arrancando todo el proceso considerando nulas todas las componentes de x. A continuaci´ on se muestran los resultados obtenidos utilizando parte del siguiente algoritmo: ... static int N = 6; p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { double X [ ] = new double [N ] ; double b [ ] = p r o d u c t o m a t r i z ( i n i c i a l i z a r p u n t o A ( ) ) ; i n i c i a l i z a r (X, 0 ) ; show (SOR TP(X, b , 0 . 0 0 1 f , 1 ) ) ; } ... x0 5.995 x1 6.995 x2 2.997 x3 5.997 x4 x5 6.997 2.999

Cuadro 2.3: Valores de xn obtenidos para n = 6.

3

2.4 Parte D

x0 5.988

x1 6.985

x2 2.991

x3 ... 5.989 ...

x27 5.999

x28 6.999

x29 3.000

Cuadro 2.4: Valores de xn obtenidos para n = 30.

2.4.

Parte D

Repetir el punto anterior aplicando ahora el metodo SOR utlizando para cada sistema de ecuaciones distintos valores de w comprendidos entre 1 y 2 (se sugiere tomar 20 valores distintos) y graficar la cantidad de iteraciones requeridas para alcanzar la presici´ on pedida en funci´ on del par´ ametro de sobre relajaci´ on.

Figura 2.1: Numero de iteraciones en funcion de w, para n = 6 y n = 30

2.5.

Parte E

Estimar para cada sistema de ecuaciones el valor de w que minimiza el n´ umero de iteraiciones requeridas (woptimo ). Dado que es muy probable que la curva obtenida no presente un valor m´ ınimo sino que haya un intervalo de valores de w para los cuales el n´ umero de itereraciones sea m´ ınimo, se sugiere incrementar adecuadamente el valore de RTOL y barrer el intervalo donde se presupone que seu ubica el m´ ınimo con valores de w lo suficientemente cercanos para poder estimar dos decimales de woptimo . Observando el gr´ afico obtenido en el punto anterior para el caso de n = 6, podemos ver que se alcanza un m´ ınimo de iteraciones para w en un entorno de w = 1,20 aproximadamente. Si tomamos un w entre 1.15 y 1.25, con pasos de 0.01 y realizamos un gr´ afico, mejoraremos mas aun la estimaci´ on. A continuaci´ on se detalla una tabla con los valores obtenidos: Haciendo lo mismo para el caso de n = 30, obtendremos la siguiente tabla. Por lo cual concluimos que los woptimo para n igual a 6 y a 30 seran:

4

2.5 Parte E

w Iteracion 1.15 8 1.16 8 1.17 7 1.18 7 1.19 6 1.20 6 1.21 7 1.22 7 1.23 7 1.24 7 1.25 7 Cuadro 2.5: Valores de xn obtenidos para n = 30.

w Iteracion 1.30 13 1.31 13 1.32 12 1.33 12 1.34 12 1.34 12 1.35 12 1.36 12 1.37 12 1.38 12 1.39 12 Cuadro 2.6: Valores de xn obtenidos para n = 30.

n = 6 n = 30 1.195 1.35 Cuadro 2.7: Valores estimados de woptimo .

5

2.6 Parte F

2.6.

Parte F

Estimar el radio espectral del m´ etodo de Gauss Seidel sobre la base de la siguiente expresi´ on: (k) x( k ) − x ∞ ≈ ρ k −x GS x Efectuar la estimaci´ on tomando logaritmos en la expresi´ on anterior de forma tal de ajustar una recta cuya pendiente sea el logaritmo del radio espectral buscado. Tomando el logaritmo a ambos miembros de la expresi´ on anterior, tenemos: log ( x(k) − x → log ( x(k) − x
∞ (0) ) ≈ log (ρk −x GS x ∞

)→

) ≈ k.log (ρGS ) + log ( x(0) − x

)

De lo cual puede verse claramente que corresponde a una recta de pendiente m = log (ρGS ) y ordenada de origen b = log ( x(0) − x ∞ ) Nos queda entonces: y = mx + b → log ( x(k) − x

) ≈ k.log (ρGS ) + log ( x(0) − x

)

2.7.

Parte G

Calcular para cada sistema de ecuaciones el valor de (woptimo ) a partir de las estimaciones del radio espectral de la matriz de iteraci´ on de Gauss Seidel (ρGS ) obtenidos en el punto f) utilizando la siguiente expresi´ on te´ orica y comparar con los resultados obtenidos en el punto e) anteriro explicitando las conclusiones correspondientes. 2 woptimo = 1 + 1 − ρ(TGS ) Primeramente calcularemos el woptimo de la matriz de n = 6. Por lo cual mirando los valores obtenidos en el punto c) tenemos: x0 5.995 x1 6.995 x2 2.997 x3 5.997 x4 x5 6.997 2.999

Cuadro 2.8: Valores de xn obtenidos para n = 6. Por lo cual, log ( x(k) − x ∞ ) = log (max(x(k) −x)) = log (max(|5,995−6|, |6,995− 7|...|2,999 − 3|)) = log (0,005) = −2,30 Luego, la ordenada de origen, recordando que en el punto c) era x0 = 0, entonces tenemos que log ( x(0) − x ∞ ) = log (7) = 0,84, por ser 7 el n´ umero m´ as alto. Por lo cual, no queda: −2,30 = k.log (ρGS ) + 0,84 Si quiero obtener el woptimo para un k (n´ umero de iteraciones) igual a 6 (como se puede ver en el punto e), despejando, nos quedar´ a: log (ρGS ) = −0,52 → ρGS = 0,2999 Introduciendo este valor en la ecuaci´ on de woptimo y despejando nos quedar´ a: woptimo = 1,08 6

2.7 Parte G

Comparando este valor, con el obtenido experimentalmente, podemos concluir que hay una diferencia de 0.12 en la elecci´ on del w. Para el caso de n = 30 ser´ a una situaci´ on similar, por lo cual carece de sentido realizar dicho analisis.

7

3 Conclusiones

3.

Conclusiones

Se pudieron contrastar el modelo te´ orico y el modelo experimental, encontrando una aproximaci´ on que dista de la exactitud en solo unas pocas d´ ecimas. Por lo cual, se desprende que el m´ etodo de sobre relajaci´ on (SOR) para un woptimo determinado, permite obtener la mayor velocidad de convergencia, es decir, la menor cantidad de iteraciones. Las posibilidades de utilizar un modelo te´ orico en pos de aproximar el valor de woptimo a priori, como se vio en el punto g, demuestra que esta, es una herramienta my fuerte del analisis num´ erico.

8

4 Apendice A

4.

Apendice A

A continuaci´ on se muestra el desarrollo del algoritmo hecho en el lenguaje de programaci´ on JAVA. package com . f i u b a . a n a l i s i s n u m e r i c o ; p u b l i c c l a s s TP1 { p u b l i c s t a t i c v o i d i n i c i a l i z a r ( double X [ ] , double v a l o r ) { f o r ( i n t i = 0 ; i < X. l e n g t h ; i ++) X[ i ] = v a l o r ; } p u b l i c s t a t i c double e r r o r r e l ( double X 1 [ ] , double X [ ] ) { r e t u r n e r r o r a b s ( X 1 , X) / n o r m a i n f ( X 1 ) ; } p u b l i c s t a t i c double e r r o r a b s ( double X 1 [ ] , double X [ ] ) { return norma inf ( d i s t a n c i a (X 1 , X) ) ; } p u b l i c s t a t i c double [ ] d i s t a n c i a ( double X 1 [ ] , double X [ ] ) { double Y [ ] = new double [X. l e n g t h ] ; f o r ( i n t i = 0 ; i < X. l e n g t h ; i ++) Y[ i ] = X 1 [ i ] − X[ i ] ; r e t u r n Y; } p u b l i c s t a t i c double norma cuad ( double X [ ] ) { double norma = 0 ; f o r ( i n t i = 0 ; i < X. l e n g t h ; i ++) norma += Math . pow (X[ i ] , 2 ) ; r e t u r n Math . s q r t ( norma ) ; } p u b l i c s t a t i c double n o r m a i n f ( double X [ ] ) { double norma = 0 ; f o r ( i n t i = 0 ; i < X. l e n g t h ; i ++) i f ( Math . abs (X[ i ] ) > norma ) norma = Math . abs (X[ i ] ) ;

9

4 Apendice A

r e t u r n norma ; } p u b l i c s t a t i c double [ ] SOR TP( double X [ ] , double B [ ] , double RTOL, double W) { double Y [ ] = new double [X. l e n g t h ] ; double acum ; i n i c i a l i z a r (Y, 0 ) ; int n = 0; do { X = Y. c l o n e ( ) ; f o r ( i n t i = 0 ; i < X. l e n g t h ; i ++) { acum = 0 ; f o r ( i n t j = 0 ; j < X. l e n g t h ; j ++) { if (j > i) acum += A( i , j ) ∗ X[ j ] ; if (j < i) acum += A( i , j ) ∗ Y[ j ] ; } Y[ i ] = X[ i ] + W ∗ ( (B [ i ] − acum ) / A( i , i ) − X[ i ] ) } n++; } w h i l e ( e r r o r r e l (Y, X) > RTOL) ; System . out . p r i n t l n ( ” I t e r a c i o n e s : ” + n + ” W = ” + W) ; r e t u r n Y; } p r i v a t e s t a t i c double A( i n t i i , i n t j j ) { // i n c r e m e n t o l o s i n d i c e s i y j en pos de e v i t a r e l a r r a n q u e en c e // l o s // v e c t o r e s en j a v a int i = i i + 1; int j = j j + 1; i f ( i <= 3 && j <= 3 ) return B[ i i ] [ j j ] ; e l s e i f ( i > N − 3 && j > N − 3 ) r e t u r n D[ i i % 3 ] [ j j % 3 ] ;

10

4 Apendice A

e l s e i f ( Math . abs ( i − j ) <= 5 && Math . abs ( i − j ) >= 1 ) { i f ( i == j ) r e t u r n C[ i i % 3 ] [ j j % 3 ] ; i f ( Math . abs ( i − j ) >= 3 ) return E[ i i % 3 ] [ j j % 3 ] ; i f ( i − j < 0) { i f ( i % 3 == 0 && j % 3 == 1 ) return E[ i i % 3 ] [ j j % 3 ] ; e l s e i f ( i % 3 == 1 && j % 3 == 2 ) r e t u r n C[ i i % 3 ] [ j j % 3 ] ; e l s e i f ( i % 3 == 2 && j % 3 == 0 0) r e t u r n C[ i i % 3 ] [ j j % 3 ] ; } i f ( i − j == 2 && i % 3 == 1 && j % 3 == 2 ) return E[ i i % 3 ] [ j j % 3 ] ; i f ( i − j == 1 ) i f ( i % 3 == 1 && j % 3 == 0 ) return E[ i i % 3 ] [ j j % 3 ] ; else r e t u r n C[ i i % 3 ] [ j j % 3 ] ; i f ( i − j == 2 && i % 3 == 2 && j % 3 == 0 ) return E[ i i % 3 ] [ j j % 3 ] ; } e l s e i f ( Math . abs ( i − j ) < 3 ) { i f ( i − j < 0 && i − j > −3) r e t u r n C[ i % 3 ] [ j % 3 ] ; i f ( i − j == 2 && i % 3 == 0 && j % 3 == 1 ) r e t u r n C[ i i % 3 ] [ j j % 3 ] ; i f ( i − j == 1 && i % 3 == 2 && j % 3 == 1 ) r e t u r n C[ i i % 3 ] [ j j % 3 ] ; i f ( i − j == 1 && i % 3 == 0 && j % 3 == 2 ) r e t u r n C[ i i % 3 ] [ j j % 3 ] ; i f ( i == j \ l e f t \ | x − x \ r i g h t \ | \ i n f t y ) r e t u r n C[ i i % 3 ] [ j j % 3 ] ; } return 0; } p u b l i c s t a t i c v o i d show ( double X [ ] ) { f o r ( i n t i = 0 ; i < X. l e n g t h ; i ++) System . out . p r i n t ( S t r i n g . format (” %.3 f & ” , X[ i ] ) ) ; }

11

4 Apendice A

s t a t i c double B [ ] [ ] = { { 2 . 0 f , − 0.5 f , 0 . 0 f { − 0.5 f , 2 . 0 f , − 0.5 f } , { 0 . 0 f , − 0.5 f , 2 . 0 f } } ; s t a t i c double C [ ] [ ] = { { 4 . 0 f , − 1.0 f , 0 . 0 f { − 1.0 f , 4 . 0 f , − 1.0 f } , { 0 . 0 f , − 1.0 f , 4 . 0 f } } ; s t a t i c double D [ ] [ ] = { { 3 . 0 f , − 0.5 f , 0 . 0 f { − 0.5 f , 3 . 0 f , − 0.5 f } , { 0 . 0 f , − 0.5 f , 3 . 0 f } } ; s t a t i c double E [ ] [ ] = { { − 1.0 f , 0 . 0 f , 0 . 0 f { 0 . 0 f , − 1.0 f , 0 . 0 f } , { 0 . 0 f , 0 . 0 f , − 1.0 f } } ; s t a t i c int N = 30; p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { double W = 1 . 2 9 f ; f o r ( i n t i = 0 ; i < 1 0 ; i ++) { W += ( double ) 1 / 1 0 0 ; \ l e f t \ | x − x\ r i g h t \ | \ i n f t y double X [ ] = new double [N ] ;

},

},

},

},

double b [ ] = p r o d u c t o m a t r i z ( i n i c i a l i z a r p u n t o C ( ) ) ; i n i c i a l i z a r (X, 0 ) ; SOR TP(X, b , 0 . 0 0 1 f , W) ; } } // i n i c i a l i z a r (X, 0 ) ; // i n i c i a l i z a r (B, 1 ) ; // show (SOR TP(X, b , 0 . 0 1 f , 1 . 2 5 ) ) ; s t a t i c double [ ] i n i c i a l i z a r p u n t o A ( ) { N = 6; double X [ ] = new double [N ] ; X[ 0 ] = 6; X[ 1 ] = 7; X[ 2 ] = 3; X[ 3 ] = 6;

12

4 Apendice A

X[ 4 ] = 7; X[ 5 ] = 3; r e t u r n X; } s t a t i c double [ ] i n i c i a l i z a r p u n t o ( i n t N) { double X [ ] = new double [N ] ; for ( int i X[ X[ X[ } r e t u r n X; } s t a t i c double [ ] i n i c i a l i z a r p u n t o B ( ) { N = 9; double X [ ] = new double [N ] ; X[ 0 ] = 6; X[ 1 ] = 7; X[ 2 ] = 3; X[ 3 ] = 6; X[ 4 ] = 7; X[ 5 ] = 3; X[ 6 ] = 6; X[ 7 ] = 7; X[ 8 ] = 3; r e t u r n X; } s t a t i c double [ ] i n i c i a l i z a r p u n t o C ( ) { N = 30; double X [ ] = new double [N ] ; X [ 0 ] = 6 ; X [ 1 ] = 7 ;X [ 2 ] = 3 ; X [ 3 ] = 6 ; X [ 4 ] = 7 ;X [ 5 ] = 3 ; = 0 ; i < N; i += 3 ) { i ] = 6; i + 1] = 7; i + 2] = 3;

13

4 Apendice A

X [ 6 ] = 6 ;X [ 7 ] = 7 ;X [ 8 ] = 3 ; X [ 9 ] = 6 ;X[ 1 0 ] = 7 ;X[ 1 1 ] = 3 ; X[ 1 2 ] = 6 ;X[ 1 3 ] = 7 ;X[ 1 4 ] = 3 ; X[ 1 5 ] = 6 ;X[ 1 6 ] = 7 ;X[ 1 7 ] = 3 ; X[ 1 8 ] = 6 ;X[ 1 9 ] = 7 ;X[ 2 0 ] = 3 ; X[ 2 1 ] = 6 ;X[ 2 2 ] = 7 ;X[ 2 3 ] = 3 ; X[ 2 4 ] = 6 ;X[ 2 5 ] = 7 ;X[ 2 6 ] = 3 ; X[ 2 7 ] = 6 ;X[ 2 8 ] = 7 ;X[ 2 9 ] = 3 ; r e t u r n X; } p u b l i c s t a t i c double [ ] p r o d u c t o m a t r i z ( double X [ ] ) { double Y [ ] = new double [X. l e n g t h ] ; double acum ; f o r ( i n t i = 0 ; i < X. l e n g t h ; i ++) { acum = 0 . 0 f ; f o r ( i n t j = 0 ; j < X. l e n g t h ; j ++) { acum += A( i , j ) ∗ X[ j ] ; } Y[ i ] = acum ; } r e t u r n Y; } }

14