Rozklad LU - LU decomposition

V numerické analýze a lineární algebře , nižší-horní ( LU ), rozklad nebo faktorizace faktorů A matrici jako produkt nižší trojúhelníkovou matici a horní trojúhelníkovou matici. Produkt někdy obsahuje také permutační matici . Rozklad LU lze považovat za maticovou formu Gaussovy eliminace . Počítače obvykle řeší čtvercové systémy lineárních rovnic pomocí dekompozice LU a je také klíčovým krokem při invertování matice nebo výpočtu determinantu matice. Rozklad LU zavedl polský matematik Tadeusz Banachiewicz v roce 1938.

Definice

LDU rozklad Walshovy matice

Nechť A je čtvercová matice. LU faktorizace odkazuje na faktorizace A , se správnou řádků a / nebo sloupců orderings nebo obměn, do dvou faktorů - nižší trojúhelníková matice L a horní trojúhelníkovou matici U :

V dolní trojúhelníkové matici jsou všechny prvky nad úhlopříčkou nulové, v horní trojúhelníkové matici jsou všechny prvky pod úhlopříčkou nulové. Například pro matici 3 × 3 A vypadá její rozklad LU takto:

Bez řádného uspořádání nebo permutací v matici se faktorizace nemusí zhmotnit. Například je snadné ověřit (rozšířením maticového násobení), že . Pokud , pak alespoň jeden z a musí být nula, což znamená, že buď L nebo U je singulární . To je nemožné, pokud A je nesingulární (invertibilní). Jedná se o procesní problém. Lze jej odstranit jednoduchým přeuspořádáním řádků A tak, aby první prvek permutované matice byl nenulový. Stejný problém v následných faktorizačních krocích lze odstranit stejným způsobem; viz základní postup níže.

Faktorizace LU s částečným otáčením

Ukazuje se, že pro faktorizaci LU stačí správná permutace v řádcích (nebo sloupcích). Faktorizace LU s částečným otáčením (LUP) často odkazuje na faktorizaci LU pouze s permutacemi řádků:

kde L a U jsou opět spodní a horní trojúhelníkové matice, a P je permutace matice , která při ponechání násobený na A , přeřadí řádky A . Ukazuje se, že všechny čtvercové matice lze v této formě faktorizovat a faktorizace je v praxi numericky stabilní. Díky tomu je rozklad LUP užitečnou technikou v praxi.

Faktorizace LU s plným otáčením

LU faktorizace s plnou otáčení zahrnuje jak řádků a sloupců obměny:

kde L , U a P mají výše uvedený význam, a Q je permutací matice, která mění pořadí sloupců A .

Rozklad dolní diagonální-horní (LDU)

Nižší diagonální-horní (LDU) rozklad je rozklad podobě

kde D je diagonální matice a L a U jsou unitriangulární matice , což znamená, že všechny položky na diagonálech L a U jsou jedna.

Obdélníkové matice

Výše jsme požadovali, aby A byla čtvercová matice, ale tyto dekompozice lze také zobecnit na obdélníkové matice. V tom případě, L a D jsou čtvercové matice, které oba mají stejný počet řádků jako A , a U má přesně stejné rozměry jako A . Horní trojúhelníkový by měl být interpretován tak, že má pouze nulové záznamy pod hlavní úhlopříčkou, která začíná v levém horním rohu. Stejně tak přesnější termín pro U je, že se jedná o „řádek sledu forma“ matice A .

Příklad

Faktorizujeme následující matici 2 na 2:

Jedním ze způsobů, jak najít rozklad LU této jednoduché matice, by bylo jednoduše vyřešit lineární rovnice kontrolou. Rozšiřování násobení matice dává

Tento systém rovnic je poddeterminovaný . V tomto případě jsou libovolné dva nenulové prvky matic L a U parametry řešení a lze je libovolně nastavit na libovolnou nenulovou hodnotu. Abychom našli jedinečný rozklad LU, je nutné dát určité omezení na matice L a U. Například můžeme pohodlně požadovat, aby spodní trojúhelníková matice L byla jednotková trojúhelníková matice (tj. Nastavila všechny položky její hlavní úhlopříčky na jedničky). Pak má soustava rovnic následující řešení:

Substituce těchto hodnot do LU rozkladu nad výtěžky

Existence a jedinečnost

Čtvercové matice

Jakákoli čtvercová matice připouští faktorizace LUP a PLU . Pokud je nevratný , pak připouští faktorizaci LU (nebo LDU ) právě tehdy, pokud jsou všichni jeho hlavní hlavní nezletilí nenulové. Pokud je singulární matice hodnosti , pak připouští faktorizaci LU, pokud jsou první přední hlavní nezletilí nenulové, ačkoli opak není pravdivý.

