You are on page 1of 8

lgebra curso 2013-13: Prcticas de Matlab

Prctica n 2.
Introduccin general a las prcticas de lgebra 1
Ejercicio 1: Mtodo de eliminacin de Gauss bsico para sistemas compatibles y determinados 1
Ejercicio 2: Utilizar la factorizacin LU para resolver el sistema Ax=b 3
4
5
7
Ejercicio 3: Resolucin de un sistema de ecuaciones mediante la factorizacin de Choleski
Ejercicio 4: Preparando el pivotamiento por columnas
Ejercicio 5: Eliminacin de Gauss con pivotamiento por columnas

Introduccin general a las prcticas de lgebra
La finalidad de esta prctica es resolver sistemas de ecuaciones lineales mediante alguna de las va-
riantes del mtodo de eliminacin de Gauss. Aunque Matlab dispone de una amplia gama de fun-
ciones y operadores para resolver estos problemas, el objetivo de esta prctica es desarrollar pro-
gramas propios. El algoritmo de eliminacin de Gauss es probablemente el algoritmo ms utilizado
a lo largo y ancho del planeta, y es muy importante para todos los futuros ingenieros el haber tenido
alguna experiencia en su programacin (por ejemplo, en las prcticas de lgebra).
Cree en Mis Documentos una carpeta cuyo nombre contenga su nmero de dni e informacin sobre
la prctica, por ejemplo 03276algpr2. Haga que dicha carpeta sea la carpeta actual (current
directory) de Matlab. Compruebe en la Command Window que la carpeta anteriormente creada
es el directorio actual utilizando el comando >>pwd. Para que el trabajo de la prctica se guarde en
un fichero de texto ejecute el comando >>diary prac2.txt. Este fichero aparecer en la ventana de
Current directory, aunque no se podr abrir hasta que no se desactive con el comando >>diary
off. Si se desactiva para ver su contenido, se debe volver a activar con >>diary on.
Ejercicio 1: Mtodo de eliminacin de Gauss bsico para sistemas
compatibles y determinados
Es muy de agradecer que un algoritmo tan importante como el de eliminacin de Gauss, sea a la vez
tan sencillo y fcil de programar.
El mtodo de eliminacin de Gauss est basado en la propiedad de que si en un sistema de ecua-
ciones lineales una ecuacin se sustituye por una combinacin lineal de esa ecuacin y de las res-
tantes, la solucin del sistema no vara.
En este ejercicio se trata de crear una funcin llamada resolver() a la que se pasen una matriz cua-
drada A y un vector trmino independiente b y que devuelva la solucin del sistema Ax=b. Dicha
funcin debe ser creada en un fichero resolver.m y su primera lnea ser la siguiente:
f unct i on [ x] =r esol ver ( A, b)
Curso 2012-13: Prctica n 2 de lgebra Pgina 2
2
Figura 1. Hacer ceros en la columna k. Figura 2. Clculo de x(k) en la vuelta atrs.
Dentro de esta funcin habr que determinar el nmero de filas y columnas de la matriz A con la
instruccin [m,n]=size(A). Se comprobar que m es igual a n. Si la matriz no es cuadrada se im-
primir un mensaje de error y se devolver la matriz vaca []. El cdigo podra ser el siguiente:
[ m, n] =si ze( A) ;
i f m==n
%r esol uci n del si st ema de ecuaci ones
. . .
el se
%l a mat r i z no es cuadr ada
di sk( ' Er r or en r esol ver ( ) : l a mat r i z no es cuadr ada' )
x=[ ] ;
end
La Figura 1 muestra esquemticamente el proceso de hacer ceros en la columna k, donde k vara
desde 1 a n1. En la Figura 2 se muestra esquemticamente el proceso de vuelta atrs. En los puntos
suspensivos del cdigo anterior hay que introducir el cdigo correspondiente a la triangularizacin
y a la vuelta atrs, que podran ser los siguientes:
%t r i angul ar i zaci n
f or k=1: n- 1
f or i =k+1: n
m=A( i , k) / A( k, k) ;
f or j =k: n
A( i , j ) =A( i , j ) - m*A( k, j ) ;
end
b( i ) =b( i ) - m*b( k) ;
end
end
%vuel t a at r s
x=zer os( n, 1) ;
f or k=n: - 1: 1
s=0;
f or i =k+1: n
s=s+A( k, i ) *x( i ) ;
end
x( k) =( b( k) - s) / A( k, k) ;
end
Para comprobar este programa se puede ejecutar en la Command Window la siguiente instruccin:
>> n=4; A=r and( n) ; b=r and( n, 1) ; x=r esol ver ( A, b) ; er r or =nor m( b- A*x)
Antes de abandonar este ejercicio asigne a n en la sentencia anterior un valor mucho ms grande,
por ejemplo 400, y vuelva a ejecutar las sentencias de dicha lnea.
=
k
k
0 i
j
k
i
=
k
k
i
k
0
* * *
Curso 2012-13: Prctica n 2 de lgebra Pgina 3
3
Ejercicio 2: Utilizar la factorizacin LU para resolver el sistema Ax=b
En este ejercicio se trata de resolver el sistema de ecuaciones Ax=b realizando previamente la fac-
torizacin LU de la matriz A. Para ello se crearn las tres funciones siguientes:
1. Funcin [L,U]=factLU(A). Realizar la factorizacin de una matriz cuadrada A. Si la matriz
no es cuadrada, se imprimir un mensaje de error y se devolvern dos matrices vacas.
2. Funcin y=sustL(L,b). Calcula el vector y en el sistema de ecuaciones Ly=b, donde L es
una matriz triangular inferior.
3. Funcin x=sustU(U,y). Calcula el vector x en el sistema de ecuaciones Ux=y, donde U es
una matriz triangular superior.
Hay que recordar que la factorizacin LU puede basarse en el proceso de eliminacin de Gauss, de
forma que la matriz U no es otra cosa que la matriz A triangularizada, y la matriz L es una matriz
triangular inferior, con unos en la diagonal, cuyos elementos (i,j) son los factores m que han servido
para introducir un cero en la posicin (i,j), tal como se muestra a continuacin:
11 12 1
21 22 2
( 1)
1 2
1 0 0
1 0 0
, ,
1 0 0
n
n
n
n n nn
a a a
m a a
m m a





