LUP-dekomponering ( LUP -dekomponering) - repræsentation af en given matrix som et produkt en permutationsmatrix opnået fra identitetsmatrixen ved at permutere rækker eller kolonner. En sådan nedbrydning kan udføres for enhver ikke- degenereret matrix. LUP-dekomponering bruges til at beregne den inverse matrix i et kompakt skema, til at beregne løsningen af et system af lineære ligninger. Sammenlignet med LU-dekomponeringsalgoritmen kan LUP-dekomponeringsalgoritmen håndtere alle ikke-singulære matricer og har på samme tid højere beregningsstabilitet.
Lad , , . I praksis anvendes som regel i stedet for permutationsmatricen P en permutationsvektor, der opnås fra vektoren ved at permutere de elementer, der svarer til rækkenumrene permuteret i matricen P. Hvis f.eks.
da , da matrixen P opnås ved at ombytte den første og anden række. Beregningen af LUP-udvidelsen udføres i flere trin. Lad matrixen C = A. Ved hvert i-te trin søges først efter et referenceelement (førende) - elementet med det maksimale modul blandt elementerne i den i-te kolonne, der ikke er højere end den i-te række , hvorefter rækken med pivotelementet ombyttes med i-te linje. Samtidig udføres den samme udveksling i matricen P. I dette tilfælde, hvis matrixen er ikke-singular, er referenceelementet garanteret at være forskelligt fra nul. Derefter bliver alle elementer i den aktuelle i-te kolonne under den i-te række divideret med pivoten. Yderligere, fra alle elementer placeret under den i-te række og i-te kolonne (det vil sige sådan, at j>i og k>i), trækkes produktet fra . Derefter øges tælleren i med én, og processen gentages indtil i<n hvor n er dimensionen af den oprindelige matrix. Når alle trin er gennemført, vil matrix C være følgende sum:
hvor E er identitetsmatrixen .
Algoritmen bruger tre indlejrede lineære sløjfer, så den samlede kompleksitet af algoritmen kan estimeres som O( n ³).
Nedenfor er programkoden for ovenstående algoritme i C++. Her er Matrix en container, der understøtter indekseringsoperationen. Bemærk venligst, at nedtællingen er fra nul, ikke fra én.
void LUP ( const Matrix & A , Matrix & C , Matrix & P ) { //n - dimension af den oprindelige matrix const int n = A . Rækker (); C = A ; //indlæs i matrix P identitetsmatrixen P = IdentityMatrix (); for ( int i = 0 ; i < n ; i ++ ) { //søg efter en pivot double pivotValue = 0 ; int pivot = -1 ; for ( int række = i ; række < n ; række ++ ) { if ( fabs ( C [ row ][ i ]) > pivotValue ) { pivotValue = fabs ( C [ række ][ i ]); pivot = række ; } } if ( pivotValue != 0 ) { //byt den i-te linje og linjen med referenceelementet 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 ]; } } } } //nu matrix C = L + U - EVektorer og matricer | |||||||||
---|---|---|---|---|---|---|---|---|---|
Vektorer |
| ||||||||
matricer |
| ||||||||
Andet |