Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Cálculo Numérico
Marcelo I. Adotti
Ing. Electromecánico
17 de octubre de 2017
Resumen
Carpeta de trabajos prácticos del curso de Cálculo Numérico, dicta-
do en la cohorte 2016 de la Maestrı́a en Ciencias de la Ingenierı́a. Para
la resolución de los problemas planteados en las distintas guı́as se uti-
lizó software opensource ”Octave GNU”. Para la edición del texto se ha
utilizado LA TE X.
1
1. Eliminación de Gauss
1.1. gauss simple y main gauss
a) A partir de los pseudocódigos del libro de Chapra, se desarrolló en etapas
el código computacional que resuelve un sistema de ecuaciones algebraicas
lineales utilizando la eliminación de Gauss, con pivoteo parcial. En primera
instancia se hizo una prueba con un código simple al que denomino ”gauss
simple b)” con el cual se hace un seguimiento de los procesos de eliminación
hacia adelante y sustitución hacia atrás. Una vez lograda la resolución del
sistema de ecuaciones bien condicionado, se procede a realizar el código de
Gauss con pivoteo parcial solicitado. Este último está 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
## Ejemplo 9 . 5 d e l l i b r o de Chapra , pag . 258
clear all
clc
format l o n g
d i s p l a y ( ” Matriz de c o e f i c i e n t e s dato ” ) ;
A=[3 −0.1 − 0 . 2 ; 0 . 1 7 − 0 . 3 ; 0 . 3 −0.2 1 0 ]
maxcoef=max(max(A ) ) ;
m a t r i x c t r l=A/ maxcoef ;
c o n t r o l=d e t (A ) ;
d i s p l a y ( ” Matriz de t e r m i n o s i n d e p e n t e dato ” ) ;
B= [ 7 . 8 5 ; − 1 9 . 3 ; 7 1 . 4 ]
##paquete de 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 u c l e f o r k e s e l e n c a r g a d o de p o s i c i o n a r s e s o b r e e l p i v o t
## de l a m a t r i z A
f o r k=1:n−1
#e l b u c l e f o r i g e n e r a r a l a f i l a de l a m a t r i z t r i a n g u l a r , en f u n c i o n
#a l a e l e m i n a c i o n , a r r a n c a d e s d e l a 2da f i l a d e b i d o a que l a p r i m e r a
#f i l a e s l a d e l p i v o t
f o r i=k+1:n
# f f e s e l f a c t o de p i v o t e o , en f u n c i o n a l e l e m e n t o A( k , k ) , e s t e i r a
# m o d i f i c a n d o s e cuando e l p r o c e s o de e l i m i n a c i o n
f f =A( i , k ) /A( k , k ) ;
# e l b u c l e f o r j , g e n e r a r a l a s columnas de l a m a t r i z t r i a n g u l a r , a l s e r l a
# m a t r i z t r i a g u n l a r e l e l e m e n t o A( 2 , 1 ) ya no e x i s t e en l a segunda f i l a por
# e s o j a r r a n c a d es d e 2
f o r j=k+1:n
A( i , j )=A( i , j )− f f ∗A( k , j ) ; %aca s e r e s t a n l o s a22− f f ∗ a21 , s u c e s i v a m e n t e
2
%cambian de sub i n d i c e s , s e g e n e r a r a n a22 ’
A( i , k)=A( i , k)−A( i , k ) ; %a c e r a l o s c o e f i c i e n t e s t r i a n g u l a r i n f e r i o r
end
B( i )=B( i )− f f ∗B( k ) ; %c a l c u l a l o s t i m o d i f i c a d o s
end
end
##paquete de s i s t i t u c i o n h a c i a a t r a s para r e s o l v e r e l s i s t e m a
X=z e r o s ( n , 1 ) ; %c r e a un v e c t o r para 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 de l a u l t i m a f i l a
%de l a m a t r 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 ) ;
end
X( i )=sum / (A( i , i ) ) ;
end
d i s p l a y ( ” Elemento p i v o t ” ) ;
A( 1 , 1 )
display (””);
d i s p l a y (” matriz A t r i a n g u l a r i z a d a superiormente ” ) ;
A
display (””);
d i s p l a y ( ” v e c t o r columna de t e r m i n o s i n d e p e n d i e n t e s primos ” ) ;
B
display (””);
d i s p l a y ( ” v e c t o r de i n c o g n i t a s ” ) ;
X
pause
pause
c) main gauss
##main g a u s s
#
##
tic
clear all
clc
format l o n g
##Datos
A=l o a d ( ’ H i l b e r t m a t r i x 2 . txt ’ ) ;
%l o a d ( ’A. txt ’ ) ; %D e f i n e l a m a t r i z de c o e f i c i e n t e s dato A
A
B=A∗ [ 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ] ’ ;
3
%l o a d ( ’B . txt ’ ) ; %D e f i n e m a t r i z de t e r m i n o s i n d p t e s .
B
%Dimension d e l s i s t e m a de e c u a c i o n e s l i n e a l e s
n=l e n g t h (B ) ;
X=z e r o s ( n , 1 ) ; %c r e a un v e c t o r para l a s i n c o g n i t a s
display ( ’ ’);
%T o l e r a n c i a d e f i n i d a para e l p i v o t e o e s c a l a d o
t o l =1e −6;
%V a r i a b l e bandera de e r r o r
e r =0;
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 t r 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 u c l e f o r i g e n e r a r a l a f i l a de l a m a t r i z t r i a n g u l a r , en f u n c i o n
#a l a e l e m i n a c i o n , a r r a n c a d e s d e l a 2da f i l a d e b i d o a que l a p r i m e r a
#f i l a e s l a d e l p i v o t
f o r i=k+1:n
# f f e s e l f a c t o de p i v o t e o , en f u n c i o n a l e l e m e n t o A( k , k ) , e s t e i r a
# m o d i f i c a n d o s e cuando e l p r o c e s o de e l i m i n a c i o n
f f =A( i , k ) /A( k , k ) ;
# e l b u c l e f o r j , g e n e r a r a l a s columnas de l a m a t r i z t r i a n g u l a r , a l s e r l a
# m a t r i z t r i a g u n l a r e l e l e m e n t o A( 2 , 1 ) ya no e x i s t e en l a segunda f i l a por
# eso j arranca desde 2
f o r j=k+1:n
A( i , j )=A( i , j )− f f ∗A( k , j ) ; %aca s e r e s t a n l o s a22− f f ∗ a21 , s u c e s i v a m e n t e
%cambian de sub i n d i c e s , s e g e n e r a r a n a22 ’
A( i , k)=A( i , k)−A( i , k ) ; %a c e r a l o s c o e f i c i e n t e s t r i a n g u 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 d i f i c a d o s
endfor
endfor
i f abs (A( k , k ) / s ( k))< t o l
e r =−1;
endif
endfunction
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
6
Matriz A
3.0 −0.1 −0.2
0.1 7.0 −0.3
0.3 −0.2 10.0
Vector B
7.85
−19.3
71.4
Vector C - Incógnitas
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ódigo principal, unas lı́neas para determinar el
tamaño en memoria RAM de los datos de ingreso, y el tiempo de duración
por la ejecución del código.
b) Para crear las matrices de Hilbert se ha utilizado el siguiete algoritmo, el cual
genera un archivo de salida en .txt, que servirá luego de entrada de datos
para el main gauss.
[A] = [H]
[X] = [1, 1, 1]T
[B] = [A]{X} = [1,833333333333333; 1,083333333333333; 0,783333333333333]T
7
Para la H3x3 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ódigo de gauss main.
[X]gaussmain
0.9999999999999984
1.00000000000001
0.99999999999999
1,55431223447522e − 15
error = −9,54791801177635e − 15
9,99200722162641e − 15
c) Hilbert de 7x7
[X]gaussmain
0.9999999999932647
1.000000000265063
0.9999999974720412
1.000000009752828
0.9999999822278254
1.000000015282108
0.9999999950024648
8
d) Hilbert de 10x10
El sistema se define como mal condicionado, saliendo del cálculo desde la sub-
rutina ”gauss eliminate”, lo cual genero como condición mediante la sentecia
error luego de pasar la variable bandera er = −1.
2. Descomposición LU
2.1. Código.m
El código utilizado es el presentado en la guı́a, con la diferencia que a cada
”function”, se la dividió en módulos .m, donde son archivos de subrutinas que
se llaman desde un archivo principal ”luchapra main.m”. A continuación se
presenta el archivo principal.
##D e s c o m p o s i c i o n LU c u e r p o p r i n c i p a l d e l c o d i g o
tic
format l o n g
a=l o a d ( ’ H i l b e r t m a t r i x 2 . txt ’ ) ;
%l o a d ( ’ a . txt ’ ) ; # m a t r i z c o e f i c i e n t e de d a t o s
b=a ∗ [ 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ] ’ ;
%l o a d ( ’ b . txt ’ ) ; # v e c t o r de d a t o s t e r m i n o s i n d p t e s
t o l =1e −6;
[m, n]= s i z e ( a ) ;
o=z e r o s ( 1 , n ) ;
s=z e r o s ( 1 , n ) ;
e r =0;
[ a , o]= decompose ( a , n , t o l , o , s , e r ) ;
i f e r != −1;
##s i n o s e ha d e t e c t a d o una m a t r i z s i n g u l a r en decompose , 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 . txt ’ , x ) ; #Genera un a r c h i v o de 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 n i t a b u s c a d o s
else
error ( ’ singularmatrixdetected ’ ) ;
endif
%e n d f u n c t i o n %f u n c i o n 1
toc
a) [a]
3.0 −0.1 −0.2
0.1 7.0 −0.3
0.3 −0.2 10.0
9
{b}
7.85
−19.3
71.4
10
%l o a d ( ’ b . txt ’ ) ;
t o l =1e −6;
[m, n]= s i z e ( a ) ;
o=z e r o s ( 1 , n ) ;
s=z e r o s ( 1 , n ) ;
e r =0;
toc
a)
3,0 −0,1 −0,2
A = 0,1 7,0 −0,3
0,3 −0,2 10,0
Diferencia entre la matriz inversa ofrecida por el comando inv() del Octave
y el del código
5,55111512312578e − 17 0,00000000000000e + 00 0,00000000000000e + 00
error = 0,00000000000000e + 00 2,77555756156289e − 17 0,00000000000000e + 00
0,00000000000000e + 00 −4,33680868994202e − 19 0,00000000000000e + 00
11
b) Matriz de Hilbert de 3x3
1 0,5 0,3333333333333333
H= 0,5 0,3333333333333333 0,25
0,3333333333333333 0,25 0,2
−2,13162820728030e − 14 1,42108547152020e − 13 −1,31450406115619e − 13
error = 1,49213974509621e − 13 −9,37916411203332e − 13 9,94759830064140e − 13
−1,59872115546023e − 13 9,94759830064140e − 13 −9,37916411203332e − 13
d) La matriz de Hilbert de 10x10, sigue siendo la misma que sale del cálculo
en la subrutina ”decompose”, por lo tanto esta es una matriz singular y se
detiene el cálculo.
12