= = =




A LU L U




(1)
El cdigo de la funcin factLU() puede ser muy parecido al de la parte de la triangularizacin de
Gauss del Ejercicio 1. Lo nico que es necesario cambiar es eliminar la modificacin del vector b y
en su lugar almacenar el factor m en la posicin del cero introducido:
f or k=1: n- 1
f or i =k+1: n
%se cal cul a el f act or que hace cer o en l a posi ci n ( i , j )
m=A( i , k) / A( k, k) ;
f or j =k: n
A( i , j ) =A( i , j ) - m*A( k, j ) ;
end
%se al macena ese f act or en l a posi ci n del cer o cr eado
A(i,k)=m;
end
end
%Ext r aer de l a mat r i z A l as mat r i ces L y U
U=triu(A);
L=tril(A,-1)+eye(n);
La funcin y=sustL(L,b) resuelve el sistema de ecua-
ciones Ly=b. El esquema de los clculos a realizar se
muestra en la Figura 3. El cdigo de esta funcin puede
ser el siguiente:
%Resol uci n del si st ema Ly=b
y( 1) =b( 1) ;
f or k=2: n
s=0;
f or j =1: k- 1
s=s+A( k, j ) *y( j ) ;
end
y( k) =b( k) - s;
end
La funcin x=sustU(U,y) resuelve el sistema de ecuaciones Ux=y. El cdigo de esta funcin se
puede obtener directamente del Ejercicio 1.
Figura 3. Resolucin sistema Ly=b.
1
=
k
k k
0
*
1
*
Curso 2012-13: Prctica n 2 de lgebra Pgina 4
4
Para comprobar las funciones realizadas en este Ejercicio se pueden utilizar las siguientes lneas de
instrucciones de Matlab:
>> n=4; A=r and( n) ; b=r and( n, 1) ;
>> [ L, U] =f act LU( A) ; y=sust L( L, b) ; x=sust U( U, y) ; er r or =nor m( b- A*x)
Para que las funciones realizadas se puedan dar por buenas, el error del resultado debe ser muy pe-
queo, del orden de 10
14
10
15
.
Ejercicio 3: Resolucin de un sistema de ecuaciones mediante la facto-
rizacin de Choleski
El sistema de ecuaciones lineales Ax=b se puede resolver de una manera ms sencilla cuando la
matriz A es simtrica y definida-positiva. Cuando la matriz A cumple estas condiciones se puede
aplicar la factorizacin de Choleski, que tiene la forma:
T
= A LL (2)
Figura 4. Factorizacin de Choleski.
La factorizacin de Choleski se puede describir esquemticamente en la forma mostrada en la
Figura 4. El resultado puede ser L o L
T
. En este caso se supondr que es L, es decir, una matriz
triangular inferior. Se va a calcular la columna i de L suponiendo que ya se han calculado las co-
lumnas anteriores. Primero se calcula, a partir de a
ii
, el elemento de la diagonal l
ii
que es igual a la
fila i de L por la columna i de L
T
, es decir:
1
1 1 2
2 2 2 2
1 1 1 1

