LUP-decomposition ( LUP -decomposition) - reprezentace dané matice jako produktu permutační matice získaná z matice identity permutací řádků nebo sloupců. Takový rozklad lze provést pro jakoukoli nedegenerovanou matrici. LUP-dekompozice se používá k výpočtu inverzní matice v kompaktním schématu, k výpočtu řešení soustavy lineárních rovnic. Ve srovnání s LU dekompozičním algoritmem si LUP dekompoziční algoritmus poradí s jakýmikoli nedegenerovanými maticemi a zároveň má vyšší výpočetní stabilitu .
Nech , , . V praxi se zpravidla místo permutační matice P používá permutační vektor získaný z vektoru permutací prvků odpovídajících číslům řádků permutovaných v matici P. Např.
potom , protože matice P se získá záměnou prvního a druhého řádku. Výpočet rozšíření LUP se provádí v několika krocích. Nechť matici C = A. V každém i-tém kroku se nejprve hledá referenční (vedoucí) prvek — prvek s maximálním modulem mezi prvky i-tého sloupce, které nejsou vyšší než i-tý řádek , načež se řada s otočným prvkem prohodí s i -tou čárou. Současně se stejná výměna provádí v matici P. V tomto případě, pokud je matice nesingulární, je zaručeno, že referenční prvek bude odlišný od nuly. Poté jsou všechny prvky aktuálního i-tého sloupce pod i-tým řádkem rozděleny pivotem. Dále od všech prvků umístěných pod i-tým řádkem a i-tým sloupcem (tj. takových, že j>i a k>i) se odečte součin . Poté se čítač i zvýší o jedničku a proces se opakuje, dokud i<n, kde n je rozměr původní matice. Po dokončení všech kroků bude matice C následující součet:
kde E je matice identity .
Algoritmus používá tři vnořené lineární smyčky, takže celkovou složitost algoritmu lze odhadnout jako O( n ³).
Níže je uveden programový kód výše uvedeného algoritmu v C++. Zde Matrix je nějaký kontejner, který podporuje operaci indexování. Upozorňujeme, že odpočítávání je od nuly, nikoli od jedné.
void LUP ( const Matrix & A , Matrix & C , Matrix & P ) { //n - rozměr původní matice const int n = A . Řádky (); C = A ; //nahrání do matice P matici identity P = IdentityMatrix (); for ( int i = 0 ; i < n ; i ++ ) { //hledání pivotu double pivotValue = 0 ; int pivot = -1 ; for ( int řádek = i ; řádek < n ; řádek ++ ) { if ( fabs ( C [ řádek ][ i ]) > pivotValue ) { pivotValue = fabs ( C [ řádek ][ i ]); pivot = řada ; } } if ( pivotValue != 0 ) { //prohoď i-tý řádek a řádek s referenčním prvkem P . SwapRows ( pivot , i ); C. _ SwapRows ( pivot , i ); for ( int j = i + 1 ; j < n ; j ++ ) { C [ j ][ i ] /= C [ i ][ i ]; for ( int k = i + 1 ; k < n ; k ++ ) C [ j ][ k ] -= C [ j ][ i ] * C [ i ][ k ]; } } } } //nyní matice C = L + U - EVektory a matice | |||||||||
---|---|---|---|---|---|---|---|---|---|
vektory |
| ||||||||
matrice |
| ||||||||
jiný |