Salta al contenuto
Note per Studenti Fattorizzazione LU, pivoting e Cholesky

Fattorizzazione LU, pivoting e Cholesky

In questa pagina 6

I sistemi lineari Ax=bA\mathbf x=\mathbf b sono il cuore del calcolo scientifico: l'analisi di una struttura agli elementi finiti ha migliaia di incognite (gli spostamenti dei nodi), un circuito o una rete idraulica hanno una equazione per nodo, una discretizzazione di un'equazione differenziale ne ha una per punto della griglia. L'Eliminazione di GaussCon tre operazioni elementari sulle righe (scambio, moltiplicazione per uno scalare non nullo, somma di un multiplo di un'altra riga) ogni matrice si riduce a scala senza cambiare il rango; serve a calcolare ranghi, risolvere sistemi, trovare relazioni di dipendenza e matrici che riducono a scala.Eliminazione di Gauss → risolve il sistema, ma nella forma vista in algebra «lavora» sulla matrice e sul termine noto insieme: se il termine noto cambia (stessa struttura, carichi diversi) bisogna rifare tutto. La fattorizzazione LU separa il lavoro costoso (sulla matrice) da quello economico (sul termine noto).

Prerequisiti: Eliminazione di GaussCon tre operazioni elementari sulle righe (scambio, moltiplicazione per uno scalare non nullo, somma di un multiplo di un'altra riga) ogni matrice si riduce a scala senza cambiare il rango; serve a calcolare ranghi, risolvere sistemi, trovare relazioni di dipendenza e matrici che riducono a scala.Eliminazione di Gauss →, Operazioni tra matriciLe matrici m×n formano uno spazio vettoriale (somma e prodotto per scalare elemento per elemento); il prodotto righe per colonne corrisponde alla composizione di funzioni lineari, è associativo ma non commutativo; la trasposta scambia righe e colonne e (AB)^T = B^T A^T.Operazioni tra matrici →, Matrice inversaL'inversa di una matrice quadrata A è la matrice A⁻¹ con A A⁻¹ = A⁻¹ A = I; esiste se e solo se rango(A) = n e si calcola con Gauss-Jordan riducendo (A | I) fino a (I | A⁻¹).Matrice inversa → e Proprietà del determinante, Binet e LaplaceIl determinante è lineare in ogni riga, cambia segno scambiando due righe, non cambia sommando a una riga un multiplo di un'altra: così si calcola con Gauss riducendo a triangolare. Binet: det(AB) = det A · det B. Laplace: sviluppo lungo una riga o colonna con i complementi algebrici.Proprietà del determinante, Binet e Laplace →; per la perdita di cifre Aritmetica di macchina - floating point, precisione di macchina e cancellazioneUn calcolatore rappresenta solo un insieme finito di numeri F(β,t,L,U); ogni numero reale viene arrotondato con errore relativo al più u = ½β^(1−t) (u ≈ 1,1·10⁻¹⁶ in doppia precisione) e ogni operazione è esatta più un errore (1+δ), |δ| ≤ u. Conseguenze: overflow e underflow, somma non associativa, assorbimento, e soprattutto la cancellazione numerica nella differenza di numeri quasi uguali, che si evita riformulando l'espressione.Aritmetica di macchina - floating point, precisione di macchina e cancellazione →.

1. Gauss come fattorizzazione LU

Si trasforma AA in una matrice triangolare superiore UU con n−1n-1 passi. Al passo kk si sottrae dalla riga i>ki>k la riga kk moltiplicata per il moltiplicatore lik=aik(k)akk(k)(i=k+1,…,n),l_{ik}=\frac{a_{ik}^{(k)}}{a_{kk}^{(k)}}\qquad(i=k+1,\dots,n), dove aij(k)a^{(k)}_{ij} sono gli elementi dopo k−1k-1 passi e akk(k)a_{kk}^{(k)} è il pivot. Ogni passo equivale a moltiplicare a sinistra per una matrice elementare MkM_k (identità con −lik-l_{ik} nella colonna kk sotto la diagonale), quindi Mn−1⋯M1A=UM_{n-1}\cdots M_1A=U. Le inverse Mk−1M_k^{-1} si moltiplicano senza interferenze e danno A=LU,L=(1l211l31l321⋮⋱),U=(u11u12⋯u22⋯⋱).A=LU,\qquad L=\begin{pmatrix}1&&&\\l_{21}&1&&\\l_{31}&l_{32}&1&\\\vdots&&&\ddots\end{pmatrix},\qquad U=\begin{pmatrix}u_{11}&u_{12}&\cdots\\&u_{22}&\cdots\\&&\ddots\end{pmatrix}.

Procedura (risolvere Ax=bA\mathbf x=\mathbf b con LU).

  1. Si fattorizza A=LUA=LU (una volta sola, ≈23n3\approx\frac23n^3 flop).
  2. Sostituzione in avanti Ly=bL\mathbf y=\mathbf b: yi=bi−∑j<ilijyjy_i=b_i-\sum_{j<i}l_{ij}y_j (la diagonale di LL è 1, nessuna divisione).
  3. Sostituzione all'indietro Ux=yU\mathbf x=\mathbf y: xi=yi−∑j>iuijxjuiix_i=\dfrac{y_i-\sum_{j>i}u_{ij}x_j}{u_{ii}}, i=n,n−1,…,1i=n,n-1,\dots,1.

I passi 2 e 3 costano n2n^2 operazioni ciascuno: con la stessa matrice e rr termini noti diversi si fa una fattorizzazione sola e rr coppie di sostituzioni.

Esempio (a mano). A=(211433879)A=\begin{pmatrix}2&1&1\\4&3&3\\8&7&9\end{pmatrix}, b=(4,10,24)T\mathbf b=(4,10,24)^T (cioè x=(1,1,1)T\mathbf x=(1,1,1)^T).

  • Passo 1, pivot 22: l21=42=2l_{21}=\frac42=2, l31=82=4l_{31}=\frac82=4. Riga 2 −2⋅-2\cdot riga 1: (0, 3−2, 3−2)=(0,1,1)(0,\,3-2,\,3-2)=(0,1,1). Riga 3 −4⋅-4\cdot riga 1: (0, 7−4, 9−4)=(0,3,5)(0,\,7-4,\,9-4)=(0,3,5).
  • Passo 2, pivot 11: l32=31=3l_{32}=\frac31=3. Riga 3 −3⋅-3\cdot riga 2: (0,0,5−3)=(0,0,2)(0,0,5-3)=(0,0,2).

L=(100210431),U=(211011002).L=\begin{pmatrix}1&0&0\\2&1&0\\4&3&1\end{pmatrix},\qquad U=\begin{pmatrix}2&1&1\\0&1&1\\0&0&2\end{pmatrix}. Verifica del prodotto: riga 3 di LULU = 4⋅(2,1,1)+3⋅(0,1,1)+1⋅(0,0,2)=(8, 4+3, 4+3+2)=(8,7,9)4\cdot(2,1,1)+3\cdot(0,1,1)+1\cdot(0,0,2)=(8,\,4+3,\,4+3+2)=(8,7,9) ✓. Sostituzione in avanti: y1=4y_1=4; y2=10−2⋅4=2y_2=10-2\cdot4=2; y3=24−4⋅4−3⋅2=2y_3=24-4\cdot4-3\cdot2=2. All'indietro: x3=22=1x_3=\frac22=1; x2=2−1⋅11=1x_2=\frac{2-1\cdot1}1=1; x1=4−1⋅1−1⋅12=1x_1=\frac{4-1\cdot1-1\cdot1}2=1 ✓. Il determinante è det⁡A=det⁡L⋅det⁡U=1⋅(2⋅1⋅2)=4\det A=\det L\cdot\det U=1\cdot(2\cdot1\cdot2)=4.

Quando esiste. Ogni minore principale di testa AkA_k (le prime kk righe e colonne) si fattorizza come Ak=LkUkA_k=L_kU_k, quindi det⁡Ak=u11⋯ukk\det A_k=u_{11}\cdots u_{kk}.

Teorema. Se det⁡Ak≠0\det A_k\ne0 per k=1,…,n−1k=1,\dots,n-1, esiste un'unica fattorizzazione A=LUA=LU con LL a diagonale unitaria. I pivot sono ukk=det⁡Akdet⁡Ak−1u_{kk}=\dfrac{\det A_k}{\det A_{k-1}}.

Se un pivot si annulla l'algoritmo si ferma anche per una matrice invertibile: (0110)\begin{pmatrix}0&1\\1&0\end{pmatrix} non ha LU (a11=0a_{11}=0). Serve scambiare le righe.

Costo. Al passo kk si calcolano n−kn-k moltiplicatori e si aggiornano (n−k)2(n-k)^2 elementi: circa (n−k)2(n-k)^2 moltiplicazioni e altrettante addizioni. Sommando, ∑k=1n−1(n−k)2≈n33\sum_{k=1}^{n-1}(n-k)^2\approx\frac{n^3}3 moltiplicazioni e n33\frac{n^3}3 addizioni: 23n3\frac23n^3 flop. Per n=1000n=1000: 6,7⋅1086{,}7\cdot10^8 flop per la fattorizzazione e 2⋅1062\cdot10^6 per ogni risoluzione successiva. Lo stesso sistema con la formula di Cramer costerebbe ≈(n+1)!\approx(n+1)! operazioni: impraticabile già per n=20n=20.

Non calcolare mai l'inversa per risolvere un sistema: A−1A^{-1} costa ≈2n3\approx2n^3 flop (si risolvono nn sistemi) ed è meno accurata di LULU con sostituzioni.

2. Instabilità e pivoting

Il moltiplicatore lik=aikakkl_{ik}=\frac{a_{ik}}{a_{kk}} è grande quando il pivot è piccolo. In aritmetica di macchina (Aritmetica di macchina - floating point, precisione di macchina e cancellazioneUn calcolatore rappresenta solo un insieme finito di numeri F(β,t,L,U); ogni numero reale viene arrotondato con errore relativo al più u = ½β^(1−t) (u ≈ 1,1·10⁻¹⁶ in doppia precisione) e ogni operazione è esatta più un errore (1+δ), |δ| ≤ u. Conseguenze: overflow e underflow, somma non associativa, assorbimento, e soprattutto la cancellazione numerica nella differenza di numeri quasi uguali, che si evita riformulando l'espressione.Aritmetica di macchina - floating point, precisione di macchina e cancellazione →) questo distrugge l'informazione dei numeri «ordinari».

Esempio. ε=10−20\varepsilon=10^{-20} in doppia precisione (≈16\approx16 cifre decimali), sistema (ε111)(x1x2)=(12),soluzione esatta x1=11−ε≈1, x2=1−2ε1−ε≈1.\begin{pmatrix}\varepsilon&1\\1&1\end{pmatrix}\begin{pmatrix}x_1\\x_2\end{pmatrix}=\begin{pmatrix}1\\2\end{pmatrix},\qquad\text{soluzione esatta }x_1=\tfrac1{1-\varepsilon}\approx1,\ x_2=\tfrac{1-2\varepsilon}{1-\varepsilon}\approx1 . Senza scambi: l21=1ε=1020l_{21}=\frac1\varepsilon=10^{20}, u22=1−1020⋅1=−1020u_{22}=1-10^{20}\cdot1=-10^{20} (il 11 viene perso: 1020+110^{20}+1 in doppia precisione vale 102010^{20}), y2=2−1020⋅1=−1020y_2=2-10^{20}\cdot1=-10^{20}, x2=y2u22=1x_2=\frac{y_2}{u_{22}}=1, x1=1−1⋅1ε=0x_1=\frac{1-1\cdot1}{\varepsilon}=\mathbf 0. Il risultato x1=0x_1=0 è completamente sbagliato (esatto ≈1\approx1), anche se il sistema è ben condizionato. Scambiando le righe, il pivot è 11, l21=εl_{21}=\varepsilon, u22=1−ε≈1u_{22}=1-\varepsilon\approx1, y2=1−2ε≈1y_2=1-2\varepsilon\approx1 e si ottiene x=(1,1)x=(1,1) corretto.

Pivoting parziale. Al passo kk si cerca fra le righe i≥ki\ge k quella con ∣aik(k)∣|a_{ik}^{(k)}| massimo e la si scambia con la riga kk. Il risultato è PA=LUPA=LU, con PP matrice di permutazione e ∣lik∣≤1|l_{ik}|\le1.

Per ogni matrice invertibile esiste almeno un elemento non nullo in colonna sotto (o sulla) diagonale, quindi il procedimento non si blocca mai. Si risolve LUx=PbLU\mathbf x=P\mathbf b: si permuta il termine noto e poi si procede come prima. Il determinante è det⁡A=(−1)s∏ukk\det A=(-1)^s\prod u_{kk}, con ss numero di scambi.

Fattore di crescita. ρ=max⁡ijk∣aij(k)∣max⁡ij∣aij∣\rho=\dfrac{\max_{ijk}|a_{ij}^{(k)}|}{\max_{ij}|a_{ij}|}. Con pivoting parziale ρ≤2n−1\rho\le2^{n-1} (limite teorico raggiunto solo da matrici costruite apposta); in pratica ρ\rho è piccolo e l'algoritmo è stabile all'indietro: la soluzione calcolata risolve esattamente (A+δA)x^=b(A+\delta A)\hat{\mathbf x}=\mathbf b con ∥δA∥∥A∥≲nρ u\frac{\|\delta A\|}{\|A\|}\lesssim n\rho\,u, uu precisione di macchina. L'accuratezza finale dipende poi dal condizionamento di AA (Norme di matrici e condizionamento dei sistemi lineariNorme di vettore $|x|1=\sum|x_i|$, $|x|2=\sqrt{\sum x_i^2}$, $|x|\infty=\max|x_i|$. Norma di matrice indotta $|A|=\max{x\ne0}\frac{|Ax|}{|x|}$: $|A|1$ = massima somma per colonne, $|A|\infty$ = massima somma per righe, $|A|2=\sqrt{\lambda{\max}(A^TA)}$ (= $\rho(A)$ se $A$ simmetrica); valgono $|Ax|\le|A||x|$, $|AB|\le|A||B|$, $\rho(A)\le|A|$. Numero di condizionamento $\kappa(A)=|A||A^{-1}|\ge1$ ($\kappa_2=\frac{\sigma_{\max}}{\sigma_{\min}}$, per SPD $\frac{\lambda_{\max}}{\lambda_{\min}}$, per ortogonali 1). Se $A\mathbf x=\mathbf b$ e $A(\mathbf x+\delta\mathbf x)=\mathbf b+\delta\mathbf b$: $\frac{|\delta\mathbf x|}{|\mathbf x|}\le\kappa(A)\frac{|\delta\mathbf b|}{|\mathbf b|}$ (D); con residuo $\mathbf r=\mathbf b-A\hat{\mathbf x}$: $\frac1\kappa\frac{|\mathbf r|}{|\mathbf b|}\le\frac{|\mathbf x-\hat{\mathbf x}|}{|\mathbf x|}\le\kappa\frac{|\mathbf r|}{|\mathbf b|}$. Si perdono circa $\log_{10}\kappa$ cifre; un residuo piccolo non garantisce un errore piccolo se $\kappa$ è grande.Norme di matrici e condizionamento dei sistemi lineari →).

Esempio (a mano, con pivoting). A=(132421223)A=\begin{pmatrix}1&3&2\\4&2&1\\2&2&3\end{pmatrix}, b=(5,7,3)T\mathbf b=(5,7,3)^T (x=(1,2,−1)T\mathbf x=(1,2,-1)^T).

  • Passo 1: il massimo in valore assoluto della colonna 1 è 44 (riga 2): si scambiano le righe 1 e 2 (PP scambia 1 e 2): (421132223)\begin{pmatrix}4&2&1\\1&3&2\\2&2&3\end{pmatrix}. l21=14l_{21}=\frac14, l31=24=12l_{31}=\frac24=\frac12. Riga 2 −14-\frac14 riga 1: (0, 3−12, 2−14)=(0,2,5,1,75)(0,\ 3-\frac12,\ 2-\frac14)=(0,2{,}5,1{,}75). Riga 3 −12-\frac12 riga 1: (0, 2−1, 3−12)=(0,1,2,5)(0,\ 2-1,\ 3-\frac12)=(0,1,2{,}5).
  • Passo 2: fra 2,52{,}5 e 11 vince 2,52{,}5: nessuno scambio. l32=12,5=0,4l_{32}=\frac1{2{,}5}=0{,}4. Riga 3 −0,4-0{,}4 riga 2: (0,0, 2,5−0,4⋅1,75)=(0,0,1,8)(0,0,\ 2{,}5-0{,}4\cdot1{,}75)=(0,0,1{,}8).

P=(010100001),L=(1000,25100,50,41),U=(42102,51,75001,8).P=\begin{pmatrix}0&1&0\\1&0&0\\0&0&1\end{pmatrix},\quad L=\begin{pmatrix}1&0&0\\0{,}25&1&0\\0{,}5&0{,}4&1\end{pmatrix},\quad U=\begin{pmatrix}4&2&1\\0&2{,}5&1{,}75\\0&0&1{,}8\end{pmatrix}. Termine noto permutato: Pb=(7,5,3)TP\mathbf b=(7,5,3)^T. Avanti: y1=7y_1=7; y2=5−0,25⋅7=3,25y_2=5-0{,}25\cdot7=3{,}25; y3=3−0,5⋅7−0,4⋅3,25=−1,8y_3=3-0{,}5\cdot7-0{,}4\cdot3{,}25=-1{,}8. Indietro: x3=−1,81,8=−1x_3=\frac{-1{,}8}{1{,}8}=-1; x2=3,25−1,75⋅(−1)2,5=2x_2=\frac{3{,}25-1{,}75\cdot(-1)}{2{,}5}=2; x1=7−2⋅2−1⋅(−1)4=1x_1=\frac{7-2\cdot2-1\cdot(-1)}4=1 ✓. Determinante: det⁡A=(−1)1⋅4⋅2,5⋅1,8=−18\det A=(-1)^1\cdot4\cdot2{,}5\cdot1{,}8=-18 (un solo scambio).

3. Matrici simmetriche definite positive: Cholesky

Molte matrici dell'ingegneria sono simmetriche definite positive (SPD): la matrice di rigidezza di una struttura, la matrice delle equazioni normali dei minimi quadrati, la matrice di una conduzione termica discretizzata. Una matrice A=ATA=A^T è definita positiva se vTAv>0\mathbf v^TA\mathbf v>0 per ogni v≠0\mathbf v\ne\mathbf 0 (si veda Forme quadratiche e criteri di definitezzaUna forma quadratica q(h) = h^T M h (M simmetrica) è definita positiva se q>0 per h ≠ 0, semidefinita positiva se q ≥ 0, definita/semidefinita negativa con segni opposti, indefinita se cambia segno. In due variabili, con M = [[a,b],[b,c]]: definita positiva ⇔ det M > 0 e a > 0, definita negativa ⇔ det M > 0 e a < 0, indefinita ⇔ det M < 0 (D, completando il quadrato). In generale: segno degli autovalori di M (D, teorema spettrale): tutti > 0 definita positiva, tutti < 0 definita negativa, di segno diverso indefinita; inoltre q(h) ≥ λ_min |h|². Per n = 3 si usano i minori principali di Sylvester. È lo strumento per classificare i punti critici.Forme quadratiche e criteri di definitezza →): equivalentemente tutti gli autovalori sono positivi, oppure tutti i minori principali di testa det⁡Ak\det A_k sono positivi.

Teorema (Cholesky). Se AA è SPD esiste un'unica matrice triangolare inferiore LL con elementi diagonali positivi tale che A=LLTA=LL^T.

Uguagliando gli elementi di A=LLTA=LL^T (con j≤ij\le i) aij=∑k=1jlikljka_{ij}=\sum_{k=1}^jl_{ik}l_{jk} si ricavano per colonne  ljj=ajj−∑k=1j−1ljk2,lij=1ljj(aij−∑k=1j−1likljk) (i>j) \boxed{\,l_{jj}=\sqrt{a_{jj}-\sum_{k=1}^{j-1}l_{jk}^2},\qquad l_{ij}=\frac1{l_{jj}}\Big(a_{ij}-\sum_{k=1}^{j-1}l_{ik}l_{jk}\Big)\ (i>j)\,} Il radicando ajj−∑ljk2a_{jj}-\sum l_{jk}^2 è positivo proprio perché AA è definita positiva (è il rapporto det⁡Ajdet⁡Aj−1\frac{\det A_j}{\det A_{j-1}}): se compare un radicando ≤0\le0, la matrice non è SPD, ed è anche il test più economico per controllarlo.

Esempio. A=(422253236)A=\begin{pmatrix}4&2&2\\2&5&3\\2&3&6\end{pmatrix}. Minori di testa: 44, 4⋅5−4=164\cdot5-4=16, det⁡A=64\det A=64: tutti positivi, A è SPD.

  • Colonna 1: l11=4=2l_{11}=\sqrt4=2, l21=22=1l_{21}=\frac22=1, l31=22=1l_{31}=\frac22=1.
  • Colonna 2: l22=5−12=2l_{22}=\sqrt{5-1^2}=2, l32=3−l31l21l22=3−1⋅12=1l_{32}=\frac{3-l_{31}l_{21}}{l_{22}}=\frac{3-1\cdot1}2=1.
  • Colonna 3: l33=6−12−12=4=2l_{33}=\sqrt{6-1^2-1^2}=\sqrt4=2.

L=(200120112),det⁡A=(l11l22l33)2=82=64.L=\begin{pmatrix}2&0&0\\1&2&0\\1&1&2\end{pmatrix},\qquad\det A=(l_{11}l_{22}l_{33})^2=8^2=64 . Per risolvere Ax=bA\mathbf x=\mathbf b si usano Ly=bL\mathbf y=\mathbf b e LTx=yL^T\mathbf x=\mathbf y.

Vantaggi rispetto a LU. Costo 13n3\frac13n^3 flop (metà, si memorizza solo LL); nessun pivoting necessario e la stabilità è garantita (∣ljk∣2≤ajj|l_{jk}|^2\le a_{jj}: gli elementi non crescono); le matrici a banda mantengono la banda. Si può evitare la radice con la forma A=LDLTA=LDL^T (LL a diagonale unitaria, DD diagonale). Nel caso di una matrice tridiagonale (catena di molle, differenze finite 1D) tutto costa O(n)O(n).

4. Implementazione

python
import numpy as np

def lu_fattorizza(A, pivoting=True):
    """PA = LU con pivoting parziale (o A = LU senza). Restituisce P, L, U."""
    A = np.array(A, dtype=float)
    n = len(A)
    P = np.eye(n)
    L = np.eye(n)
    for k in range(n - 1):
        if pivoting:
            r = k + np.argmax(abs(A[k:, k]))          # riga del pivot massimo in colonna
            if r != k:
                A[[k, r]] = A[[r, k]]
                P[[k, r]] = P[[r, k]]
                L[[k, r], :k] = L[[r, k], :k]
        for i in range(k + 1, n):
            L[i, k] = A[i, k] / A[k, k]               # moltiplicatore
            A[i, k:] -= L[i, k] * A[k, k:]            # riga i - l_ik * riga k
    return P, L, np.triu(A)

def risolvi(P, L, U, b):
    n = len(b)
    y = np.zeros(n)
    c = P @ b
    for i in range(n):                                # sostituzione in avanti: Ly = Pb
        y[i] = c[i] - L[i, :i] @ y[:i]
    x = np.zeros(n)
    for i in range(n - 1, -1, -1):                    # sostituzione all'indietro: Ux = y
        x[i] = (y[i] - U[i, i + 1:] @ x[i + 1:]) / U[i, i]
    return x

A = np.array([[1, 3, 2], [4, 2, 1], [2, 2, 3]])
b = A @ np.array([1, 2, -1])
P, L, U = lu_fattorizza(A)
print("L =\n", L, "\nU =\n", U, "\nP =\n", P)
print("x =", risolvi(P, L, U, b), " det(A) =", round(np.linalg.det(A), 6), " det(P)*prod(U_ii) =", round(np.linalg.det(P) * np.prod(np.diag(U)), 6))

# pivot piccolo: eps = 1e-20, soluzione esatta quasi (1, 1)
eps = 1e-20
B = np.array([[eps, 1.0], [1.0, 1.0]])
c = np.array([1.0, 2.0])
for piv in (False, True):
    print("pivoting", piv, "->", risolvi(*lu_fattorizza(B, piv), c))

# Cholesky
M = np.array([[4, 2, 2], [2, 5, 3], [2, 3, 6]], dtype=float)
print("chol =\n", np.linalg.cholesky(M))

Output:

L =
 [[1.   0.   0.  ]
 [0.25 1.   0.  ]
 [0.5  0.4  1.  ]] 
U =
 [[4.   2.   1.  ]
 [0.   2.5  1.75]
 [0.   0.   1.8 ]] 
P =
 [[0. 1. 0.]
 [1. 0. 0.]
 [0. 0. 1.]]
x = [ 1.  2. -1.]  det(A) = -18.0  det(P)*prod(U_ii) = -18.0
pivoting False -> [0. 1.]
pivoting True -> [1. 1.]
chol =
 [[2. 0. 0.]
 [1. 2. 0.]
 [1. 1. 2.]]

Equivalenti MATLAB: [L,U,P] = lu(A) (pivoting parziale, PA=LUPA=LU); x = A\b (sceglie da solo LU, Cholesky o altro in base alla matrice: non calcola inv(A)*b); R = chol(A) restituisce il fattore superiore R=LTR=L^T con A=RTRA=R^TR; det(A). In numpy np.linalg.solve(A, b) usa LAPACK con pivoting parziale.

Errori da evitare

  • Dimenticare di scambiare anche le righe già calcolate di LL (e il termine noto) quando si cambia pivot a metà procedimento: si scambia la riga intera, compresi i moltiplicatori già memorizzati.
  • Segno dei moltiplicatori: in LL compaiono i moltiplicatori con segno ++ (sono quelli sottratti).
  • Usare det⁡A=∏ukk\det A=\prod u_{kk} con pivoting: serve il fattore (−1)s(-1)^s.
  • Applicare Cholesky senza controllare che AA sia SPD: la simmetria da sola non basta (esempio: (1221)\begin{pmatrix}1&2\\2&1\end{pmatrix} ha l22=1−4l_{22}=\sqrt{1-4}, autovalori 3,−13,-1).
  • Calcolare A−1bA^{-1}\mathbf b: più lento e meno accurato di LU con sostituzioni.
  • Confondere RR (MATLAB chol) con LL: R=LTR=L^T.

Esercizi svolti: Esercizio - fattorizzazione LU di una matrice 3x3, sistema e determinante, Esercizio - pivoting parziale su una matrice 3x3 con scambio di righe, Esercizio - Cholesky della matrice di rigidezza di una catena di tre masse, Esercizio - pivot piccolo in aritmetica a quattro cifre e costo della fattorizzazione.

Domande d'esame

  1. Quando una matrice ammette la fattorizzazione LU senza scambi? Dare un esempio di matrice invertibile che non la ammette. Traccia. det⁡Ak≠0\det A_k\ne0 per k=1,…,n−1k=1,\dots,n-1 (pivot ukk=det⁡Ak/det⁡Ak−1u_{kk}=\det A_k/\det A_{k-1}); (0110)\begin{pmatrix}0&1\\1&0\end{pmatrix}.
  2. Spiegare perché si fa il pivoting e che cosa garantisce. Traccia. Pivot piccolo ⇒\Rightarrow moltiplicatori grandi ⇒\Rightarrow perdita di cifre (ε=10−20\varepsilon=10^{-20} dà x1=0x_1=0); pivoting parziale: ∣lik∣≤1|l_{ik}|\le1, PA=LUPA=LU, esiste per ogni AA invertibile.
  3. Costo di LU e delle sostituzioni; come si risolvono 100 sistemi con la stessa matrice. Traccia. 23n3\frac23n^3 una volta, poi 2n22n^2 per sistema.
  4. Enunciare il teorema di Cholesky e ricavare ljjl_{jj} e lijl_{ij}. Traccia. Uguagliare aij=∑k≤jlikljka_{ij}=\sum_{k\le j}l_{ik}l_{jk}; ajj=∑k<jljk2+ljj2a_{jj}=\sum_{k<j}l_{jk}^2+l_{jj}^2; radicando positivo   ⟺  \iff SPD.

Versione ripasso

(Eliminazione di GaussCon tre operazioni elementari sulle righe (scambio, moltiplicazione per uno scalare non nullo, somma di un multiplo di un'altra riga) ogni matrice si riduce a scala senza cambiare il rango; serve a calcolare ranghi, risolvere sistemi, trovare relazioni di dipendenza e matrici che riducono a scala.Eliminazione di Gauss →, Forme quadratiche e criteri di definitezzaUna forma quadratica q(h) = h^T M h (M simmetrica) è definita positiva se q>0 per h ≠ 0, semidefinita positiva se q ≥ 0, definita/semidefinita negativa con segni opposti, indefinita se cambia segno. In due variabili, con M = [[a,b],[b,c]]: definita positiva ⇔ det M > 0 e a > 0, definita negativa ⇔ det M > 0 e a < 0, indefinita ⇔ det M < 0 (D, completando il quadrato). In generale: segno degli autovalori di M (D, teorema spettrale): tutti > 0 definita positiva, tutti < 0 definita negativa, di segno diverso indefinita; inoltre q(h) ≥ λ_min |h|². Per n = 3 si usano i minori principali di Sylvester. È lo strumento per classificare i punti critici.Forme quadratiche e criteri di definitezza →)

LU. Passo kk: lik=aik(k)akk(k)l_{ik}=\frac{a_{ik}^{(k)}}{a_{kk}^{(k)}}, riga i−lik⋅i-l_{ik}\cdotriga kk; Mn−1⋯M1A=UM_{n-1}\cdots M_1A=U, A=LUA=LU (LL unitaria con i moltiplicatori). Sistema: Ly=bL\mathbf y=\mathbf b (yi=bi−∑j<ilijyjy_i=b_i-\sum_{j<i}l_{ij}y_j), Ux=yU\mathbf x=\mathbf y (xi=yi−∑j>iuijxjuiix_i=\frac{y_i-\sum_{j>i}u_{ij}x_j}{u_{ii}}). det⁡A=∏ukk\det A=\prod u_{kk}.

Esistenza. det⁡Ak≠0\det A_k\ne0 (k<nk<n) ⇒\Rightarrow LU unica, ukk=det⁡Akdet⁡Ak−1u_{kk}=\frac{\det A_k}{\det A_{k-1}}. Controesempio: (0110)\begin{pmatrix}0&1\\1&0\end{pmatrix}.

Costo. ∑(n−k)2≈n33\sum(n-k)^2\approx\frac{n^3}3 moltiplicazioni e altrettante addizioni: 23n3\frac23n^3 flop; sostituzioni n2n^2 ciascuna; n=1000n=1000: 6,7⋅1086{,}7\cdot10^8 contro 2⋅1062\cdot10^6. Mai A−1bA^{-1}\mathbf b (≈2n3\approx2n^3).

Pivoting. ε=10−20\varepsilon=10^{-20}: senza scambi l21=1020l_{21}=10^{20}, u22=−1020u_{22}=-10^{20}, x1=0x_1=0 (errato); con scambio x=(1,1)x=(1,1). Pivoting parziale: scambio con il massimo in modulo della colonna, PA=LUPA=LU, ∣lik∣≤1|l_{ik}|\le1, esiste per AA invertibile; det⁡A=(−1)s∏ukk\det A=(-1)^s\prod u_{kk}. Fattore di crescita ρ≤2n−1\rho\le2^{n-1}, in pratica piccolo; stabile all'indietro.

Esempi.

  • A=(211433879)A=\begin{pmatrix}2&1&1\\4&3&3\\8&7&9\end{pmatrix}: l21=2l_{21}=2, l31=4l_{31}=4, l32=3l_{32}=3; U=(211011002)U=\begin{pmatrix}2&1&1\\0&1&1\\0&0&2\end{pmatrix}, det⁡=4\det=4; con b=(4,10,24)\mathbf b=(4,10,24): y=(4,2,2)\mathbf y=(4,2,2), x=(1,1,1)\mathbf x=(1,1,1).
  • A=(132421223)A=\begin{pmatrix}1&3&2\\4&2&1\\2&2&3\end{pmatrix}, b=(5,7,3)\mathbf b=(5,7,3): scambio righe 1-2; l=14,12,0,4l=\frac14,\frac12,0{,}4; UU diagonale 4; 2,5; 1,84;\,2{,}5;\,1{,}8; Pb=(7,5,3)P\mathbf b=(7,5,3), y=(7;3,25;−1,8)\mathbf y=(7;3{,}25;-1{,}8), x=(1,2,−1)\mathbf x=(1,2,-1), det⁡=−18\det=-18.

Cholesky. AA SPD (minori di testa >0>0, autovalori >0>0) ⇒A=LLT\Rightarrow A=LL^T, LL con diagonale positiva: ljj=ajj−∑k<jljk2l_{jj}=\sqrt{a_{jj}-\sum_{k<j}l_{jk}^2}, lij=aij−∑k<jlikljkljjl_{ij}=\frac{a_{ij}-\sum_{k<j}l_{ik}l_{jk}}{l_{jj}}. Radicando ≤0\le0: non SPD. Costo n33\frac{n^3}3, senza pivoting, stabile. (422253236)=LLT\begin{pmatrix}4&2&2\\2&5&3\\2&3&6\end{pmatrix}=LL^T con L=(200120112)L=\begin{pmatrix}2&0&0\\1&2&0\\1&1&2\end{pmatrix}, det⁡=64\det=64.

Passaggi principali.

  • Perché A=LUA=LU: ogni passo è MkM_k (identità con −lik-l_{ik} sotto la diagonale in colonna kk); Mn−1⋯M1A=UM_{n-1}\cdots M_1A=U; Mk−1M_k^{-1} ha +lik+l_{ik} e il prodotto M1−1⋯Mn−1−1M_1^{-1}\cdots M_{n-1}^{-1} affianca le colonne dei moltiplicatori, cioè LL.
  • Esistenza: Ak=LkUkA_k=L_kU_k dà det⁡Ak=u11⋯ukk\det A_k=u_{11}\cdots u_{kk}, quindi ukk=det⁡Akdet⁡Ak−1u_{kk}=\frac{\det A_k}{\det A_{k-1}}; det⁡Ak≠0\det A_k\ne0 per k<nk<n assicura pivot non nulli.
  • Costo: passo kk: (n−k)2(n-k)^2 moltiplicazioni e addizioni; ∑(n−k)2≈n33\sum(n-k)^2\approx\frac{n^3}3.
  • Pivot piccolo: ε=10−20\varepsilon=10^{-20}, l21=1εl_{21}=\frac1\varepsilon, u22=1−1ε→−1εu_{22}=1-\frac1\varepsilon\to-\frac1\varepsilon, x1=1−x2ε=0x_1=\frac{1-x_2}{\varepsilon}=0; con scambio l21=εl_{21}=\varepsilon, u22≈1u_{22}\approx1.
  • Stabilità: (A+δA)x^=b(A+\delta A)\hat{\mathbf x}=\mathbf b, ∥δA∥∥A∥≲nρu\frac{\|\delta A\|}{\|A\|}\lesssim n\rho u.
  • Prodotto LULU: riga 3 =4⋅(2,1,1)+3⋅(0,1,1)+(0,0,2)=(8,7,9)=4\cdot(2,1,1)+3\cdot(0,1,1)+(0,0,2)=(8,7,9).
  • Ricavare Cholesky: aij=∑k=1jlikljka_{ij}=\sum_{k=1}^jl_{ik}l_{jk}; per i=ji=j si isola ljj2l_{jj}^2, per i>ji>j si isola lijl_{ij}.
  • Test SPD: (1221)\begin{pmatrix}1&2\\2&1\end{pmatrix} simmetrica ma l22=1−4l_{22}=\sqrt{1-4}, autovalori 3,−13,-1.
  • MATLAB: [L,U,P]=lu(A), A\b, chol(A) dà R=LTR=L^T.

Errori tipici.

  • Non scambiare anche i moltiplicatori già calcolati e b\mathbf b.
  • det⁡A\det A senza (−1)s(-1)^s.
  • Cholesky su matrice solo simmetrica.
  • RR di MATLAB scambiato con LL.

Esercizi su questo argomento

Teoria collegata