i i i i
T
ii ik ki ik ik ii ii ii ik
k k k k
a l l l l l l a l

= = = =

= = = + =



(3)
Para calcular los restantes elementos de la columna i se expresa
ji
a como producto de la fila j de L
por la columna i de L
T
. Las correspondientes expresiones matemticas son:
1 1
1 1 1 1
1
, 1,...,
i i i i
T
ji jk ki jk ik jk ik ji ii ji ji jk ik
k k k k ii
a l l l l l l l l l a l l j i n
l

= = = =

= = = + = = +



(4)
Para realizar este Ejercicio hay que preparar dos funciones:
1. Funcin L=factChol(A). Esta funcin determina la matriz triangular inferior L a partir de
A, que se supone simtrica y definida-positiva.
2. Funcin x=sust2(L,b). Esta funcin realizar las dos resoluciones con matriz triangular
(Ly=b y L
T
x=y), devolviendo la solucin x para un determinado trmino independiente b.
La funcin L=factChol(A) se puede programar a partir del cdigo siguiente, que el alumno deber
completar en el lugar donde aparecen los puntos suspensivos ():
=
0
0
Curso 2012-13: Prctica n 2 de lgebra Pgina 5
5
f unct i on L=f act Chol ( A)
%no se hacen compr obaci ones sobr e l a mat r i z A
n=si ze( A, 1) ;
L=zer os( n) ;
%cal cul o de l a pr i mer a col umna i ncl ui do en el caso gener al
f or i =1: n
%cal cul o del el ement o de l a di agonal
L( i , i ) =...;
%cal cul o del r est o de l os el ement os de l a col umna i
f or j =i +1: n
L( j , i ) =( ...) / L( i , i ) ;
end
end
Las dos resoluciones de sistemas de ecuaciones lineales con matrices triangulares se realizarn en la
funcin x=sust2(L,b) cuyo cdigo se ofrece completo a continuacin:
f unct i on x=sust 2( L, b)
n=l engt h( b) ; x=zer os( n, 1) ; y=x;
%Resol uci on del si st ema Ly=b
f or i =1: n
s=0;
f or j =1: i - 1
s=s+L( i , j ) *y( j ) ;
end
y( i ) =( b( i ) - s) / L( i , i ) ;
end
%Resol uci on del si st ema L' x=y
f or i =n: - 1: 1
s=0;
f or j =i +1: n
s=s+L( i , j ) *x( j ) ;
end
x( i ) =( y( i ) - s) / L( i , i ) ;
end
En el programa anterior se puede observar una caracterstica de Matlab: los bucles for internos,
cuando el lmite superior es menor que el lmite inferior, no se ejecutan ninguna vez.
Para comprobar este programa se pueden utilizar las siguientes instrucciones en la Command Win-
dow de Matlab:
>> n=4; A=r and( n) ; A=A' *A; b=r and( n, 1) ;
>> L=f act Chol ( A) , x=sust 2( L, b) , er r or =nor m( b- A*x)
La sentencia A=A'*A, siendo A una matriz cuadrada de valores aleatorios, garantiza que la matriz
A es simtrica y definida positiva. A lo largo de la asignatura de lgebra se ver por qu la ma-
triz construida de esta manera cumple estas caractersticas.
Ejercicio 4: Preparando el pivotamiento por columnas
Las matrices aleatorias hasta aqu utilizadas tienen prcticamente garantizado que ninguno de los
pivots (elementos por los que hay que dividir a lo largo del proceso), es distinto de cero. Todos los
programas vistos hasta aqu fallaran si se aplicasen a un sistema tan sencillo como el siguiente:
1
1 2
2
0 1 2
1, 2
1 0 1
x
x x
x

