Factorizarea Cholesky#

Schimbăm un pic macazul și discutăm despre o factorizare LU ce necesită o prezumție suplimentară, și anume că matricea de factorizat este simetrică și pozitivă.

Dacă nu ați parcurs deja secțiunea introductivă, acum este momentul!

Explicația algoritmului#

De data aceasta, vom începe cu o matrice pătratică, simetrică și pozitiv-definită \(A\in\mathbb{R}^{n\times n}\) cu \(n\) linii și \(n\) coloane, \(n\in\mathbb{N}^*\), pentru care vrem să calculăm o factorizare LU.

Matrice pozitiv-definită

Considerăm o matrice \(M\in\mathbb{R}^{n\times n}\), \(n\in\mathbb{N}^*\), pozitiv-definită dacă, pentru orice vector coloană \(\bm{x}\in\mathbb{R}^n\), se respectă relația:

\[\bm{x^T}M\bm{x}\gt 0\]

În practică, nu se aplică direct această definiție, ci se utilizează faptul că matricea \(M\) este pozitiv-definită dacă și numai dacă toate valorile sale proprii sunt pozitive.

Vom discuta mai pe larg în cadrul capitolului despre valori proprii.

Evident, fiind o matrice simetrică, \(A=A^T\), așadar, o factorizare \(A=LU\) va avea proprietatea că:

\[ \begin{cases} A^T=(LU)^T=U^TL^T\\ A=A^T \end{cases} \Rightarrow LU=U^TL^T \]

Este însă evident că, prin transpunerea unei matrice superior triunghiulare, se va obține o matrice inferior triunghiulară (și invers). Ajungem deci la concluzia că:

\[\boxed{L=U}\]

Așadar, factorizarea Cholesky își propune să găsească o singură matrice inferior triunghiulară \(L\in\mathbb{R}^{n\times n}\) astfel încât \(A=LL^T\):

\[ \boxed{ A\,=\,\begin{bmatrix} l_{11} & 0 & \dots & 0 \\ l_{21} & l_{22} & \dots & 0 \\ \vdots & \vdots & & \vdots\\ l_{n1} & l_{n2} & \dots & l_{nn} \end{bmatrix} \begin{bmatrix} l_{11} & l_{21} & \dots & l_{n1} \\ 0 & l_{22} & \dots & l_{n2} \\ \vdots & \vdots & & \vdots\\ 0 & 0 & \dots & l_{nn} \end{bmatrix} } \]

Exemplificarea algoritmului#

Din nefericire, nu putem exemplifica algoritmul cu aceeași matrice în încercarea de a compara rezultatul factorizărilor diferite, deoarece matricea respectivă nu era simetrică.

Vom utiliza deci o nouă matrice \(A = \begin{bmatrix} 4 & 12 & 16 \\ 12 & 37 & 43 \\ 16 & 43 & 98 \end{bmatrix}\) și \(A=LL^T\) descompunerea LU de tip Cholesky, unde \(L\) este o matrice inferior triunghiulară. Se formează așadar ecuația:

\[ \begin{bmatrix} 4 & 12 & 16 \\ 12 & 37 & 43 \\ 16 & 43 & 98 \end{bmatrix} = \begin{bmatrix} l_{11} & 0 & 0 \\ l_{21} & l_{22} & 0 \\ l_{31} & l_{32} & l_{33} \end{bmatrix} \begin{bmatrix} l_{11} & l_{21} & l_{31} \\ 0 & l_{22} & l_{32} \\ 0 & 0 & l_{33} \end{bmatrix} \]

Asemănător cu ce am studiat deja, calculul pe hârtie presupune executarea înmuțirii:

\[ \begin{bmatrix} 4 & 12 & 16 \\ 12 & 37 & 43 \\ 16 & 43 & 98 \end{bmatrix} = \begin{bmatrix} l_{11}^2 & l_{11}l_{21} & l_{11}l_{31} \\ l_{11}l_{21} & l_{21}^2+l_{22}^2 & l_{21}l_{31}+l_{22}l_{32} \\ l_{11}l_{31} & l_{21}l_{31}+l_{22}l_{32} & l_{31}^2+l_{32}^2+l_{33}^2 \end{bmatrix} \]

Sărind peste calcule, ajungem la următorul rezultat:

\[ \begin{bmatrix} 4 & 12 & 16 \\ 12 & 37 & 43 \\ 16 & 43 & 98 \end{bmatrix} = \begin{bmatrix} 2 & 0 & 0 \\ 6 & 1 & 0 \\ 8 & -5 & 3 \end{bmatrix} \begin{bmatrix} 2 & 6 & 8 \\ 0 & 1 & -5 \\ 0 & 0 & 3 \end{bmatrix} \]

Deducerea algoritmului#

Înarmați cu intuiția dobândită pentru celelalte factorizări, vom observa că Cholesky este mult mai ușor de realizat. Să mai aruncăm un ochi pe descompunerea precedentă:

\[ \begin{bmatrix} l_{11}^2 & l_{11}l_{21} & l_{11}l_{31} \\ l_{11}l_{21} & l_{21}^2+l_{22}^2 & l_{21}l_{31}+l_{22}l_{32} \\ l_{11}l_{31} & l_{21}l_{31}+l_{22}l_{32} & l_{31}^2+l_{32}^2+l_{33}^2 \end{bmatrix} \]

Se observă cu ochiul liber că avem două tipuri de valori:

  • Valori aflate pe diagonala principală;

  • Valori afalte sub diagonala principală.

Tot ce se află deasupra diagonalei principale poate fi ignorat, întrucât factorizarea este simetrică. Dacă urmărim dependențele variabilelor, constatăm că acestea trebuiesc tratate în ordinea:

\[l_{11}\rightarrow l_{21}\rightarrow l_{22}\rightarrow l_{31}\rightarrow l_{32}\rightarrow l_{33}\]

Mult mai simplu, nu?

Să încercăm acum să scriem un algoritm pentru factorizarea Cholesky.

Sintetizarea algoritmului#

Pentru fiecare linie \(i\in\overline{1,n}\) (în ordinea lor firească), ne plimbăm de la stânga la dreapta pe fiecare element \(l_{ij}\), \(j\in\overline{1,i}\):

  • Dacă \(i=j\) (valoare diagonală), obținem:

    \[l_{ii}^2=a_{ii}-\sum_{j=1}^{i-1}l_{ij}^2\]

    Aici apare o discuție referitoare la faptul că există două valori acceptate pentru \(l_{ii}\), anume \(\sqrt{l_{ii}^2}\) și \(-\sqrt{l_{ii}^2}\). Pentru simplitate, cerând ca diagonala principală să conțină doar valori pozitive, garantăm că factorizarea Cholesky este unică pentru orice matrice simetrică și pozitiv-definită:

    \[\boxed{l_{ii}=\sqrt{a_{ii}-\sum_{j=1}^{i-1}l_{ij}^2}}\]
  • Dacă \(i\neq j\) (valoare non-diagonală), ajungem la următoarea relație:

    \[\boxed{l_{ij}=\frac{1}{l_{jj}}\left(a_{ij}-\sum_{k=1}^{j-1}l_{ik} l_{jk}\right)}\]
Demonstrația formulelor

Puteți să vă convingeți că aceste formule sunt corecte testând pe câteva exemple. Dacă sunteți suficient de ambițioși, puteți să încercați să schițați o demonstrație.

Cod ilustrativ#

Avem tot ce ne trbuie pentru a implementa factorizarea Cholesky (sub forma funcției Cholesky). Presupunând că notăm cu A matricea pe care încercăm să o factorizăm, vom folosi codul de mai jos.

Funcția returnează matricea inferior triunghiulară L, ce are ca proprietate că factorizează LU matricea \(A\), adică \(A=LL^T\).

function L = Cholesky(A)
    [n, n] = size(A);
    L = zeros(n);

    for i = [1 : n]
        % Valorile non-diagonale
        for j = [1 : i-1]
            S = 0;
            for k = [1 : j-1]
                S += L(i,k) * L(j,k);
            end
            L(i,j) = (A(i,j) - S) / L(j,j);
        end
        % Valorile diagonale
        S = 0;
        for j = [1 : i-1]
            S += L(i,j) * L(i,j);
        end
        L(i,i) = sqrt(A(i,i) - S);
    end
end

Licență#

The book "Metode Numerice", written by Valentin-Ioan Vintilă, is licensed under CC BY-NC-SA 4.0