Pokud má čtvercová, invertibilní matice LDU (faktorizace se všemi diagonálními vstupy L a U rovnou 1), pak je faktorizace jedinečná. V takovém případě je faktorizace LU také jedinečná, pokud požadujeme, aby úhlopříčka (nebo ) sestávala z jedniček.

Symetrické matice s jednoznačnou pozitivitou

Pokud je symetrický (nebo Hermitian , pokud je komplex) pozitivně definitní matice , můžeme zajistit věci, takže U je konjugovat přemístit z L . To znamená, že můžeme napsat A jako

Tento rozklad se nazývá Choleskyho rozklad . Rozklad Cholesky vždy existuje a je jedinečný - za předpokladu, že je matice kladně definitivní. Kromě toho je výpočet Choleskyho dekompozice efektivnější a numericky stabilnější než výpočet některých jiných dekompozic LU.

Obecné matice

Pro (ne nutně invertibilní) matici v jakémkoli poli jsou známy přesné nezbytné a dostatečné podmínky, za kterých má LU faktorizaci. Podmínky jsou vyjádřeny v řadách určitých dílčích matic. Na tento nejobecnější případ byl také rozšířen Gaussův eliminační algoritmus pro získání dekompozice LU.

Algoritmy

Uzavřený vzorec

Pokud existuje LDU faktorizace a je jedinečný, je uzavřený (explicitní) vzorec pro prvky L , D , a U , pokud jde o poměry determinant některých submatic původní matice A . Zejména, and for , je poměr -th hlavní submatice k -th hlavní submatice. Výpočet determinantů je výpočetně nákladný , proto se tento explicitní vzorec v praxi nepoužívá.

Pomocí Gaussovy eliminace

Následující algoritmus je v podstatě upravenou formou Gaussovy eliminace . Výpočet dekompozice LU pomocí tohoto algoritmu vyžaduje operace s plovoucí desetinnou čárkou, ignorování výrazů nižšího řádu. Částečné otáčení přidává pouze kvadratický výraz; toto neplatí pro úplné otočení.

Vzhledem k matici N × N definujte .

Eliminujeme maticové prvky pod hlavní úhlopříčkou v n -tém sloupci A ( n −1) tak, že do i -tého řádku této matice přičteme n -tý řádek vynásobený

To lze provést vynásobením A ( n  - 1) vlevo spodní trojúhelníkovou maticí

tj. matice identity N × N s jejím n -tým sloupcem nahrazeným vektorem

Jsme si stanovili

Po N  - 1 krocích jsme eliminovali všechny maticové prvky pod hlavní úhlopříčkou, takže získáme horní trojúhelníkovou matici A ( N  - 1) . Nacházíme rozklad

Horní trojúhelníkovou matici A ( N  - 1) označte U , a . Protože inverze nižší trojúhelníkové matice L n je opět nižší trojúhelníková matice a násobení dvou nižších trojúhelníkových matic je opět nižší trojúhelníková matice, vyplývá z toho, že L je nižší trojúhelníková matice. Navíc je to vidět

Získáváme

Je jasné, že aby tento algoritmus fungoval, musí mít každý krok (viz definice ). Pokud tento předpoklad v určitém okamžiku selže, je třeba před pokračováním vyměnit n -tý řádek s dalším řádkem pod ním. Z tohoto důvodu vypadá rozklad LU obecně .

Rozklad získaný tímto postupem je Doolittlův rozklad : hlavní úhlopříčka L se skládá pouze z 1 s. Pokud bychom postupovali odstraněním prvků nad hlavní úhlopříčkou přidáním násobků sloupců (namísto odebírání prvků pod úhlopříčkou přidáním násobků řádků ), získali bychom Croutův rozklad , kde hlavní úhlopříčka U je 1 s .

Další (ekvivalent) způsob výroby Crout rozklad dané matice A je získat Doolittle rozklad přemístit A . Pokud je dekompozice LU získána pomocí algoritmu uvedeného v této části, pak pomocí a máme, že je to Croutův rozklad.

Prostřednictvím rekurze

Cormen a kol. popsat rekurzivní algoritmus pro rozklad LUP.

Vzhledem k matici A nechť P 1 je taková permutační matice

,

kde , pokud je v prvním sloupci A nenulový záznam ; nebo jinak vezměte P 1 jako matici identity. Nyní nechť , pokud ; nebo jinak. My máme

Nyní můžeme rekurzivně najít rozklad LUP . Nech . Proto

což je LUP rozklad A .