= = =



(5)
Este sistema de ecuaciones no tendra ningn problema si los programas realizados tuvieran la posi-
bilidad de cambiar el orden de las ecuaciones, es decir de resolver el sistema:
1
1 2
2
1 0 1
1, 2
0 1 2
x
x x
x

= = =



(6)
Curso 2012-13: Prctica n 2 de lgebra Pgina 6
6
En esto consiste el pivotamiento: en poder utilizar una ecuacin cualquiera para hacer ceros en
cualquiera de las dems ecuaciones.
Las matrices de permutacin P juegan un papel muy importante en la teora del pivotamiento. Una
matriz de permutacin es una matriz ortogonal que se puede obtener a partir de la matriz identidad I
permutando el orden de sus filas o columnas. Una forma de construir la matriz P es partir de un
vector p que contiene el orden en el que se desea aparezcan las filas de la matriz A. Si este orden se
aplica a las columnas de la matriz identidad I se obtiene la matriz de permutacin P. Ejectense las
siguientes instrucciones y obsrvese cmo se permutan las filas de una matriz A de tamao 55:
>> p=[ 1, 5, 3, 4, 2] , P=eye( n) ; P=P( : , p)
p =
1 5 3 4 2
P =
1 0 0 0 0
0 0 0 0 1
0 0 1 0 0
0 0 0 1 0
0 1 0 0 0
>> A=magi c( n) , Anew=P*A
A =
17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9
Anew =
17 24 1 8 15
11 18 25 2 9
4 6 13 20 22
10 12 19 21 3
23 5 7 14 16
En la prctica, no es necesario multiplicar por la matriz de permutacin P. Es ms sencillo y much-
simo ms eficiente el utilizar el vector p para acceder a las filas de A, como se ve a continuacin:
>> Anew=A( p, : )
Anew =
17 24 1 8 15
11 18 25 2 9
4 6 13 20 22
10 12 19 21 3
23 5 7 14 16
Esta forma de acceder a los elementos de la matriz es la base del mtodo de Gauss con pivotamiento
por columnas. A continuacin se ofrece una versin de la funcin factLU(A) que introduce el di-
reccionamiento indirecto por filas, sustituyendo i y k por p(i) y p(k). No es todava el pivotamiento,
pues p(i) es siempre i, pero va a facilitar el introducirlo a continuacin:
f unct i on [ L, U, p] =f act LU2( A)
[ m, n] =si ze( A) ;
i f m==n
%r esol uci n del si st ema de ecuaci ones
p=[1:n]; %el vect or p def i ne el or den nat ur al
f or k=1: n- 1
f or i =k+1: n
%se cal cul a el f act or que hace cer o en l a posi ci n ( i , j )
m=A( p(i), k) / A( p(k), k) ;
f or j =k: n
A( p(i), j ) =A( p(i), j ) - m*A( p(k), j ) ;
end
%se al macena ese f act or en l a posi ci n del cer o cr eado
A( p(i), k) =m;
end
end
Curso 2012-13: Prctica n 2 de lgebra Pgina 7
7
%Ext r aer de l a mat r i z A l as mat r i ces L y U
U=t r i u( A( p, : ) ) ;
L=t r i l ( A( p, : ) , - 1) +eye( n) ;
el se
%l a mat r i z no es cuadr ada
di sk( ' Er r or en f act LU2( ) : l a mat r i z no es cuadr ada' )
L=[ ] ; U=[ ] ; p=[ ] ;
end
Esta funcin funciona exactamente como la factLU() original. Se puede comprobar que ambas dan
el mismo resultado ejecutando las siguientes instrucciones en la Command Window:
>> A=r and( 4) , [ L1, U1] =f act LU( A) , [ L2, U2, p] =f act LU2( A)
Ejercicio 5: Eliminacin de Gauss con pivotamiento por columnas
A la funcin factLU2(A) del Ejercicio anterior le falta ya muy poco para ser capaz de realizar la
factorizacin LU con pivotamiento por columnas. A continuacin se muestra el cdigo de la fun-
cin factLU3(A) que incluye ya el pivotamiento. Lo nico que se ha hecho es aadir las lneas en
negrita, que se explicarn a continuacin:
f unct i on [ L, U, p] =f act LU3( A)
[ m, n] =si ze( A) ;
i f m==n
%r esol uci n del si st ema de ecuaci ones
p=[ 1: n] ; %el vect or p def i ne el or den nat ur al
f or k=1: n- 1
% se busca el mayor elemento en la columna k, pero solo
% en las filas donde no han aparecido pivots
q=[p(k:n)];
[piv, jpiv]=max(abs(A(q,k))); ipiv=q(jpiv);
% se permutan los elementos k e jpiv modificado del vector p
temp=p(k); p(k)=p(jpiv+k-1); p(jpiv+k-1)=temp;
f or i =k+1: n
%se cal cul a el f act or que hace cer o en l a posi ci n ( i , j )
m=A( p( i ) , k) / A( p( k) , k) ;
f or j =k: n
A( p( i ) , j ) =A( p( i ) , j ) - m*A( p( k) , j ) ;
end
%se al macena ese f act or en l a posi ci n del cer o cr eado
A( p( i ) , k) =m;
end
end
%Ext r aer de l a mat r i z A l as mat r i ces L y U
U=t r i u( A( p, : ) ) ;
L=t r i l ( A( p, : ) , - 1) +eye( n) ;
el se
%l a mat r i z no es cuadr ada
di sk( ' Er r or en f act LU3( ) : l a mat r i z no es cuadr ada' )
L=[ ] ; U=[ ] ; p=[ ] ;
end
En realidad lo nico que hace falta para introducir el pivotamiento es ir modificando el vector p de
modo que las filas de los pivots se van almacenando sucesivamente a partir de las primeras posicio-
nes de dicho vector.
1. El vector q=[p(k:n)]; contiene los ndices de las filas en las cules todava no han aparecido
pivots.
2. Con la sentencia [piv, jpiv]=max(abs(A(q,k))); se determina el mximo elemento en valor
absoluto de la columna k de la matriz A, en las filas determinadas por el vector q. La varia-
ble jpiv indica la posicin de este mximo de acuerdo con los ndices del vector q.
3. La instruccin ipiv=q(jpiv); transforma la posicin del mximo segn los elementos del
vector q en la posicin de dicho mximo en la columna k de A segn los ndices de p.
Curso 2012-13: Prctica n 2 de lgebra Pgina 8
8
4. Una vez determinada la posicin del pvot n k, la sentencia temp=p(k); p(k)=p(jpiv+k-1);
p(jpiv+k-1)=temp; permuta el elemento k y el elemento jpiv+k-1, es decir, lleva la
posicin del pvot n k a la fila k del vector p, intercambindolo con el valor que estaba
almacenado en esa posicin.
La funcin [L,U,p]=factLU3(A) devuelve los factores L y U de tal forma que se cumple:
( ) ,: = = PA LU A p LU (7)
es decir, que si factoriza la matriz que resulta de reordenar las filas de A de acuerdo con el vector p,
se obtienen las matrices L y U, que son respectivamente triangular inferior y superior.
Si se desea resolver el sistema de ecuaciones Ax=b y se dispone de la factorizacin de la matriz A
dada por la funcin factLU3(A), se pueden ejecutar las siguientes sentencias:
>> n=4, A=r and( n) , b=r and( n, 1)
>> [ L, U, p] =f act LU3( A) , y=sust L( L, b(p)) , x=sust U( U, y) , er r or =nor m( b- A*x)
Obsrvese que se pueden utilizar las funciones sustL() y sustU() realizadas anteriormente, y que lo
nico que hay que hacer es aplicar al vector b la misma permutacin de filas que se ha aplicado en
la matriz A.

You might also like