Descomposición LU de matrices José L. Vieitez IMERL, Facultad de Ingenierı́a, Universidad de la República 23 de agosto de 2006 Abstract Descomposición LU de una matriz A = (aij ), i, j = 1, . . . , n. 1 Hechos básicos Para escalerizar la matriz A = ((ai,j )), n × n, por el método de Gauss se usan 3 operaciones elementales: 1. Intercambio de las filas i y j, Ai con Aj : equivale a multiplicar a la izquierda la matriz A por la matriz n × n, Pi,j , obtenida de la identidad In intercambiando las filas i y j. 2. Multiplicación de la fila Ai por el número k 6= 0: equivale a multiplicar a la izquierda la matriz A por la matriz n × n, In + (k − 1)Ei,i , donde Ei,j denota la matriz que tiene todas las entradas nulas menos la (i, j) que vale 1. 3. Suma a la fila Aj de la fila Ai , i 6= j, multiplicada por el número λ: equivale a multiplicar a la izquierda la matriz A por la matriz n×n, In +λEj,i . Observación 1.0.1. Si se hace la multiplicación a derecha por la matriz correspondiente se intercambian las columnas, se multiplica una columna por un número o se suma a una columna un múltiplo de otra. En el proceso de escalerización puede no ser preciso cambiar filas de lugar, pero si fuera necesario hacerlo, una observación importante es que se puede suponer que el intercambio se ha realizado todo al comienzo de la escalerización. Esto es ası́ porque en el Método de Escalerización de Gauss el intercambio de filas se hace en 1 el momento de elegir un pivot. Si denotamos por A(h) a la matriz obtenida tras h pasos de escalerización, y esa matriz es de la forma: b1,1 b1,2 ··· ··· b1,n 0 b2,2 ··· ··· b2,n 0 0 b3,3 · · · · · · b3,n ··· ··· ··· ··· ··· (h) A = 0 0··· · · · bj,j ··· bj,n 0 0··· ···b · · · b j+1,j j+1,n . .. .. .. .. .. . . . . 0 0··· · · · bn,j · · · bn,n Entonces el pivoteo (parcial) implica la búsqueda de un elemento bt,j , t = j, . . . , n, no nulo y de módulo máximo para disminuir los errores numéricos que se introducen en las operaciones (si no se tiene en cuenta esto, casi que lo único que interesa es que bt,j 6= 0). Pero esto afecta solo a las filas que en ese momento ocupan los lugares entre j y n. Por tanto aquellas filas que ya fueron pivot no aparecen en posibles intercambios: si intercambio al comienzo la fila 1 con la 4 y luego la fila 3 con la 4 (que era la vieja fila 1), equivale a hacer de una vez: la fila 1 al lugar de la fila 3, la fila 3 a la fila 4 y la fila 4 a la fila 1. Se puede entonces suponer que al comienzo un ”gnomo” u oráculo nos dijo cómo convenı́a intercambiar las filas y hacerlo desde el comienzo. Si hacemos esto, en lugar de escalerizar A escalerizamos P A donde P es una matriz que intercambia las filas de A (una matriz de permutación). la matriz P es simplemente la que se obtiene de la identidad In aplicándole esa permutación a las filas. 2 Descomposición LU sin intercambio de filas Supongamos entonces por el momento que no precisamos alterar el orden entre las filas de A y que el rango de A es n (o sea, A es no singular). Observamos lo siguiente: al comienzo de la escalerización a cada fila A2 , . . . , An le sumamos la primera fila A1 multiplicada por −l2,1 , . . . , −ln,1 respectivamente, donde lj,1 = aj,1 /a1,1 . 2 Denotando por L−1 j,1 a la matriz L−1 j,1 = 0 ··· 0 0 ··· 0 ··· ··· ··· ···1 0··· 0 ··· ··· ··· .. .. .. . . . ··· ···0 1 1 0 0 1 ··· ··· −lj1 0 0 ··· .. .. . . 0 ··· se ve fácilmente que su inversa Lj,1 se obtiene simplemente cambiando el signo de la entrada (j, 1) (¡multiplique ambas matrices!): 1 0 0 ··· 0 0 1 0 ··· 0 ··· ··· ··· · · · · ·· lj1 0 · · · 1 0 · · · 0 Lj,1 = 0 ··· ··· ··· ··· . .. .. .. .. .. . . . . 0 ··· ··· ···0 1 La matriz A(1) que tiene todas las entradas en la primera columna iguales a 0, excepto la entrada (1, 1) que vale a1,1 , se escribe: −1 −1 −1 (1) L−1 n,1 Ln−1,1 · · · L3,1 L2,1 A = A o equivalentemente A = L2,1 L3,1 · · · Ln−1,1 Ln,1 A(1) . Repitiendo el proceso de escalerización con A(1) obtenemos una matriz A(2) que tiene nulas todos las entradas de la segunda columna (excepto la entrada (2, 2)). Con la adopción obvia de notación queda: −1 −1 −1 −1 −1 (2) L−1 n,2 · · · L4,2 L3,2 Ln,1 · · · L3,1 L2,1 A = A o equivalentemente A = L2,1 L3,1 · · · Ln,1 L3,2 L4,2 · · · Ln,2 A(2) . Aquı́ la matriz Li,j , i 6= j, se obtiene sumándole a la matriz identidad In la matriz n × n que tiene todas sus entradas nulas excepto la que ocupa el lugar (i, j) que vale li,j . 3 Continuando con el proceso de escalerización mientras sea posible se obtiene al final una matriz A(n) = U triangular superior (pues A es de rango máximo por hipótesis) tal que A se va a escribir A = L2,1 L3,1 · · · Ln,1 L3,2 · · · Ln,2 · · · Ln−1,n−2 Ln,n−2 Ln,n−1 U . Afirmamos que: 1. el producto L2,1 L3,1 · · · Ln,1 L3,2 · · · Ln,2 · · · Ln−1,n−2 Ln,n−2 Ln,n−1 es una matriz triangular inferior. Esto es obvio pues todas las matrices Li,j son triangulares inferiores y el producto de dos matrices triangulares inferiores es una matriz triangular inferior. 2. L2,1 L3,1 · · · Ln,1 es la matriz L1 = 1 l2,1 l3,1 ··· lj1 ··· .. . 0 1 0 ··· 0 ··· .. . 0 0 1 ··· ··· ··· .. . ··· ··· 0··· ··· 1··· ··· .. . 0 0 0 ··· 0 ··· .. . ln,1 0 ··· ···0 1 Del mismo modo L3,2 L4,2 · · · Ln,2 da la matriz L2 = 1 0 0 ··· 0 ··· .. . 0 0 1 l3,2 ··· lj,2 ··· .. . 0 0 1 ··· 0··· ··· .. . ··· ··· 0··· ··· 1··· ··· .. . 0 0 0 ··· 0 ··· .. . ln,2 ··· ···0 1 Y en general Li+1,i Li+2,i · · · Ln,i 4 da la matriz Li que tiene sus entradas sobre la diagonal principal iguales a 1, cada entrada (j, i) de la columna i por debajo de la diagonal (j > i) igual a lj,i , y el resto de las entradas iguales a 0. 3. Finalmente el producto L1 L2 1 l2,1 l3,1 ··· lj,1 ··· . .. da la matriz con entradas 0 0 ··· 0 1 0 ··· 0 l3,2 1 0··· 0 ··· ··· ··· ··· lj,2 0 · · · 1 · · · 0 ··· ··· ··· ··· .. .. .. .. . . . . ln,1 ln,2 0 · · · ···0 1 Para ver esto observar que multiplicar L2 por L1 a la izquierda equivale a sumarle a la segunda fila de L2 la primera (que es (1, 0, . . . , 0)) multiplicada por l2,1 , a la tercera fila de L2 la primera multiplicada por l3,1 , etc. 4. Haciendo primero Ln−2 Ln−1 , al resultado multiplicándolo a a izquierda por Ln−3 y ası́ hasta llegar a L1 se puede ver, con argumentos similares a los ya expuestos, que la matriz L obtenida de este modo es simplemente 1 0 0 ··· 0 l2,1 1 0 ··· 0 l3,1 l3,2 1 0··· 0 ··· ··· ··· ··· ··· L= l 1··· 0 j,1 lj,2 lj,3 · · · ··· ··· · · · · · · · · · . .. .. .. .. .. . . . . ln,1 ln,2 ··· · · · ln,n−1 1 donde los coeficientes lj,i son los que se obtienen al aplicar el método de escalerización de Gauss. Se concluye que A = LU donde L es triangular inferior con los elementos de la diagonal principal iguales a 1 y los coeficientes lj,i obtenidos como se ilustra más arriba y U es la matriz que se obtiene de A luego de la escalerización. Además las matrices L, U tales que A = LU son únicas (con L con unos en la diagonal principal) pues si LU = A = L0 U 0 entonces L0−1 L = U 0 U −1 . Pero U y U 0 son matrices triangulares superiores por lo que U −1 es triangular superior y el 5 producto U 0 U −1 es triangular superior. Análogamente L0−1 L es triangular inferior. Se concluye de la igualdad que todos los elementos de L0−1 L = U 0 U −1 que no estén en la diagonal principal son nulos. Pero como los de la diagonal principal de L y L0 son unos finalmente queda que L0−1 L = U 0 U −1 = In . O sea, L = L0 y U = U 0 . 3 Descomposición LU en el caso general Finalmente observemos que en el caso general no va a ser posible realizar la descomposición LU de la matriz A sin permutar las filas de A, en ese caso realizamos la descomposición LU de P A donde P es la matriz de permutación que intercambia las filas de A de modo que se pueda escalerizar P A sin pivoteo. Va a quedar P A = LU . Observación 3.0.2. Por otro lado, si el rango de A es menor que n (A es una matriz singular) en el proceso de escalerización de Gauss nos damos cuenta ya que encontraremos en algún paso j de la escalerización, j = 1, . . . , n − 1, que todas las filas Fk k = j + 1, . . . , n tienen elementos ak,j+1 = 0. Más aun, para las filas Fk luego del paso j de escalerización con k = j +1, . . . , n consideremos el máximo mk de todos los elementos |ak,h | con h = j + 1, . . . , n. Entonces en aritmética de punto flotante debemos cuidar que el valor normalizado de |ak,j+1 |/mk no sea tan chico que introduzca tales errores en el cálculo que hagan imposible continuar. Esto depende de la precisión usada. Estarı́amos, si ak,j+1 /mk ≈ 0 para todo k = j + 1, . . . , n, frente a un caso en que la matriz es casi singular. En ese caso un programa que realice la escalerización (o la descomposición LU) debe detenerse avisando que la matriz A es casi singular. Pero habı́amos supuesto que un oráculo nos decı́a qué filas debı́amos intercambiar, ¿cómo hacer si el ”gnomo” que nos sopla al principio el intercambio de filas no aparece? O sea, a priori no sé que intercambios de filas debo hacer. No serı́a muy económico tener que escalerizar una vez la matriz y volver a repetir todo de vuelta. Supongamos entonces que no tenemos al oráculo y que descubrimos luego de h pasos de escalerización aplicados directamente a A, que en la matriz A(h) obtenida es necesario intercambiar la fila i, Fi , con la j, Fj , siendo j > i > h. Eso equivale a multiplicar a izquierda la matriz A(h) por la matriz Pij que se obtiene a partir de la identidad In cambiando en esta última la fila i con la j. Ejemplo: si quiero 6 intercambiar la fila 1 con la 2 multiplico a izquierda por la matriz P12 0 1 0 ··· 0 1 0 0 ··· 0 0 1 0 ··· P12 = 0 ··· ··· ··· ··· ··· 0 ··· ··· ···0 1 El intercambio de la fila i con la j se representa por la ecuación matricial Pij L−1 (h) A = Pij A(h) donde en Lh−1 hemos incluido el producto de todas las transformaciones elementales aplicadas a A para obtener A(h) . Obsérvese que la matriz L−1 (h) restringida −1 −1 = 0 si h 6= k, lkk = 1. Esta observación a las columnas k ≥ i tiene entradas lhk −1 0−1 permite probar que Pij L(h) es lo mismo que L(h) Pij donde L0−1 (h) es la matriz que se obtiene de L−1 (h) intercambiando la fila i con la fila j pero dejando la entrada 1 en la diagonal principal sin mover. Ejemplo: supongamos que A es 4 × 4 y que van dos pasos de la escalerización y allı́ vemos que es preciso intercambiar la fila 3 con la 4. Esto se escribirı́a : P34 L−1 2 A 1 0 0 0 1 0 0 0 0 1 0 0 −l21 1 0 0 0 0 0 1 × −l31 −l32 1 0 × A 0 0 1 0 −l41 −l42 0 1 que es lo mismo que 1 0 −l21 1 −l41 −l42 −l31 −l32 0 0 1 0 0 1 0 0 × 0 0 1 0 0 1 0 0 0 0 0 1 0 0 ×A 1 0 Resulta entonces que no perdemos nada al ir realizando los intercambios de fila en el momento en que lo precisamos. Esto sugiere entonces que realicemos el siguiente Algoritmo para hallar la descomposición LU de P A. Entrada: A = ((aij )) matriz n × n de rango n. Salida: L, U P matrices n × n que realizan la igualdad LU = P A. 1. ) Hacer P la matriz identidad n × n, hacer L la matriz identidad n × n. (Valores iniciales de P y L). 7 2. ) Para i variando entre 1 y n hacer: 3. ) Si aii = 0 buscar el primer j > i tal que aij 6= 0. Intercambiar en P la fila i con la fila j, intercambiar en A la fila i con la j, intercambiar en L la fila i con la j, para la matriz L dejar incambiada la diagonal principal (donde la entrada es 1). 4. ) Para j > i hasta que j = n, hacer lji = aji . aii Cambiar la fila Fj de A por Fj − lji Fi . Insertar en la entrada (j, i) de L el valor lji . 5. ) Tomar como nuevas matrices A, P y L a las obtenidas con las transformaciones anteriores. (Ver nota al pie del algoritmo). 6. ) Volver al paso 2. ) incrementando en 1 el valor de i. (repetir todo de nuevo hasta que i = n). 7. ) Al finalizar tenemos como último valor de A a la matriz U , y las correspondientes P y L. Nota: Los elementos aij a los que refiere el algoritmo anterior NO son los originales de A, sino los que se obtienen al ir aplicando los sucesivos pasos. Ası́ seguimos llamando A a la matriz que se va obteniendo luego de varias etapas de escalerización como es usual en programación. Es lo que anteriormente llamamos A(h) . Análogas consideraciones valen para L y P . Si este algoritmo se realiza con un dispositivo electrónico (un computador) y se deseara guardar el valor original de A habrı́a que almacenarlo aparte (tomar un duplicado) ya que al final del algoritmo el valor modificado de A es la matriz U . Más aun, los lugares que van a ser 0 pueden almacenar los valores de L excepto los de la diagonal principal, pero estos no se precisan almacenar ya que lii = 1 para todo i = 1, . . . , n donde (lij ) = L. Para resolver el sistema Ax = b lo hacemos resolviendo P Ax = P b, o sea, LU x = P b. En la práctica tampoco se precisa construir la matriz P . Alcanza con llevar control de las filas que intercambiamos en la escalerización o que puede hacerse con un vector de orden ord que al principio se inicializa como ord(k) = k para todo k = 1, . . . , n. Al intercambiar la fila i con la j simplemente llevamos cuenta de ello haciendo ord(i) = j, ord(j) = i. Al resolver Ax = b, usando la 8 descomposición LU, realizamos los mismos intercambios entre las filas de la matriz columna b. La información de estos cambios están almacenados en ord. 4 Ejemplos de bolsillo. Si A es una matriz 2 × 2 µ A= a11 a12 a21 a22 entonces si a11 6= 0 calculamos l21 = ¶ a21 a11 y la matriz L queda simplemente µ L= 1 l21 0 1 ¶ La matriz U es la que resulta de la escalerización que en este caso queda µ ¶ a11 a12 U= 0 a022 donde a022 = a22 − l21 a12 = a22 − a21 a12 . a11 Si fuera preciso permutar las filas de A (esto es imprescindible si a11 = 0, pero en la práctica debe hacerse también si a11 normalizado es casi nulo, a11 /m1 ≈ 0) entonces escalerizarı́amos la matriz P A ¶ µ a21 a22 PA = a11 a12 donde P es la matriz elemental que realiza el intercambio de la primera y segunda fila de A al multiplicar A a la izquierda por P µ ¶ 0 1 P = . 1 0 Si A es una matriz 3 × 3 a11 a12 a13 A = a21 a22 a23 a31 a32 a33 9 entonces, si a11 6= 0, l21 y l31 se calculan simplemente como l21 = a21 , a11 l31 = a31 a11 la matriz A luego de escalerizada para anular las entradas (2, 1) y (3, 1) - lo que se logra cambiando la fila 2, A2 , por la fila 2 menos la fila 1 multiplicada por l21 , A2 − l21 A1 y cambiando la fila 3, A3 , por la fila 3 menos la fila 1 multiplicada por l31 , A3 − l31 A1 - queda a11 a12 a13 A(1) = 0 a022 a023 0 a032 a033 donde a022 = a22 −l21 a12 , a0 23 = a23 −l21 a13 , a0 32 = a32 −l31 a12 y a033 = a33 −l31 a13 . Finalmente, si a022 6= 0 calculamos a032 a022 l32 = y escalerizmos restando a la tercera fila de A(1) la segunda. Obtenemos la matriz U a11 a12 a13 U = 0 a022 a023 0 0 a0033 donde a0033 = a033 − l32 a023 . La matriz L va 1 L = l21 l31 a ser simplemente 0 0 1 0 l32 1 En general para obtener L se van almacenando en los lugares (j, i) los coeficientes lji , j > i, que aparecen en el método de escalerización de Gauss, siendo (h) lji = aji (h) aii (h) el factor necesario para que al sustituir la fila Aj (h) por Aj (h) − lji Ai se anule la entrada (j, i) (aquı́ A(h) representa la matriz obtenida luego de h pasos de escalerización). La entradas en la diagonal principal de L son el número 1 y el resto de las entradas (las que están por encima de la diagonal principal) son nulas. La matriz U va a ser la que se obtiene al finalizar la escalerización de A. Otra vez, si es preciso intercambiar filas en A en realidad vamos a estar haciendo la 10 descomposición LU de P A y al resolver Ax = b lo haremos hallando la solución de LU x = P b. Ejemplos numéricos 2 1 1 A = 1 1 −2 0 −1 4 Aquı́ l21 = 12 . Restando a la segunda fila la primera multiplicada por l21 = como nueva segunda fila 1 5 − ). (0 2 2 Como la entrada (3, 1) es nula l31 = 0. La matriz obtenida es 2 1 1 A(1) = 0 12 − 52 0 −1 4 El coeficiente l32 vale l32 = −1 1 2 1 2 queda = −2 Sustituyendo en A(1) la tercera fila por la tercera fila menos la segunda multiplicada por l32 obtenemos la matriz U 2 1 1 U = 0 12 − 52 0 0 −1 La matriz L queda 0 0 L = 12 1 0 . 0 −2 1 1 Si ahora A fuera la matriz 0 −1 4 1 A= 2 1 1 1 −2 como en este caso a11 = 0 debo intercambiar la fila 1 con otra. Es claro que si intercambio primero la fila 1 con la fila 3 y luego la fila 1 con la fila 2 caigo en el ejemplo ya visto (esto es algo artificioso, normalmente uno harı́a un intercambio 11 sólo, por ejemplo la primera fila con la segunda, lo hacemos para aprovechar lo ya hecho). La matriz P en ese caso serı́a 0 1 0 P = 0 0 1 1 0 0 Si quiero resolver Ax = b con 3 b= 5 −1 En este caso, como ya dijimos, aplicando LU debo intercambiar las filas de b según la matriz P resolviendo LU x = P b. En este caso P b es 5 b = −1 . 3 La descomposición LU se usa cuando hay que resolver el sistema Ax = b para varios b distintos. En el fondo puede verse como un modo de aprovechar la información que se obtiene al escalerizar A de modo de re-usarla otras veces. Puede usarse para calcular la inversa de A, A−1 , ya que en este caso se debe resolver Ax = ej para j = 1, . . . , n con ej la matriz columna (vector) que tiene todas sus entradas nulas excepto la de la fila j que vale 1. Observación 4.0.3. Dado que det(P A) = det(L) det(U ) resulta, puesto que L y U son matrices triangulares y lii = 1 ∀ i = 1, . . . , n, que det(P A) = det(U ) = n Y uii i=1 donde U = (uij ). Si nos interesa calcular el valor de det(A) debemos saber el de det(P ) ya que det(P A) = det(P ) det(A). Esto puede hacerse en la descomposición LU simplemente definiendo una variable detP que se inicializa en 1 y que se multiplica por −1 cada vez que se intercambia una fila por otra en la escalerización de A. O sea, hacemos detP := −detP cada vez que se intercambian filas. Al finalizar tenemos el valor de detP que será 1 ó −1 de donde resulta det(A) = detP · det(U ) = detP · n Y i=1 12 uii .