LUP-decomposition ( LUP -decomposition) - tietyn matriisin esitys tuotteena permutaatiomatriisi, joka saadaan identiteettimatriisista permutoimalla rivejä tai sarakkeita. Tällainen hajottaminen voidaan suorittaa mille tahansa ei- degeneroituneelle matriisille. LUP-hajottelua käytetään käänteismatriisin laskemiseen kompaktissa kaaviossa, lineaarisen yhtälöjärjestelmän ratkaisun laskemiseen. LU -hajotusalgoritmiin verrattuna LUP-hajotusalgoritmi pystyy käsittelemään mitä tahansa ei-singulaarisia matriiseja ja samalla sillä on korkeampi laskennallinen vakaus.
Anna , , . Käytännössä permutaatiomatriisin P sijasta käytetään pääsääntöisesti permutaatiovektoria, joka saadaan vektorista permutoimalla matriisissa P permutoituja rivinumeroita vastaavat elementit. Jos esim.
sitten , koska matriisi P saadaan vaihtamalla ensimmäinen ja toinen rivi. LUP-laajennuksen laskenta suoritetaan useissa vaiheissa. Olkoon matriisi C = A. Jokaisessa i:nnessä vaiheessa etsitään ensin viiteelementti (johtava) - elementti, jonka moduuli on suurin niistä i:nnen sarakkeen elementeistä, jotka eivät ole korkeampia kuin i. rivi , jonka jälkeen pivot-elementin rivi vaihdetaan i:nnen rivin kanssa. Samanaikaisesti sama vaihto suoritetaan matriisissa P. Tässä tapauksessa, jos matriisi on ei-singulaarinen, referenssielementti on taatusti erilainen kuin nolla. Sen jälkeen kaikki nykyisen i:nnen sarakkeen elementit i:nnen rivin alapuolella jaetaan pivotilla. Lisäksi kaikista elementeistä, jotka sijaitsevat i:nnen rivin ja i:nnen sarakkeen alapuolella (eli siten, että j>i ja k>i), tulo vähennetään . Tämän jälkeen laskuria i kasvatetaan yhdellä ja prosessia toistetaan kunnes i<n missä n on alkuperäisen matriisin dimensio. Kun kaikki vaiheet on suoritettu, matriisi C on seuraava summa:
missä E on identiteettimatriisi .
Algoritmi käyttää kolmea sisäkkäistä lineaarisilmukkaa, joten algoritmin kokonaismonimutkaisuus voidaan arvioida muodossa O( n ³).
Alla on yllä olevan algoritmin ohjelmakoodi C++:ssa. Tässä Matrix on kontti, joka tukee indeksointitoimintoa. Huomaa, että lähtölaskenta on nollasta, ei yhdestä.
void LUP ( const Matrix & A , Matrix & C , Matrix & P ) { //n - alkuperäisen matriisin ulottuvuus const int n = A . Rivit (); C = A ; //lataa matriisiin P identiteettimatriisi P = IdentityMatrix (); for ( int i = 0 ; i < n ; i ++ ) { //hae pivot double pivotValue = 0 ; int pivot = -1 ; for ( int rivi = i ; rivi < n ; rivi ++ ) { if ( fabs ( C [ rivi ][ i ]) > pivotValue ) { pivotValue = fabs ( C [ rivi ][ i ]); pivot = rivi ; } } if ( pivotValue != 0 ) { //vaihtaa i:nnen rivin ja rivin viiteelementillä 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 ]; } } } } //nyt matriisi C = L + U - EVektorit ja matriisit | |||||||||
---|---|---|---|---|---|---|---|---|---|
Vektorit |
| ||||||||
matriiseja |
| ||||||||
Muut |