En análisis numérico y álgebra lineal , la descomposición o factorización inferior-superior ( LU ) factoriza una matriz como el producto de una matriz triangular inferior y una matriz triangular superior (ver descomposición matricial ). En ocasiones, el producto también incluye una matriz de permutación . La descomposición LU puede verse como la forma matricial de la eliminación gaussiana . Las computadoras generalmente resuelven sistemas cuadrados de ecuaciones lineales mediante descomposición LU, y también es un paso clave al invertir una matriz o calcular el determinante de una matriz. La descomposición LU fue introducida por el astrónomo polaco Tadeusz Banachiewicz en 1938. [1] Para citar: "Parece que Gauss y Doolittle aplicaron el método [de eliminación] sólo a ecuaciones simétricas. Autores más recientes, por ejemplo, Aitken, Banachiewicz, Dwyer y Crout... han enfatizado el uso del método, o variaciones del mismo, en relación con problemas no simétricos... Banachiewicz... vio el punto... que el problema básico es en realidad uno de factorización matricial, o “descomposición”, como él llamó él." [2] A veces también se la conoce como descomposición LR (factores en matrices triangulares izquierda y derecha).
Sea A una matriz cuadrada. Una factorización LU se refiere a la factorización de A , con ordenamientos o permutaciones de filas y/o columnas adecuadas, en dos factores: una matriz triangular inferior L y una matriz triangular superior U :
En la matriz triangular inferior todos los elementos por encima de la diagonal son cero, en la matriz triangular superior, todos los elementos por debajo de la diagonal son cero. Por ejemplo, para una matriz A de 3 × 3 , su descomposición LU se ve así:
Sin un ordenamiento adecuado o permutaciones en la matriz, es posible que la factorización no se materialice. Por ejemplo, es fácil verificar (expandiendo la multiplicación de matrices ) que . Si , entonces al menos uno de y tiene que ser cero, lo que implica que L o U son singulares . Esto es imposible si A es no singular (invertible). Este es un problema de procedimiento. Se puede eliminar simplemente reordenando las filas de A de modo que el primer elemento de la matriz permutada sea distinto de cero. El mismo problema en pasos de factorización posteriores se puede eliminar de la misma manera; consulte el procedimiento básico a continuación.
Resulta que una permutación adecuada en filas (o columnas) es suficiente para la factorización LU. La factorización LU con pivote parcial (LUP) se refiere a menudo a la factorización LU con permutaciones de filas únicamente:
donde L y U son nuevamente matrices triangulares inferior y superior, y P es una matriz de permutación que, cuando se multiplica por la izquierda por A , reordena las filas de A. Resulta que todas las matrices cuadradas se pueden factorizar de esta forma, [3] y la factorización es numéricamente estable en la práctica. [4] Esto hace que la descomposición de LUP sea una técnica útil en la práctica.
Una factorización LU con pivote completo implica permutaciones de filas y columnas:
donde L , U y P se definen como antes, y Q es una matriz de permutación que reordena las columnas de A. [5]
Una descomposición inferior-diagonal-superior (LDU) es una descomposición de la forma
donde D es una matriz diagonal y L y U son matrices unitriangulares , lo que significa que todas las entradas en las diagonales de L y U son una.
Anteriormente requerimos que A sea una matriz cuadrada, pero todas estas descomposiciones también pueden generalizarse a matrices rectangulares. [6] En ese caso, L y D son matrices cuadradas que tienen el mismo número de filas que A , y U tiene exactamente las mismas dimensiones que A. Se debe interpretar que el triángulo superior tiene solo cero entradas debajo de la diagonal principal, que comienza en la esquina superior izquierda. De manera similar, el término más preciso para U es que es la forma escalonada por filas de la matriz A.
Factorizamos la siguiente matriz de 2 por 2:
Una forma de encontrar la descomposición LU de esta matriz simple sería simplemente resolver las ecuaciones lineales mediante inspección. Al expandir la multiplicación de matrices se obtiene
Este sistema de ecuaciones está subdeterminado . En este caso, dos elementos cualesquiera distintos de cero de las matrices L y U son parámetros de la solución y se pueden establecer arbitrariamente en cualquier valor distinto de cero. Por lo tanto, para encontrar la descomposición LU única, es necesario imponer alguna restricción a las matrices L y U. Por ejemplo, podemos requerir convenientemente que la matriz triangular inferior L sea una matriz triangular unitaria (es decir, establecer todas las entradas de su diagonal principal en unidades). Entonces el sistema de ecuaciones tiene la siguiente solución:
Sustituyendo estos valores en la descomposición LU anterior se obtiene
Cualquier matriz cuadrada admite factorizaciones LUP y PLU . [3] Si es invertible , entonces admite una factorización LU (o LDU ) si y solo si todos sus principales menores principales [7] son distintos de cero [8] (por ejemplo, no admite una factorización LU o LDU ). Si es una matriz singular de rango , entonces admite una factorización LU si los primeros menores principales principales son distintos de cero, aunque lo contrario no es cierto. [9]
Si una matriz cuadrada invertible tiene una LDU (factorización con todas las entradas diagonales de L y U iguales a 1), entonces la factorización es única. [8] En ese caso, la factorización LU también es única si requerimos que la diagonal de (o ) esté formada por unos.
En general, cualquier matriz cuadrada podría tener una de las siguientes características:
En el Caso 3, se puede aproximar una factorización LU cambiando una entrada diagonal a para evitar un principal menor principal cero. [10]
Si A es una matriz definida positiva simétrica (o hermitiana , si A es compleja) , podemos arreglar las cosas de manera que U sea la transpuesta conjugada de L. Es decir, podemos escribir A como
Esta descomposición se llama descomposición de Cholesky . Si es definida positiva, entonces la descomposición de Cholesky existe y es única. Además, calcular la descomposición de Cholesky es más eficiente y numéricamente más estable que calcular otras descomposiciones LU.
Para una matriz (no necesariamente invertible) sobre cualquier campo, se conocen las condiciones exactas necesarias y suficientes bajo las cuales tiene una factorización LU. Las condiciones se expresan en términos de los rangos de determinadas submatrices. El algoritmo de eliminación gaussiano para obtener la descomposición LU también se ha extendido a este caso más general. [11]
Cuando existe una factorización LDU y es única, existe una fórmula cerrada (explícita) para los elementos de L , D y U en términos de proporciones de determinantes de ciertas submatrices de la matriz original A. [12] En particular, y para , es la relación entre la -ésima submatriz principal y la -ésima submatriz principal. El cálculo de los determinantes es costoso , por lo que esta fórmula explícita no se utiliza en la práctica.
El siguiente algoritmo es esencialmente una forma modificada de eliminación gaussiana . Calcular una descomposición LU utilizando este algoritmo requiere operaciones de punto flotante, ignorando los términos de orden inferior. El pivote parcial añade sólo un término cuadrático; este no es el caso del giro completo. [13]
Dada una matriz N × N , defina como la versión original sin modificar de la matriz . El superíndice entre paréntesis (por ejemplo, ) de la matriz es la versión de la matriz. La matriz es la matriz en la que los elementos debajo de la diagonal principal ya han sido eliminados a 0 mediante eliminación gaussiana para las primeras columnas.
A continuación se muestra una matriz para observar y ayudarnos a recordar la notación (donde cada uno representa cualquier número real en la matriz):
Durante este proceso, modificamos gradualmente la matriz mediante operaciones de fila hasta que se convierte en la matriz en la que todos los elementos debajo de la diagonal principal son iguales a cero. Durante esto, crearemos simultáneamente dos matrices separadas y , de modo que .
Definimos la matriz de permutación final como la matriz identidad que tiene todas las mismas filas intercambiadas en el mismo orden que la matriz mientras se transforma en matriz . Para nuestra matriz , podemos comenzar intercambiando filas para proporcionar las condiciones deseadas para la enésima columna. Por ejemplo, podríamos intercambiar filas para realizar un pivote parcial, o podríamos hacerlo para establecer el elemento de pivote en la diagonal principal en un número distinto de cero para que podamos completar la eliminación gaussiana.
Para nuestra matriz , queremos establecer todos los elementos siguientes en cero (donde está el elemento en la enésima columna de la diagonal principal). Denotaremos cada elemento a continuación como (dónde ). Para establecerlo en cero, configuramos para cada fila . Para esta operación, . Una vez que hemos realizado las operaciones de fila para las primeras columnas, hemos obtenido una matriz triangular superior que se denota por .
También podemos crear la matriz triangular inferior denominada , ingresando directamente los valores calculados previamente mediante la siguiente fórmula.
Si nos dan la matriz, elegiremos implementar un pivote parcial y así intercambiar la primera y segunda fila para que nuestra matriz y la primera iteración de nuestra matriz respectivamente se conviertan en Una vez que hayamos intercambiado las filas, podemos eliminar los elementos debajo de la diagonal principal. en la primera columna actuando de manera que, una vez restadas estas filas, hemos derivado de la matriz. Debido a que estamos implementando un pivote parcial, intercambiamos la segunda y tercera filas de nuestra matriz derivada y la versión actual de nuestra matriz respectivamente para obtener Ahora, eliminamos los elementos debajo de la diagonal principal en la segunda columna realizando tal que . Debido a que no existen elementos distintos de cero debajo de la diagonal principal en nuestra iteración actual después de esta resta de filas, esta resta de filas deriva nuestra matriz final (denotada como ) y nuestra matriz final: Después de cambiar también las filas correspondientes, obtenemos nuestra matriz final: Ahora estas matrices tienen una relación tal que .
Si no intercambiamos filas en absoluto durante este proceso, podemos realizar las operaciones de fila simultáneamente para cada columna estableciendo dónde está la matriz identidad N × N con su n -ésima columna reemplazada por el vector transpuesto . En otras palabras, el triángulo inferior matriz
Realizar todas las operaciones de fila para las primeras columnas usando la fórmula equivale a encontrar la descomposición Denote de modo que .
Ahora calculemos la secuencia de . Sabemos que tiene la siguiente fórmula.
Si hay dos matrices triangulares inferiores con unos en la diagonal principal, y ninguna tiene un elemento distinto de cero debajo de la diagonal principal en la misma columna que la otra, entonces podemos incluir todos los elementos distintos de cero en su misma ubicación en el producto. de las dos matrices. Por ejemplo:
Finalmente, multiplique y genere la matriz fusionada indicada como (como se mencionó anteriormente). Usando la matriz , obtenemos
Está claro que para que este algoritmo funcione es necesario tener en cada paso (ver la definición de ). Si esta suposición falla en algún momento, es necesario intercambiar la n -ésima fila con otra fila debajo antes de continuar. Esta es la razón por la que en general parece una descomposición LU .
Tenga en cuenta que la descomposición obtenida mediante este procedimiento es una descomposición de Doolittle : la diagonal principal de L se compone únicamente de 1 s. Si se procediera a eliminar elementos encima de la diagonal principal sumando múltiplos de las columnas (en lugar de eliminar elementos debajo de la diagonal sumando múltiplos de las filas ), obtendríamos una descomposición de Crout , donde la diagonal principal de U es de 1 s .
Otra forma (equivalente) de producir una descomposición de Crout de una matriz A dada es obtener una descomposición de Doolittle de la transpuesta de A. De hecho, si la descomposición LU se obtiene mediante el algoritmo presentado en esta sección, entonces, tomando y , tenemos que se trata de una descomposición de Crout.
Cormen et al. [14] describen un algoritmo recursivo para la descomposición de LUP.
Dada una matriz A , sea P 1 una matriz de permutación tal que
donde , si hay una entrada distinta de cero en la primera columna de A ; o tome P 1 como matriz identidad en caso contrario. Ahora vamos , si ; o de otro modo. Tenemos
Ahora podemos encontrar recursivamente una descomposición LUP . Dejar . Por lo tanto
que es una descomposición LUP de A.
Es posible encontrar una aproximación de rango bajo a una descomposición LU utilizando un algoritmo aleatorio. Dada una matriz de entrada y un rango bajo deseado , la LU aleatoria devuelve matrices de permutación y matrices trapezoidales inferior/superior de tamaño y respectivamente, de manera que con alta probabilidad , donde es una constante que depende de los parámetros del algoritmo y es la -ésima valor singular de la matriz de entrada . [15]
Si dos matrices de orden n se pueden multiplicar en el tiempo M ( n ), donde M ( n ) ≥ n a para algún a > 2, entonces se puede calcular una descomposición LU en el tiempo O ( M ( n )). [16] Esto significa, por ejemplo, que existe un algoritmo O ( n 2,376 ) basado en el algoritmo Coppersmith-Winograd .
Se han desarrollado algoritmos especiales para factorizar matrices dispersas grandes . Estos algoritmos intentan encontrar factores dispersos L y U. Idealmente, el costo del cálculo está determinado por el número de entradas distintas de cero, en lugar del tamaño de la matriz.
Estos algoritmos utilizan la libertad de intercambiar filas y columnas para minimizar el relleno (entradas que cambian de un valor inicial cero a un valor distinto de cero durante la ejecución de un algoritmo).
El tratamiento general de los ordenamientos que minimizan el relleno se puede abordar mediante la teoría de grafos .
Dado un sistema de ecuaciones lineales en forma matricial.
queremos resolver la ecuación para x , dados A y b . Supongamos que ya hemos obtenido la descomposición LUP de A tal que , entonces .
En este caso la solución se realiza en dos pasos lógicos:
En ambos casos estamos tratando con matrices triangulares ( L y U ), que pueden resolverse directamente mediante sustitución hacia adelante y hacia atrás sin utilizar el proceso de eliminación gaussiano (sin embargo, necesitamos este proceso o equivalente para calcular la descomposición LU en sí).
El procedimiento anterior se puede aplicar repetidamente para resolver la ecuación varias veces para diferentes b . En este caso, es más rápido (y más conveniente) hacer una descomposición LU de la matriz A una vez y luego resolver las matrices triangulares para las diferentes b , en lugar de usar la eliminación gaussiana cada vez. Se podría pensar que las matrices L y U han "codificado" el proceso de eliminación gaussiano.
El costo de resolver un sistema de ecuaciones lineales es aproximadamente operaciones de punto flotante si la matriz tiene tamaño . Esto lo hace dos veces más rápido que los algoritmos basados en la descomposición QR , que cuestan aproximadamente operaciones de punto flotante cuando se utilizan reflexiones de Householder . Por esta razón, normalmente se prefiere la descomposición LU. [17]
Al resolver sistemas de ecuaciones, b generalmente se trata como un vector con una longitud igual a la altura de la matriz A. Sin embargo, en la inversión de matrices, en lugar del vector b , tenemos la matriz B , donde B es una matriz de n por p , de modo que estamos tratando de encontrar una matriz X (también una matriz de n por p ):
Podemos usar el mismo algoritmo presentado anteriormente para resolver cada columna de la matriz X. Ahora supongamos que B es la matriz identidad de tamaño n . Se seguiría que el resultado X debe ser el inverso de A. [18]
Dada la descomposición LUP de una matriz cuadrada A , el determinante de A se puede calcular directamente como
La segunda ecuación se deriva del hecho de que el determinante de una matriz triangular es simplemente el producto de sus entradas diagonales, y que el determinante de una matriz de permutación es igual a (−1) S donde S es el número de intercambios de filas en la descomposición. .
En el caso de la descomposición LU con pivote completo, también es igual al lado derecho de la ecuación anterior, si dejamos que S sea el número total de intercambios de filas y columnas.
El mismo método se aplica fácilmente a la descomposición LU haciendo que P sea igual a la matriz identidad.
/* ENTRADA: A - matriz de punteros a filas de una matriz cuadrada que tiene dimensión N * Tol - número de tolerancia pequeño para detectar fallas cuando la matriz está casi degenerada * SALIDA: La matriz A se cambia, contiene una copia de ambas matrices LE y U como A=(LE)+U tal que P*A=L*U. * La matriz de permutación no se almacena como una matriz, sino en un vector entero P de tamaño N+1 * que contiene índices de columna donde la matriz de permutación tiene "1". El último elemento P[N]=S+N, * donde S es el número de intercambios de filas necesarios para el cálculo del determinante, det(P)=(-1)^S */ int LUPDecompose ( double ** A , int N , doble Tol , int * P ) { int yo , j , k , imax ; doble maxA , * ptr , absA ; para ( i = 0 ; i <= N ; i ++ ) P [ i ] = i ; //Matriz de permutación unitaria, P[N] inicializada con N para ( i = 0 ; i < N ; i ++ ) { maxA = 0.0 ; imáx = yo ; for ( k = i ; k < N ; k ++ ) if (( absA = fabs ( A [ k ][ i ])) > maxA ) { maxA = absA ; imáx = k ; } si ( maxA < Tol ) devuelve 0 ; //fallo, la matriz está degenerada if ( imax ! = i ) { //pivotando P j = P [ i ]; P [ i ] = P [ imax ]; P [ imax ] = j ; //filas pivotantes de A ptr = A [ i ]; A [ i ] = A [ imax ]; A [ imax ] = ptr ; //contando pivotes a partir de N (para determinante) P [ N ] ++ ; } for ( j = i + 1 ; j < N ; j ++ ) { A [ j ][ i ] /= A [ i ][ i ]; para ( k = i + 1 ; k < N ; k ++ ) A [ j ][ k ] -= A [ j ][ i ] * A [ i ][ k ]; } } devolver 1 ; //descomposición realizada } /* ENTRADA: A,P completado LUPDecompose; b - vector rhs; N - dimensión * SALIDA: x - vector solución de A*x=b */ void LUPSolve ( double ** A , int * P , double * b , int N , double * x ) { para ( int i = 0 ; i < N ; i ++ ) { x [ i ] = b [ P [ i ]]; para ( int k = 0 ; k < i ; k ++ ) x [ i ] -= A [ i ][ k ] * x [ k ]; } for ( int i = N - 1 ; i >= 0 ; i -- ) { for ( int k = i + 1 ; k < N ; k ++ ) x [ i ] -= A [ i ][ k ] * x [ k ]; x [ yo ] /= A [ yo ][ yo ]; } } /* ENTRADA: A,P completado LUPDecompose; N - dimensión * SALIDA: IA es la inversa de la matriz inicial */ void LUPInvert ( double ** A , int * P , int N , double ** IA ) { for ( int j = 0 ; j < N ; j + + ) { for ( int i = 0 ; i < N ; i ++ ) { IA [ i ][ j ] = P [ i ] == j ? 1,0 : 0,0 ; for ( int k = 0 ; k < i ; k ++ ) IA [ i ][ j ] -= A [ i ][ k ] * IA [ k ][ j ]; } for ( int i = N - 1 ; i >= 0 ; i -- ) { for ( int k = i + 1 ; k < N ; k ++ ) IA [ i ][ j ] -= A [ i ][ k ] * IA [ k ][ j ]; IA [ i ][ j ] /= A [ i ][ i ]; } } } /* ENTRADA: A,P completado LUPDecompose; norte - dimensión. *SALIDA: La función devuelve el determinante de la matriz inicial */ double LUPDeterminant ( double ** A , int * P , int N ) { doble det = A [ 0 ][ 0 ]; for ( int i = 1 ; i < N ; i ++ ) det *= A [ i ][ i ]; devolver ( P [ N ] - N ) % 2 == 0 ? det : - det ; }
clase pública SystemOfLinearEquations { público doble [] SolveUsingLU ( doble [,] matriz , doble [] parte derecha , int n ) { // descomposición de la matriz doble [,] lu = nuevo doble [ n , n ]; doble suma = 0 ; para ( int i = 0 ; i < n ; i ++ ) { para ( int j = i ; j < n ; j ++ ) { suma = 0 ; para ( int k = 0 ; k < i ; k ++ ) suma += lu [ i , k ] * lu [ k , j ]; lu [ i , j ] = matriz [ i , j ] -suma ; } para ( int j = i + 1 ; j < n ; j ++ ) { suma = 0 ; para ( int k = 0 ; k < i ; k ++ ) suma += lu [ j , k ] * lu [ k , i ]; lu [ j , i ] = ( 1 / lu [ i , i ]) * ( matriz [ j , i ] - suma ); } } // lu = L+UI // encuentra la solución de Ly = b double [] y = new double [ n ]; para ( int i = 0 ; i < n ; i ++ ) { suma = 0 ; para ( int k = 0 ; k < i ; k ++ ) suma += lu [ i , k ] * y [ k ]; y [ i ] = partederecha [ i ] -suma ; } // encuentra la solución de Ux = y double [] x = new double [ n ]; for ( int i = n - 1 ; i >= 0 ; i - ) { suma = 0 ; para ( int k = i + 1 ; k < n ; k ++ ) suma += lu [ i , k ] * x [ k ]; x [ i ] = ( 1 / lu [ i , i ]) * ( y [ i ] - suma ); } devolver x ; } }
función LU = LUDecompDoolittle ( A ) n = longitud ( A ); LU = A ; % de descomposición de la matriz, Método de Doolittle para i = 1 : 1 : n para j = 1 :( i - 1 ) LU ( i , j ) = ( LU ( i , j ) - LU ( i , 1 :( j - 1 )) * LU ( 1 :( j - 1 ), j )) / LU ( j , j ); final j = yo : norte ; LU ( i , j ) = LU ( i , j ) - LU ( i , 1 : (i - 1 )) * LU ( 1 : (i - 1 ), j ); final %LU = L+UI final función x = SolveLinearSystem ( LU, B ) n = longitud ( LU ); y = ceros ( tamaño ( B )); % encontrar solución de Ly = B para i = 1 : n y ( i ,:) = B ( i ,:) - LU ( i , 1 : i ) * y ( 1 : i ,:); final % encontrar solución de Ux = y x = ceros ( tamaño ( B )); para i = n :( - 1 ): 1 x ( i ,:) = ( y ( i ,:) - LU ( i ,( i + 1 ): n ) * x (( i + 1 ): n ,: )) / LU ( yo , yo ); fin fin A = [ 4 3 3 ; 6 3 3 ; 3 4 3 ] LU = LUDecompDoolittle ( A ) B = [ 1 2 3 ; 4 5 6 ; 7 8 9 ; 10 11 12 ] ' x = SolveLinearSystem ( LU , B ) A * x
{{cite book}}
: CS1 maint: location missing publisher (link)Referencias
Codigo de computadora
Recursos en línea