Universidad Nacional del Nordeste (UNNE) Maestr´ıa en Ciencias de la Ingenier´ıa
C´ alcu alculo lo Num´ Nu m´ eric er ico o
Marcelo I. Adotti Ing. Electromec´ Electromec´ anico anico 17 de octubre de 2017
Resumen
Carpeta de trabajos pr´ acticos del curso de C´ acticos alculo alculo Num´ erico, erico, dictado en la cohorte 2016 de la Maestr´ Maestr´ıa en Ciencias de la Ingenier´ Ingenier´ıa. Para la resoluci´ resoluci´ on on de los problemas problemas planteado planteadoss en las distinta distintass gu´ gu´ıas se utiliz´ o software opensource ”Octave GNU”. Para la edici´on del texto se ha utilizado LA T E X .
1
1. 1.1.
Eliminaci´ o n de Gauss gauss simple y main gauss
a) A partir de los pseudoc´odigos del libro de Chapra, se desarroll´o en etapas el c´odigo computacional que resuelve un sistema de ecuaciones algebraicas lineales utilizando la eliminaci´ on de Gauss, con pivoteo parcial. En primera instancia se hizo una prueba con un c´odigo simple al que denomino ”gauss simple b)” con el cual se hace un seguimiento de los procesos de eliminaci´on hacia adelante y sustituci´on hacia atr´as. Una vez lograda la resoluci´on del sistema de ecuaciones bien condicionado, se procede a realizar el c´odigo de Gauss con pivoteo parcial solicitado. Este ´ultimo est´a escrito modularmente, es decir que se han utilizado distintas sub-funciones, para luego llamarlas dentro de un cuerpo principal ”main gauss c)”. b) gauss simple ## Ej em pl o 9 . 5 d e l l i b r o d e C hapra , p ag . 2 58 c l ea r a l l clc f o rm a t l o n g d i s p l a y ( ” M at ri z d e c o e f i c i e n t e s d at o ” ) ; A=[3 − 0. 1 − 0 . 2 ; 0. 1 7 − 0 . 3 ; 0 . 3 − 0. 2 1 0 ] maxc oef=max(max(A) ) ; ma tr ix ct rl=A/maxcoef ; co nt ro l=det (A) ; d i s p l a y ( ” M a tr i z d e t e r m in o s i n d e p e n t e d a to ” ) ; B = [ 7 . 8 5 ; − 1 9 . 3 ; 7 1 . 4 ] ##p a qu e te d e e l i m i n a c i o n h a c i a a d e l a n t e #para gauss −s i m p l e ## n= l e n g t h (A ( 1 , : ) ) ; ##e l b uc le f o r k e s e l e nc ar ga do de p o s i c i on a r s e s ob re e l p i vo t ## d e l a m a t ri z A f o r k =1 :n−1 #e l b uc le f o r i g en er ar a l a f i l a de l a m at ri z t r ia n gu l ar , en f un ci o n #a l a e l e mi n a ci o n , a r ra n ca d es d e l a 2 da f i l a d eb i do a q ue l a p ri me r a # f i l a e s l a d e l p i v ot f o r i =k + 1: n # f f e s e l f a c to de p iv ot eo , en f un ci on a l e le me nt o A( k , k ) , e s t e i r a # mo d i fi c a nd o s e c ua nd o e l p r o c es o d e e l i m i n a c i o n f f=A( i , k) /A(k , k ) ; # e l b uc le f o r j , g en er ar a l a s col umnas de l a m at ri z t r ia n gu l ar , a l s e r l a # m at ri z t r i a g u n l a r e l e le me nt o A( 2 , 1 ) ya no e x i s t e en l a s eg un da f i l a p or # es o j a rr an ca d es de 2 f o r j =k + 1: n A( i , j )=A( i , j )− f f ∗A( k , j ) ; %a ca s e r e s t a n l o s a22 − f f ∗ a 21 , s u c e s i v a m e n t e 2
%c am bi an d e s ub i n d i c e s , s e g e n e r ar a n a 22 ’ A( i , k)=A( i , k)−A( i , k ) ; %a ce ra l o s c o e f i c i e n t e s t r i a n gu l a r i n f e r i o r en d B( i )=B( i) − f f ∗B( k ) ; %c a l c u l a l o s t i m o di f ic a do s en d en d ##p aq ue te d e s i s t i t u c i o n h a ci a a t r a s p a ra r e s o l v e r e l s i st e ma X=z e r o s ( n , 1 ) ; %c r e a un v e c t o r p ar a l a s i n c o g n i t a s X( n)=B( n ) /A( n , n ) ; %c a l c u l a l a i n c o g n i t a d e l a u l t i ma f i l a %d e l a m a tr i z t r i a n g u l a r f o r i =n − 1: − 1: 1 sum=B( i ) ; f o r j =i + 1: n sum=sum−A( i , j ) ∗X( j ) ; en d X( i )=sum/(A( i , i ) ) ; en d d i s p l a y ( ” E l em en to p i v o t ” ) ; A(1 ,1 ) display (””); d i s p l a y ( ” m a tr i z A t r i a n g u l a r i z a d a s u p er i o rm e nt e ” ) ; A display (””); d i s p l a y ( ” v e c t o r c ol um na d e t e r m i no s i n d e p e n d i e n t e s p r im os ” ) ; B display (””); display (” vector de incognitas ”); X pause pause c) main gauss ##main ga us s # ## tic c l ea r a l l clc f o rm a t l o n g ##Datos A=load ( ’ Hi lb er t ma tr ix 2 . txt ’ ) ; %l o a d ( ’ A. t x t ’ ) ; %D e f i n e l a m a t ri z d e c o e f i c i e n t e s d at o A A B=A ∗ [ 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ] ’ ; 3
%l o a d ( ’ B . t x t ’ ) ; %D e f i n e m a t r i z d e t e r m i n o s i n d p t e s .
B %D im en si on d e l s i s t em a d e e c u a c i o n e s l i n e a l e s n=len gt h (B) ; X=z e r o s ( n , 1 ) ; %c r e a un v e c t o r p ar a l a s i n c o g n i t a s d i s p l a y ( ’ U so d e m em or ia d e b i d o a l o s d a t o s e n M by te s ’ ) ; RAM A=8∗n . ˆ 2 / 1 0 2 4 RAM B=8∗n/1024 RAM X=8∗n/1024
displ ay ( ’ ’) ;
%T o l e r an c i a d e f i n i d a p ar a e l p i v o t eo e s c a l a d o tol=1e − 6; %V a r i a b l e b an d er a d e e r r o r er=0; ## Bu c le d e b us qu ed a d e l e l e me n to d e m ayor norma d e l a m a t ri z A f o r i = 1: n s ( i)=norm(A( i , 1 ) ) ; f o r j = 2: n i f norm(A( i , j )) > s ( i ) s ( i)=abs (A( i , j ) ) ; endif en d en d ##C a l l e l i m i n a t e [ A ,B] = g a u s s e l i m i n a t e ( A, B , s , n , t o l , e r ) ; i f e r != −1 [ A , B, X] = g a u s s s u b s t i t u t e ( A, B , n , X) en d toc c s v w r i t e ( ’ M a t r i z d e i n c o g n i t a s 4 . t x t ’ , X ) ; #G en er a un a r c h i v o d e s a l i d a #con l o s c o e f i c i e n t e s i n c o g ni t a b us ca do s d) gauss eliminate (subrutina de eliminaci´ on hacia adelante, llamada en la rutina principal ”main gauss”) f u n c t i o n [ A ,B] = g a u s s e l i m i n a t e (A , B, s , n , t o l , e r ) f o r k =1 :n−1 4
[ A , B , s ] = g a u s s p i v o t e ( A, B , s , n , k ) ; i f abs(A(k , k)/ s (k)) < t o l e r =−1; e r r o r ( ’ m a tr i z s i n g u l a r , f i n de c a l c u l o ’ ) ; break endif #e l b uc le f o r i g en er ar a l a f i l a de l a m at ri z t r ia n gu l ar , en f un ci o n #a l a e l e mi n a ci o n , a r ra n ca d es d e l a 2 da f i l a d eb i do a q ue l a p ri me r a # f i l a e s l a d e l p i v ot f o r i =k + 1: n # f f e s e l f a c to de p iv ot eo , en f un ci on a l e le me nt o A( k , k ) , e s t e i r a # mo d i fi c a nd o s e c ua nd o e l p r o c es o d e e l i m i n a c i o n f f=A( i , k) /A(k , k ) ; # e l b uc le f o r j , g en er ar a l a s col umnas de l a m at ri z t r ia n gu l ar , a l s e r l a # m at ri z t r i a g u n l a r e l e le me nt o A( 2 , 1 ) ya no e x i s t e en l a s eg un da f i l a p or # es o j a rr an ca d es de 2 f o r j =k + 1: n A( i , j )=A( i , j )− f f ∗A( k , j ) ; %a ca s e r e s t a n l o s a22 − f f ∗ a 21 , s u c e s i v a m e n t e %c am bi an d e s ub i n d i c e s , s e g e n e r ar a n a 22 ’ A( i , k)=A( i , k)−A( i , k ) ; %a ce ra l o s c o e f i c i e n t e s t r i a n gu l a r i n f e r i o r endfor B( i )=B( i) − f f ∗B( k ) ; %c a l c u l a l o s t i m o di f ic a do s endfor endfor i f abs(A(k , k)/ s (k)) < t o l e r =−1; endif endfunction e) gauss pivote (subrutina de cambio de elemento pivot y rengl´on llamada como subrutina en ”gauss eliminate” ) ##g a u s s p i v o t e f u n c t i o n [ A, B , s ] = g a u s s p i v o t e (A ,B , s , n , k ) p=k ; big=abs(A(k , k)/ s (k )) ; f o r i i =k + 1: n dummy=abs (A( i i , k )/ s ( i i ) ) ; i f dummy > b i g big=dummy; p= i i endif endfor i f p != k f o r j j =k : n 5
dummy=A( p , j j ) ; A(p , j j )=A(k , j j ) ; A( k , j j )=dummy ; %A %pause endfor dummy=B( p ) ; B(p)=B(k ); B( k)=dummy ; %B %pause dummy=s ( p ) ; s (p)=s (k ) ; s ( k)=dummy ; %s %pause endif endfunction f) gauss substitute Esta subrutina es la encargada de despejar las inc´ognitas buscadas en este caso el vector X, mediante X=B/A. ##g a u s s s u s t i t u t e f u n c t i o n [ A, B ,X]= g a u s s s u b s t i t u t e (A ,B , n , X) X( n)=B( n ) /A( n , n ) ; %c a l c u l a l a i n c o g n i t a d e l a u l ti m a %f i l a d e l a m a tr i z t r i a n g u l a r f o r i =n − 1: − 1: 1 sum=0; f o r j =i + 1: n sum=sum+A( i , j ) ∗X( j ) ; en d X( i )=(B( i) −sum)/A( i , i ) ; en d endfunction El c´ odigo principal inserta los datos de las matrices A y B, mediante archivos de textos generados por una copia de los .pdf de los ejercicios o mediante un archivo excel, guardando como .scv tambi´en ser´ıa posible en caso de contar con matrices de dimensiones considerables.
1.2.
Matriz de Hilbert y sistemas mal condicionados
a) matriz de coeficientes A, vector de t´ erminos independientes B y vector de inc´ ognitas X
6
Matriz A 3.0 0.1 0.3
− 0. 1 7.0 − 0.2
− 0. 2 − 0. 3 10.0
Vector B 7.85 − 19.3 71.4 Vector C - Inc´ ognitas 3 − 2. 5 7.000000000000002 Los resultados son iguales comparando con los aportados por el ejemplo 9.5 del libro de Chapra, inclusive con menor error al utilizar ”format long”. Se han agregado sobre al c´odigo principal, unas l´ıneas para determinar el tama˜ no en memoria RAM de los datos de ingreso, y el tiempo de duraci´on por la ejecuci´on del c´odigo. b) Para crear las matrices de Hilbert se ha utilizado el siguiete algoritmo, el cual genera un archivo de salida en .txt, que servir´a luego de entrada de datos para el main gauss. C´ odigo Matriz de Hilbert n =1 0; #d i m en s i on d e l a m a t r i z d e s ea d a f o r i =1: n f o r j =1: n H( i , j )=1/ ( i+j − 1 ) ; en d en d H c s v w r i t e ( ’ H i l b e r t m a t r i x 2 . t xt ’ , H ) ; #a r c h i v o de s a l i d a , # con d e s t i n o en e l path Matriz resultado H del C´odigo separadas con comas. 1 ,0.5 ,0.333333333333 3333 0.5 ,0.3333333333333333 ,0.25 0.3333333333333333 ,0.25 ,0.2 [A] = [ H ] [X ] = [1, 1, 1]T [B ] = [ A]{X } = [1,833333333333333; 1,083333333333333; 0,783333333333333]T 7
Para la H 3x3 Se define un error como una resta entre los elementos del vector unitario dado [ X ] = [1, 1, 1]T y del vector [ X ] obtenido mediante el c´odigo de gauss main. [X ]gaussmain 0.9999999999999984 1.00000000000001 0.99999999999999 error = { 1, 1, 1}T − [X ]gaussmain
1,55431223447522e − 15 error = −9,54791801177635e − 15 9,99200722162641e − 15
Los errores est´an truncandos en un orden elevado (”debido al format long”), lo cual se puede llegar a la conclusi´on que el c´odigo realiza de manera efectiva el escalamiento y la definici´on del pivote. c) Hilbert de 7x7 [X ]gaussmain 0.9999999999932647 1.000000000265063 0.9999999974720412 1.000000009752828 0.9999999822278254 1.000000015282108 0.9999999950024648 error = { 1, 1, 1, 1, 1, 1, 1}T − [X ]gaussmain
6,73527900119097e − 12 −2,65063082593997e − 10 2,52795884225776e − 09 ,75282765658392e − 09 error = −19,77721746208448 −1,52821080234844ee − − 08 08 4,99753516347567e − 09
8
d) Hilbert de 10x10 El sistema se define como mal condicionado, saliendo del c´alculo desde la subrutina ”gauss eliminate”, lo cual genero como condici´on mediante la sentecia error luego de pasar la variable bandera er = −1.
2.
Descomposici´ o n LU
2.1.
C´ odigo.m
El c´ odigo utilizado es el presentado en la gu´ıa, con la diferencia que a cada ”function”, se la dividi´ o en m´odulos .m, donde son archivos de subrutinas que se llaman desde un archivo principal ”luchapra main.m”. A continuaci´on se presenta el archivo principal. ##D e s co m po s i ci o n LU c u e r po p r i n c i p a l d e l c o d i g o tic f o rm a t l o n g a=load ( ’ Hi lbe rt mat rix 2 . txt ’ ) ; %l o a d ( ’ a . t x t ’ ) ; # m a t ri z c o e f i c i e n t e d e d a t o s b=a ∗ [ 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ] ’ ; %l o a d ( ’ b . t x t ’ ) ; # v e c t o r d e d a t o s t e r m i n o s i n d p t e s tol=1e − 6; [m, n]= si ze (a ); o=zer os (1 ,n ); s=zero s (1 ,n ) ; er=0; [ a , o]=decompose(a ,n , tol , o , s , er ); i f e r != − 1; ##s i n o s e h a d e t e c t a do una m a t ri z s i n g u l a r e n d ec om po se , s e ##r e a l i z a s u s t i t . : x= s u b s t i t u t e ( a , o , n , b ) ’ c s v w r i t e ( ’ M a t r i z d e i n c o g n i t a s 2 . t x t ’ , x ) ; #G en er a un a r c h i v o d e s a l i d a #con l o s c o e f i c i e n t e s i n c o g ni t a b us ca do s else err or ( ’ sing ular matri xdet ected ’ ) ; endif %endf unct ion %fun cio n 1 toc a) [a] 3.0 0.1 0.3
− 0. 1 7.0 − 0.2
− 0. 2 − 0. 3 10.0 9
{b} 7.85 − 19.3 71.4 Vector { X } de inc´ognitas 0.9999999999999973 1.000000000000017 0.9999999999999826 b) Matriz de Hilbert de 3x3 El proceso sigue la misma descripci´on algebraica que para el punto 1.2, la matriz [H ] = [A], y el vector { b} = A · {1, 1, 1}. Donde { x} = [1, 1, 1]T
xLU
0,999999999999997 = 1,000000000000017 0,999999999999983
c) Matriz de Hilbert de 7x7
xLU
0,999999999995465 1,000000000182967 0,999999998224407 = 10,,000000006939262 1,999999987227655 000000011071011 0,999999996355802
d) Matriz de Hilbert de 10x10 Nuevamente el sistema sale por mal condicionamiento de la matriz de Hilbert de 10x10 lo hace en la subrutina ”decompose” en la l´ınea 22.
2.2.
Matriz inversa
Al c´ odigo original de LU, se le agrega una funci´on ”inverse”, y se anula el proceso de substituci´on. c l ea r a l l clc tic a=load ( ’ Hil ber t matr ix1 0x1 0 . txt ’ ) ; %lo ad ( ’ a . txt ’ ) ; b=a ∗ [ 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ] ’ ; 10
%lo ad ( ’ b . txt ’ ) ; tol=1e − 6; [m, n]= si ze (a ); o=zer os (1 ,n ); s=zero s (1 ,n ); er=0; [ a , o]=decompose(a , n , tol , o , s , er ); %Obtengo la matriz [U] a i =i n v e r s e ( a , n , t o l , o , s , e r ) ; %I n v i e r t e l a m a t r iz toc
#No s e r e a l i z a l a s u s t i t u ci o n p orq ue s e b us ca l a m at ri z #i n v e r sa p ar a l u eg o h ac er l a o p er a ci o n b ar ra i n v e r t i d a %i f er != − 1; ##s i n o s e ha d e t ec t a do una m a tr i z s i n g u l a r e n #de co mpo se , s e r e a l i z a s u s t i t . : %x=sub st it ut e (a , o , n , b ) ; %e l s e %e r r o r ( ’ s i n g u l a r m a t r i x d e t e c t e d ’ ) ; %e n d i f %endf unct ion %fun cio n 1 a)
3,0 A = 0,1
−0,1 −0,2 7,0 −0,3 0,3 −0,2 10,0
Del Octave GNU, mediante la funcion ”inv()”.
0,33248872133984303 Ainv = −0,00518176588876793
0,00494407020579692 0,00679809653297077 0,14290264460216873 0,00418344402028970 −0,01007829695797065 0,00270973078586947 0,09987972598441668
Del c´odigo LU presentado AinvLU
0,33248872133984303 = −0,00518176588876793
0,00494407020579692 0,00679809653297077 0,14290264460216873 0,00418344402028970 −0,01007829695797065 0,00270973078586947 0,09987972598441668
Diferencia entre la matriz inversa ofrecida por el comando inv() del Octave y el del c´odigo
5,55111512312578e − 17 error = 0,00000000000000e + 00 0,00000000000000e + 00
0,00000000000000e + 00 0,00000000000000e + 00 2,77555756156289e − 17 0,00000000000000e + 00 −4,33680868994202e − 19 0,00000000000000e + 00 11
b) Matriz de Hilbert de 3x3
H =
1 0,5 0,3333333333333333 0,5 0,3333333333333333 0,25 0,3333333333333333 0,25 0,2
Del inv() Octave H inv
9,00000000000003 = −36,00000000000014 30,00000000000013
−36,00000000000014 30,00000000000013 192,00000000000074 −180,00000000000068 −180,00000000000068 180,00000000000063
Con el c´odigo lu chapra main inv HinvLU
9,000000000000005 = −35,99999999999999 29,99999999999997
30 −36 191,9999999999998 −179,9999999999997 −179,9999999999997 179,9999999999997
−2,13162820728030e − 14 error = 1,49213974509621e − 13
1,42108547152020e − 13 −9,37916411203332e − 13 −1,59872115546023e − 13 9,94759830064140e − 13
−1,31450406115619e − 13 9,94759830064140e − 13 −9,37916411203332e − 13
c) Matriz de Hilbert de 7x7 Por comodidad debido a las dimensiones de la matriz de Hilbert en este punto solo se referir´an a ellas con el nombre de los archivos disponibles en archivo .zip que se realiza con la entrega del TP. Matriz de H 7x7 Hilbert matrix7x7.txt Matriz inversa HinvLU
Matriz inversa ai2.txt El error m´aximo entre la matriz inversa calcula por el octave inv() y la calculada con el c´odigo ”luchapra main inv.m” Posee una diferencia m´axima de 0,0530172288417816, y una m´ınima de 1 ,39435059054449e− 08. d) La matriz de Hilbert de 10x10, sigue siendo la misma que sale del c´alculo en la subrutina ”decompose”, por lo tanto esta es una matriz singular y se detiene el c´alculo.
12