Fattorizzazione LU, pivoting e Cholesky
In questa pagina 6
I sistemi lineari 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 in una matrice triangolare superiore con passi. Al passo si sottrae dalla riga la riga moltiplicata per il moltiplicatore dove sono gli elementi dopo passi e è il pivot. Ogni passo equivale a moltiplicare a sinistra per una matrice elementare (identità con nella colonna sotto la diagonale), quindi . Le inverse si moltiplicano senza interferenze e danno
Procedura (risolvere con LU).
- Si fattorizza (una volta sola, flop).
- Sostituzione in avanti : (la diagonale di è 1, nessuna divisione).
- Sostituzione all'indietro : , .
I passi 2 e 3 costano operazioni ciascuno: con la stessa matrice e termini noti diversi si fa una fattorizzazione sola e coppie di sostituzioni.
Esempio (a mano). , (cioè ).
- Passo 1, pivot : , . Riga 2 riga 1: . Riga 3 riga 1: .
- Passo 2, pivot : . Riga 3 riga 2: .
Verifica del prodotto: riga 3 di = ✓. Sostituzione in avanti: ; ; . All'indietro: ; ; ✓. Il determinante è .
Quando esiste. Ogni minore principale di testa (le prime righe e colonne) si fattorizza come , quindi .
Teorema. Se per , esiste un'unica fattorizzazione con a diagonale unitaria. I pivot sono .
Se un pivot si annulla l'algoritmo si ferma anche per una matrice invertibile: non ha LU (). Serve scambiare le righe.
Costo. Al passo si calcolano moltiplicatori e si aggiornano elementi: circa moltiplicazioni e altrettante addizioni. Sommando, moltiplicazioni e addizioni: flop. Per : flop per la fattorizzazione e per ogni risoluzione successiva. Lo stesso sistema con la formula di Cramer costerebbe operazioni: impraticabile già per .
Non calcolare mai l'inversa per risolvere un sistema: costa flop (si risolvono sistemi) ed è meno accurata di con sostituzioni.
2. Instabilità e pivoting
Il moltiplicatore è 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. in doppia precisione ( cifre decimali), sistema Senza scambi: , (il viene perso: in doppia precisione vale ), , , . Il risultato è completamente sbagliato (esatto ), anche se il sistema è ben condizionato. Scambiando le righe, il pivot è , , , e si ottiene corretto.
Pivoting parziale. Al passo si cerca fra le righe quella con massimo e la si scambia con la riga . Il risultato è , con matrice di permutazione e .
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 : si permuta il termine noto e poi si procede come prima. Il determinante è , con numero di scambi.
Fattore di crescita. . Con pivoting parziale (limite teorico raggiunto solo da matrici costruite apposta); in pratica è piccolo e l'algoritmo è stabile all'indietro: la soluzione calcolata risolve esattamente con , precisione di macchina. L'accuratezza finale dipende poi dal condizionamento di (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). , ().
- Passo 1: il massimo in valore assoluto della colonna 1 è (riga 2): si scambiano le righe 1 e 2 ( scambia 1 e 2): . , . Riga 2 riga 1: . Riga 3 riga 1: .
- Passo 2: fra e vince : nessuno scambio. . Riga 3 riga 2: .
Termine noto permutato: . Avanti: ; ; . Indietro: ; ; ✓. Determinante: (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 è definita positiva se per ogni (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 sono positivi.
Teorema (Cholesky). Se è SPD esiste un'unica matrice triangolare inferiore con elementi diagonali positivi tale che .
Uguagliando gli elementi di (con ) si ricavano per colonne Il radicando è positivo proprio perché è definita positiva (è il rapporto ): se compare un radicando , la matrice non è SPD, ed è anche il test più economico per controllarlo.
Esempio. . Minori di testa: , , : tutti positivi, A è SPD.
- Colonna 1: , , .
- Colonna 2: , .
- Colonna 3: .
Per risolvere si usano e .
Vantaggi rispetto a LU. Costo flop (metà, si memorizza solo ); nessun pivoting necessario e la stabilità è garantita (: gli elementi non crescono); le matrici a banda mantengono la banda. Si può evitare la radice con la forma ( a diagonale unitaria, diagonale). Nel caso di una matrice tridiagonale (catena di molle, differenze finite 1D) tutto costa .
4. Implementazione
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, ); 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 con ; 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 (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 compaiono i moltiplicatori con segno (sono quelli sottratti).
- Usare con pivoting: serve il fattore .
- Applicare Cholesky senza controllare che sia SPD: la simmetria da sola non basta (esempio: ha , autovalori ).
- Calcolare : più lento e meno accurato di LU con sostituzioni.
- Confondere (MATLAB
chol) con : .
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
- Quando una matrice ammette la fattorizzazione LU senza scambi? Dare un esempio di matrice invertibile che non la ammette. Traccia. per (pivot ); .
- Spiegare perché si fa il pivoting e che cosa garantisce. Traccia. Pivot piccolo moltiplicatori grandi perdita di cifre ( dà ); pivoting parziale: , , esiste per ogni invertibile.
- Costo di LU e delle sostituzioni; come si risolvono 100 sistemi con la stessa matrice. Traccia. una volta, poi per sistema.
- Enunciare il teorema di Cholesky e ricavare e . Traccia. Uguagliare ; ; radicando positivo 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 : , riga riga ; , ( unitaria con i moltiplicatori). Sistema: (), (). .
Esistenza. () LU unica, . Controesempio: .
Costo. moltiplicazioni e altrettante addizioni: flop; sostituzioni ciascuna; : contro . Mai ().
Pivoting. : senza scambi , , (errato); con scambio . Pivoting parziale: scambio con il massimo in modulo della colonna, , , esiste per invertibile; . Fattore di crescita , in pratica piccolo; stabile all'indietro.
Esempi.
- : , , ; , ; con : , .
- , : scambio righe 1-2; ; diagonale ; , , , .
Cholesky. SPD (minori di testa , autovalori ) , con diagonale positiva: , . Radicando : non SPD. Costo , senza pivoting, stabile. con , .
Passaggi principali.
- Perché : ogni passo è (identità con sotto la diagonale in colonna ); ; ha e il prodotto affianca le colonne dei moltiplicatori, cioè .
- Esistenza: dà , quindi ; per assicura pivot non nulli.
- Costo: passo : moltiplicazioni e addizioni; .
- Pivot piccolo: , , , ; con scambio , .
- Stabilità: , .
- Prodotto : riga 3 .
- Ricavare Cholesky: ; per si isola , per si isola .
- Test SPD: simmetrica ma , autovalori .
- MATLAB:
[L,U,P]=lu(A),A\b,chol(A)dà .
Errori tipici.
- Non scambiare anche i moltiplicatori già calcolati e .
- senza .
- Cholesky su matrice solo simmetrica.
- di MATLAB scambiato con .
Esercizi su questo argomento
- Esercizio - Cholesky della matrice di rigidezza di una catena di tre masse
- Esercizio - fattorizzazione LU di una matrice 3x3, sistema e determinante
- Esercizio - pivot piccolo in aritmetica a quattro cifre e costo della fattorizzazione
- Esercizio - pivoting parziale su una matrice 3x3 con scambio di righe
- Esercizio - residuo ed errore in un sistema ben e mal condizionato