Randomizovaný algoritmus

Je možné najít aproximaci nízké hodnosti k rozkladu LU pomocí randomizovaného algoritmu. Vzhledem k tomu, vstupní matrici a požadovanou nízkou hodnost , randomizované LU vrátí permutační matrice a spodní / horní trapézové matice o velikosti a příslušně, tak, že s velkou pravděpodobností , kde je konstanta, která závisí na parametrech algoritmu a je tého singulární hodnota vstupní matice .

Teoretická náročnost

Pokud lze v čase M ( n ) vynásobit dvě matice řádu n , kde M ( n ) ≥ n a pro nějaké n > 2, pak lze rozklad LU vypočítat v čase O ( M ( n )). To například znamená, že existuje algoritmus O ( n 2,376 ) založený na algoritmu Coppersmith – Winograd .

Rozklad řídké matice

Byly vyvinuty speciální algoritmy pro faktorizaci velkých řídkých matic . Tyto algoritmy pokoušejí najít řídké faktory L a U . V ideálním případě jsou náklady na výpočet určeny spíše počtem nenulových záznamů než velikostí matice.

Tyto algoritmy využívají svobodu pro výměnu řádků a sloupců k minimalizaci vyplňování (položky, které se během provádění algoritmu mění z počáteční nuly na nenulovou hodnotu).

Obecné zacházení s objednávkami, které minimalizují vyplňování, lze řešit pomocí teorie grafů .

Aplikace

Řešení lineárních rovnic

Daný soustavou lineárních rovnic ve formě matice

chceme vyřešit rovnici pro x , danou A a b . Předpokládejme, že jsme již získali LUP rozklad A tak, že , takže .

V tomto případě se řešení provádí ve dvou logických krocích:

  1. Nejprve vyřešíme rovnici pro y .
  2. Za druhé, řešíme rovnici pro x .

V obou případech máme co do činění s trojúhelníkovými maticemi ( L a U ), které lze vyřešit přímo dopřednou a zpětnou substitucí bez použití Gaussova eliminačního procesu (nicméně tento proces nebo ekvivalent potřebujeme k výpočtu samotného rozkladu LU ).

Výše uvedený postup lze opakovaně použít k řešení rovnice vícekrát pro různá b . V tomto případě je rychlejší (a pohodlnější) provést LU rozklad matice A jednou a poté vyřešit trojúhelníkové matice pro různá b , namísto použití Gaussovy eliminace pokaždé. O matricích L a U by se dalo předpokládat, že „zakódovaly“ Gaussův eliminační proces.

Náklady na řešení soustavy lineárních rovnic jsou přibližně operace s pohyblivou řádovou čárkou, pokud má matice velikost . Díky tomu je dvakrát rychlejší než algoritmy založené na dekompozici QR , která stojí za použití operací s plovoucí desetinnou čárkou při použití odrazů Householder . Z tohoto důvodu je obvykle preferován rozklad LU.

Invertování matice

Při řešení soustavy rovnic, b je obvykle považován za vektor s délkou, která se rovná výšce matice A . V inverzi matice však místo vektoru b máme matici B , kde B je matice n -by -p , takže se snažíme najít matici X (také matici n -by -p ):

Pro řešení pro každý sloupec matice X můžeme použít stejný algoritmus, který byl uveden dříve . Nyní předpokládejme, že B je matice identity velikosti n . Vyplývalo by z toho, že výsledek X musí být inverzní A .

Výpočet determinantu

Vzhledem k rozkladu LUP čtvercové matice A lze determinant A vypočítat přímo jako

Druhá rovnice vyplývá ze skutečnosti, že determinant trojúhelníkové matice je jednoduše součin jejích diagonálních záznamů a že determinant permutační matice je roven (−1) S, kde S je počet výměn řádků při rozkladu .

V případě dekompozice LU s plným otáčením se také rovná pravé straně výše uvedené rovnice, pokud necháme S být celkový počet výměn řádků a sloupců.

Stejná metoda snadno platí pro rozklad LU nastavením P rovným matici identity.

Příklady kódu

Příklad kódu C.

/* INPUT: A - array of pointers to rows of a square matrix having dimension N
 *        Tol - small tolerance number to detect failure when the matrix is near degenerate
 * OUTPUT: Matrix A is changed, it contains a copy of both matrices L-E and U as A=(L-E)+U such that P*A=L*U.
 *        The permutation matrix is not stored as a matrix, but in an integer vector P of size N+1 
 *        containing column indexes where the permutation matrix has "1". The last element P[N]=S+N, 
 *        where S is the number of row exchanges needed for determinant computation, det(P)=(-1)^S    
 */
