Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Prac Sel
Prac Sel
ndice I
1. Introduccin o 1 2. La orden \ de MATLAB para resolver sistemas de ecuaciones 2 lineales 3. Las factorizaciones LU y de Cholesky en MATLAB 3.1. La factorizacin LU . . . . . . . . . . . . . . . . . . . . . . . o 3.2. La factorizacin de Cholesky . . . . . . . . . . . . . . . . . . . o 4. Errores numricos al aplicar el algoritmo de Gauss e 5. La orden linsolve 3 4 9 13 13
1. Introduccin o
En toda la prctica tratamos de resolver el sistema a Ax = b (1)
donde suponemos que A es una matriz cuadrada con n las y n columnas invertible. MATLAB dispone de varios programas para resolver sistemas de ecuaciones lineales utilizando mtodos directos o mtodos iterativos basados en e e subespacios de Krylov. En esta prctica estudiaremos slo mtodos directos. a o e
La descripcin de la ayuda de MATLAB sigue puesto que \ tambin o e se utiliza para obtener la solucin de m o nimos cuadrados cuando A no es cuadrada. Como se puede ver \ utiliza el mejor algoritmo directo posible en funcin de las propiedades de la matriz A. Podemos comprobar esta armacin o o viendo que el tiempo necesario para resolver los diferentes sistemas cambia en funcin de cmo son (de todas formas conviene tener en cuenta que el o o tiempo de resolucin depende de muchos factores, algunos de ellos externos o a MATLAB, y por tanto es muy variable). Ejercicio 1 Ejecutar las siguientes rdenes y comparar los tiempos, oro denndolos de mayor a menor. Tener en cuenta que A es una matriz sin a ninguna propiedad especial, B es simtrica y denida positiva (excepto en el e improbable caso de que A no sea invertible) y T es triangular superior y H es una matriz de Hessenberg1 >> >> >> >> >> >> >> >> >> >> n = 1000; A = randn(n); T = triu(A); H = triu(A, -1); B = A*A; b = randn(n,1); tic, A\b; toc tic, T\b; toc tic, H\b; toc tic, B\b; toc
3.1. La factorizacin LU o
La orden para calcular la factorizacin LU de la matriz A es lu. Slo o o requiere un dato que es la propia matriz A, pero se le pueden pedir como resultado una, dos o tres matrices. Si se piden tres matrices ([L, U, P] = lu(A)), L es una matriz triangular inferior con unos en la diagonal principal, U es triangular superior y P es una matriz de permutacin tal que P A = LU . Para resolver (1) se puede o utilizar la orden U\(L\(P*b)). Si se le piden dos matrices ([L, U] = lu(A)), L es una matriz psicolgio camente 2 triangular inferior, en realidad es el producto de la inversa de la matriz de permutacin que se ha aplicado por la matriz triangular inferio or que proporciona la factorizacin, y U es triangular superior. Se puede o o resolver (1) con las rdenes U\(L\b). Por ultimo si slo se pide una matriz se obtiene una matriz con los o elementos no nulos de U y los no nulos y que no corresponden a un uno de la diagonal principal de L. Esta matriz no es en realidad muy util. Ejemplo 1 Vamos a utilizar la factorizacin LU para resolver un sistema o de ecuaciones lineales
A=[3 -1 2 4; 2 0 -1 3; 7 2 1 4; 0 -1 2 3]; b=[2 -1 3 9]; [L,U]=lu(A)
U = 7 0 0 0
2
2 -1.8571 0 0
1 1.5714 -1.7692 0
sol=U\(L\b)
ans = 1 1 1 1 se observa que L no es triangular inferior, pero es muy fcil reordenarla a intercambiando las para que lo sea. Tambin se ha comprobado que la e solucin proporcionada por el comando \ de MATLAB coincide exactamente o con la calculada utilizando la factorizacin LU . Aunque en el clculo de sta o a e se han realizado ms operaciones que con \ se precisa menos tiempo, esto se a debe a que \ realiza una serie de comprobaciones previas. Seguimos ahora calculando con la misma matriz, pero obteniendo la matriz de permutacin. o
[L,U,P]=lu(A)
L = 5
1 0.42857 0.28571 0
0 1 0.30769 0.53846
0 0 1 -0.65217
0 0 0 1
P = 0 1 0 0
P*A-L*U
0 0 1 0
1 0 0 0
0 0 0 1
ans = 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
sol=U\(L\(P*b))
ahora L es realmente triangular inferior. Ntese que para calcular la solucin o o hay que reordenar el vector b multiplicndolo por P . a Por ultimo
LU=lu(A)
LU = 7 -0.28571 -0.42857 0 2 -1.8571 -0.30769 -0.53846 1 1.5714 -1.7692 0.65217 4 2.2857 1.1538 2.5217
como puede verse estn los elementos de L y de U , pero es dif recona cil struir ambas matrices, por lo que esta forma de utilizar la orden lu no es recomendable. Ejercicio 2 Si A = LU es la factorizacin LU de A, entonces o
n
aij =
r=1
lir urj ,
pero teniendo en cuenta la estructura triangular de las matrices L y U , la expresin anterior se reduce a o
m n(i,j)
aij =
r=1
lir urj ,
que si se ordenan adecuadamente, y recordando que lkk = 1 son sencillas de resolver. Supongamos pues que A Rmn , donde m n y que L Rmn es trapezoidal inferior (lij = 0, si i < j) y que U Rnn . Si se conocen las primeras k 1 columnas de L y las primeras k 1 las de U , como lkk = 1, se tiene: akj = lkj u1j + + lk,k1 uk1,j + ukj , aik = li1 u1k + + lik ukk , j = k, k + 1, . . . , n.
i = k + 1, . . . , m.
donde los elementos recuadrados pueden calcularse fcilmente. Este proceso a se conoce con el nombre de mtodo de Doolittle y da lugar al algoritmo 1. e Escribir un programa MATLAB que implemente el algoritmo de Doolittle. 7
Algoritmo 1 Mtodo de Doolittle e Este algoritmo calcula la factorizacin LU , A = LU , A Rmn , m n o (suponiendo que existe) por el mtodo de Doolittle. e ENTRADA: La matriz A SALIDA: Las matrices L y U 1: para k = 1 : n hacer 2: para j = k : n hacer 3: ukj = akj k1 lki uij i=1 4: n para 5: para i = k + 1 : m hacer 6: lik = aik k1 lij ujk /ukk j=1 7: n para 8: n para Nota: Los sumatorios de las l neas 3 y 6 son en realidad productos escalares. En el caso de la l nea 3, es el producto escalar de parte de la la k de L (los primeros k 1 elementos) por parte de la columna j de U (los primeros k 1 elementos). Este producto escalar puede hacerse en MATLAB con la orden L(k, 1:k-1) * U(1:k-1, j), siendo sta la forma e ms eciente de calcularla. a Ejercicio 3 Comprobar el funcionamiento del programa con las siguientes matrices 3 1 2 3 1 2 4 2 1 7 2 1 , 7 8 , 3 a) 5 b) c) 2 1 4 5 0 1 0 4 7 1 0 3 1 2 Ejercicio 4 Qu ocurre al aplicar el programa a la matriz c) del ejercicio e anterior? Modicar el programa para que en caso de producirse esta situacin o se detecte y se muestre un mensaje de error. Ejercicio 5 Qu matrices tienen factorizacin LU ? (Se entiende sin e o realizar ninguna permutacin) o Ejercicio 6 Calcular mediante el mtodo de Doolittle la factorizacin LU e o
de la matriz
A=
4 8
1 5
1 16 44 23 6
aplicar el resultado para resolver el sistema Ax = b donde b = 14 . 37 Calcular la solucin utilizando la factorizacin LU con pivotamiento parcial o o (es decir usando la orden lu de MATLAB) y comparar los resultados sabiendo que la solucin exacta es el vector con todas las componentes iguales a 1. o
R = 2.2361 0 0 0
R*R
-0.44721 1.9494 0 0
ans = 5 -1 -1 4 9 2 2 1 -1
2 1
spy(ans) chol(ans)
2 -1
5 1
1 3
ans = 2.2361 0 0 0 -0.44721 1.9494 0 0 0.89443 1.2312 1.6384 0 0.44721 -0.41039 0.67462 1.4753
como puede verse la matriz A no es simtrica y MATLAB slo utiliza la parte e o triangular superior, por lo que obtiene un resultado incorrecto. Es por tanto necesario asegurarse de que la matriz sea simtrica. Si no e estamos seguros de que la matriz A es simtrica podemos comprobarlo ese cribiendo all(all(A==A)), si el resultado es 1 es simtrica, si es 0 no lo e es. Por otra parte, si la matriz A no es denida positiva chol devuelve un mensaje de error. En general no es fcil comprobar si una matriz simtrica a e es denida positiva o no (una matriz simtrica denida positiva tiene todos e los elementos de la diagonal principal positivos, por tanto si alguno de ellos es negativo o nulo no se trata de una matriz denida positiva, pero puede suceder que todos los elementos de la diagonal principal sean positivos y la matriz no sea denida positiva). Una de las formas de comprobar si una matriz simtrica es denida positiva es intentar calcular su factorizacin de e o Cholesky. Ejemplo 3 Dada la siguiente matriz (con elementos positivos en la diagonal principal) al intentar calcular su factorizacin de Cholesky se comprueba que o no es denida positiva. >> A=[2 -1 1;-1 2 2;1 2 2] A = 2 -1 1 -1 2 2 1 2 2 10
>> R=chol(A) ??? Error using ==> chol Matrix must be positive definite. Como se ha visto chol calcula el factor triangular superior. Si se quiere utilizar el resultado para resolver el sistema (1) se puede utilizar el factor con la orden R\(R\b) Ejemplo 4
A=[ 10 -1 2 1; -1 8 2 -1; 2 2 10 1; 1 -1 1 6]; b=[3 -1 2 4]; R=chol(A)
R = 3.1623 0 0 0
sol=R\(R\b)
-0.31623 2.8107 0 0
11
ans = 0 0 0 0
sol-sol2
Ejercicio 7 Decir cules de las siguientes matrices tienen factorizacin de a o Cholesky. En caso armativo obtenerla y en caso negativo indicar las razones por las que no la tiene. 4 1 2 3 1 2 5 1 2 5 1 , A = 1 1 0 , B= 1 C= 1 6 1 2 0 2 2 1 4 2 0 3 7 1 2 3 1 3 5 4 2 5 1 , 1 D = 1 6 0 , E= 1 F = 4 6 2 0 3 3 1 4 2 1 1 Ejercicio 8 Para las matrices anteriores que tienen factorizacin de Cholesky o utilizarla para resolver el sistema con b = 1 1 1 . 12
5. La orden linsolve
A partir de la versin 7 de MATLAB se incorpora la orden linsolve. o Esta orden es similar a \. De hecho si A es una matriz cuadrada y b es un vector sol = linsolve(A, b) resuelve el sistema Ax = b por el algoritmo de Gauss con pivotamiento parcial. La diferencia entre usar \ y linsolve es que esta ultima orden no hace las comprobaciones que mencionbamos en la seccin 2. De hecho si la matriz a o tiene alguna propiedad que se pueda aprovechar se debe indicar a la orden linsolve como una opcin. o Por ejemplo si la matriz es triangular inferior podemos denir opcion.LT = true y luego resolver sol = linsolve(A, b, opcion) Las opciones que se pueden utilizar de esta forma son las del cuadro 1. Todas ellas admiten los valores falso, false, que es el valor que tienen por defecto y verdadero, true. Aunque se pueden indicar varias opciones como verdaderas hay restricciones lgicas. Es muy importante tener en cuenta que o MATLAB no comprueba si la matriz tiene la propiedad en cuestin o no. o Esto es lo que permite que esta orden sea ms rpida. a a
13
Propiedad de la matriz Triangular inferior Triangular superior Hessenber superior Denida positiva Rectangular Indica si hay que resolver A x = b
14