Descompunerea LUP

LUP-descomposition ( LUP -descomposition) - reprezentarea unei matrice date ca produs o matrice de permutare obținută din matricea de identitate prin permutarea rândurilor sau coloanelor. O astfel de descompunere poate fi efectuată pentru orice matrice nedegenerată . Descompunerea LUP este utilizată pentru a calcula matricea inversă într-o schemă compactă, pentru a calcula soluția unui sistem de ecuații liniare. În comparație cu algoritmul de descompunere LU , algoritmul de descompunere LUP poate gestiona orice matrice nedegenerată și, în același timp, are o stabilitate de calcul mai mare .

Algoritmul de descompunere LUP

Să , , . În practică, de regulă, în locul matricei de permutare P se folosește un vector de permutare, obținut din vector prin permutarea elementelor corespunzătoare numerelor de rând permutate în matricea P. De exemplu, dacă

atunci , deoarece matricea P se obține prin interschimbarea primului și al doilea rând. Calculul expansiunii LUP se realizează în mai mulți pași. Fie matricea C = A. La fiecare pas i-a, mai întâi, se caută un element de referință (conducător) — elementul cu modulul maxim dintre elementele coloanei i-a care nu sunt mai mari decât rândul i-a , după care rândul cu elementul pivot este schimbat cu linia i-a. În același timp, se efectuează același schimb în matricea P. În acest caz, dacă matricea este nesingulară, atunci elementul de referință este garantat a fi diferit de zero. După aceea, toate elementele coloanei i-a actuale de sub rândul i-a sunt împărțite la pivot. În plus, din toate elementele situate sub i-lea rând și i-a coloană (adică, astfel încât j>i și k>i), produsul este scăzut . După aceea, contorul i este incrementat cu unu și procesul se repetă până când i<n unde n este dimensiunea matricei originale. După ce toți pașii sunt finalizați, matricea C va fi următoarea sumă:

unde E este matricea de identitate .

Algoritmul folosește trei bucle liniare imbricate, astfel încât complexitatea generală a algoritmului poate fi estimată ca O( n ³).

Implementarea algoritmului în C++

Mai jos este codul de program al algoritmului de mai sus în C++. Aici Matrix este un container care acceptă operația de indexare. Vă rugăm să rețineți că numărătoarea inversă este de la zero, nu de la unu.

void LUP ( const Matrix & A , Matrix & C , Matrix & P ) { //n - dimensiunea matricei originale const int n = A . Rânduri (); C = A ; //încărcați în matricea P matricea de identitate P = IdentityMatrix (); pentru ( int i = 0 ; i < n ; i ++ ) { //căutați un pivot dublu pivotValue = 0 ; int pivot = -1 ; pentru ( int rând = i ; rând < n ; rând ++ ) { if ( fabs ( C [ rând ][ i ]) > pivotValue ) { pivotValue = fabs ( C [ rând ][ i ]); pivot = rând ; } } if ( pivotValue != 0 ) { //schimba linia i-a și linia cu elementul de referință P . SwapRows ( pivot , i ); C. _ SwapRows ( pivot , i ); pentru ( int j = i + 1 ; j < n ; j ++ ) { C [ j ][ i ] /= C [ i ][ i ]; pentru ( int k = i + 1 ; k < n ; k ++ ) C [ j ][ k ] -= C [ j ][ i ] * C [ i ][ k ]; } } } } //acum matricea C = L + U - E

Literatură

  • Kormen, T. , Leizerson, C. , Rivest, R. , Stein, K. Algorithms: construction and analysis = Introduction to Algorithms / Ed. I. V. Krasikova. - Ed. a II-a. - M. : Williams, 2005. - 1296 p. — ISBN 5-8459-0857-4 .