int LUPDecompose(double **A, int N, double Tol, int *P) {

    int i, j, k, imax; 
    double maxA, *ptr, absA;

    for (i = 0; i <= N; i++)
        P[i] = i; //Unit permutation matrix, P[N] initialized with N

    for (i = 0; i < N; i++) {
        maxA = 0.0;
        imax = i;

        for (k = i; k < N; k++)
            if ((absA = fabs(A[k][i])) > maxA) { 
                maxA = absA;
                imax = k;
            }

        if (maxA < Tol) return 0; //failure, matrix is degenerate

        if (imax != i) {
            //pivoting P
            j = P[i];
            P[i] = P[imax];
            P[imax] = j;

            //pivoting rows of A
            ptr = A[i];
            A[i] = A[imax];
            A[imax] = ptr;

            //counting pivots starting from N (for determinant)
            P[N]++;
        }

        for (j = i + 1; j < N; j++) {
            A[j][i] /= A[i][i];

            for (k = i + 1; k < N; k++)
                A[j][k] -= A[j][i] * A[i][k];
        }
    }

    return 1;  //decomposition done 
}

/* INPUT: A,P filled in LUPDecompose; b - rhs vector; N - dimension
 * OUTPUT: x - solution vector of A*x=b
 */
void LUPSolve(double **A, int *P, double *b, int N, double *x) {

    for (int i = 0; i < N; i++) {
        x[i] = b[P[i]];

        for (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[i] /= A[i][i];
    }
}

/* INPUT: A,P filled in LUPDecompose; N - dimension
 * OUTPUT: IA is the inverse of the initial matrix
 */
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];
        }
    }
}

/* INPUT: A,P filled in LUPDecompose; N - dimension. 
 * OUTPUT: Function returns the determinant of the initial matrix
 */
double LUPDeterminant(double **A, int *P, int N) {

    double det = A[0][0];

    for (int i = 1; i < N; i++)
        det *= A[i][i];

    return (P[N] - N) % 2 == 0 ? det : -det;
}


Příklad kódu C#

public class SystemOfLinearEquations
{
    public double[] SolveUsingLU(double[,] matrix, double[] rightPart, int n)
    {
        // decomposition of matrix
        double[,] lu = new double[n, n];
        double sum = 0;
        for (int i = 0; i < n; i++)
        {
            for (int j = i; j < n; j++)
            {
                sum = 0;
                for (int k = 0; k < i; k++)
                    sum += lu[i, k] * lu[k, j];
                lu[i, j] = matrix[i, j] - sum;
            }
            for (int j = i + 1; j < n; j++)
            {
                sum = 0;
                for (int k = 0; k < i; k++)
                    sum += lu[j, k] * lu[k, i];
                lu[j, i] = (1 / lu[i, i]) * (matrix[j, i] - sum);
            }
        }

        // lu = L+U-I
        // find solution of Ly = b
        double[] y = new double[n];
        for (int i = 0; i < n; i++)
        {
            sum = 0;
            for (int k = 0; k < i; k++)
                sum += lu[i, k] * y[k];
            y[i] = rightPart[i] - sum;
        }
        // find solution of Ux = y
        double[] x = new double[n];
        for (int i = n - 1; i >= 0; i--)
        {
            sum = 0;
            for (int k = i + 1; k < n; k++)
                sum += lu[i, k] * x[k];
            x[i] = (1 / lu[i, i]) * (y[i] - sum);
        }
        return x;
    }
}

Příklad kódu MATLAB

function LU = LUDecompDoolittle(A)
    n = length(A);
    LU = A;
    % decomposition of matrix, Doolittle’s Method
    for i = 1:1:n
        for j = 1:(i - 1)
            LU(i,j) = (LU(i,j) - LU(i,1:(j - 1))*LU(1:(j - 1),j)) / LU(j,j);
        end
        j = i:n;
        LU(i,j) = LU(i,j) - LU(i,1:(i - 1))*LU(1:(i - 1),j);
    end
    %LU = L+U-I
end

function x = SolveLinearSystem(LU, B)
    n = length(LU);
    y = zeros(size(B));
    % find solution of Ly = B
    for i = 1:n
        y(i,:) = B(i,:) - L(i,1:i)*y(1:i,:);
    end
    % find solution of Ux = y
    x = zeros(size(B));
    for i = n:(-1):1
        x(i,:) = (y(i,:) - U(i,(i + 1):n)*x((i + 1):n,:))/U(i, i);
    end    
end

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

Viz také

Poznámky

Reference

externí odkazy

Reference

Počítačový kód

Online zdroje