Metodi iterativi - Jacobi, Gauss-Seidel e convergenza
In questa pagina 7
I metodi diretti (Fattorizzazione LU, pivoting e CholeskyRisolvere $A\mathbf x=\mathbf b$ con Gauss equivale a fattorizzare $A=LU$ ($L$ triangolare inferiore con $1$ sulla diagonale e i moltiplicatori $l_{ik}=\frac{a_{ik}^{(k)}}{a_{kk}^{(k)}}$ sotto la diagonale, $U$ la matrice a scala finale) e poi risolvere $L\mathbf y=\mathbf b$ (in avanti) e $U\mathbf x=\mathbf y$ (all'indietro). Esiste (ed è unica) se i minori principali di testa $\det A_k$, $k<n$, sono $\ne0$. Costo $\frac23n^3$ flop per la fattorizzazione, $2n^2$ per ogni termine noto; $\det A=\prod u_{kk}$. Con un pivot piccolo l'algoritmo è instabile: il pivoting parziale (scambio di righe che porta in posizione di pivot l'elemento di modulo massimo della colonna) dà $PA=LU$ con $|l_{ik}|\le1$ ed esiste per ogni $A$ invertibile. Se $A$ è simmetrica definita positiva esiste $A=LL^T$ (Cholesky), con $l_{jj}=\sqrt{a_{jj}-\sum_{k<j}l_{jk}^2}$ e $l_{ij}=\frac{a_{ij}-\sum_{k<j}l_{ik}l_{jk}}{l_{jj}}$; costo $\frac13n^3$, senza pivoting.Fattorizzazione LU, pivoting e Cholesky →) costano operazioni e, soprattutto, riempiono la matrice: i fattori e di una matrice sparsa (pochi elementi non nulli per riga, come in un reticolo di elementi finiti o in una discretizzazione 2D o 3D) hanno molti più elementi non nulli di . Con milioni di incognite memoria e tempo sono proibitivi. I metodi iterativi evitano la fattorizzazione: partono da una stima iniziale e la correggono ripetutamente, usando in ogni iterazione solo prodotti matrice-vettore, che costano quanto il numero di elementi non nulli di . Se bastano poche iterazioni, vincono.
Prerequisiti: 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 → (norme, raggio spettrale), Metodo di bisezione e iterazioni di punto fissoBisezione: se f è continua e f(a)f(b) < 0 si dimezza l'intervallo tenendo la metà con il cambio di segno; dopo n passi |c_n − α| ≤ (b−a)/2^(n+1), cioè un bit di precisione per iterazione (convergenza lineare, sempre garantita). Punto fisso x = g(x): se g manda [a,b] in sé con |g'| ≤ L < 1 (contrazione) il punto fisso è unico, l'iterazione x_{k+1} = g(x_k) converge da ogni x_0 e |x_k − α| ≤ L^k/(1−L)·|x_1−x_0|; l'errore si moltiplica per circa g'(α) a ogni passo. Una stessa equazione ha molte riscritture x = g(x), alcune convergenti e altre no.Metodo di bisezione e iterazioni di punto fisso → (la forma è un'iterazione di punto fisso).
1. Splitting e iterazione di punto fisso
Si scrive con invertibile e facile da invertire (diagonale o triangolare). Allora e si definisce , cioè si risolve a ogni passo il sistema facile . La soluzione esatta è un punto fisso. Sottraendo da si ottiene la regola dell'errore :
Teorema (convergenza, D). L'iterazione converge per ogni se e solo se . Basta che per una norma indotta.
Dimostrazione. ( nel caso ) . Nel caso generale esiste una norma indotta con (con la forma di Jordan), e si riconduce al caso precedente. () Se sia un autovalore con e un autovettore: scegliendo (per autovalori complessi si lavora nel complesso, o con parte reale e immaginaria) è .
La convergenza dipende dunque solo da , non da né dalla stima iniziale. Se nessuna stima iniziale (tranne quelle fortunate) fa convergere il metodo.
2. Jacobi e Gauss-Seidel
Si decompone , con diagonale di , la parte strettamente inferiore, la parte strettamente superiore (non sono i fattori della LU). Si supponga .
Metodo di Jacobi (, ): , cioè, per ogni , Metodo di Gauss-Seidel (, ): , cioè
Interpretazione: l'equazione viene risolta rispetto all'incognita , tenendo fissi gli altri valori. In Jacobi si usano tutti i valori della iterazione precedente (aggiornamento «in parallelo»: si può calcolare ogni indipendentemente, ma servono due vettori). In Gauss-Seidel si usano subito i valori appena calcolati ( con ): in genere converge più in fretta e basta un solo vettore, ma l'ordine delle equazioni conta e il metodo è sequenziale. Le matrici di iterazione sono
Esempio (a mano). , , soluzione , partenza . Le equazioni risolte per l'incognita diagonale sono , , .
Jacobi.
- : ; ; .
- (usando ): ; ; .
- : ; ; .
Gauss-Seidel (ogni componente usa quelle già aggiornate).
- : ; (usa il nuovo ); .
- : ; ; .
- : ; ; .
Dopo tre iterazioni l'errore (in norma ) è per Gauss-Seidel e per Jacobi.
3. Quando convergono
Teorema (dominanza diagonale). Se è a dominanza diagonale stretta per righe, per ogni , Jacobi e Gauss-Seidel convergono.
Per Jacobi la dimostrazione è immediata: ha elementi () e diagonale nulla, quindi . (Per Gauss-Seidel si dimostra che .) Nell'esempio precedente .
Teorema (SPD). Se è simmetrica definita positiva, Gauss-Seidel converge (Jacobi in generale no: richiede anche definita positiva). Tridiagonali. Se è tridiagonale con diagonale non nulla, e Jacobi e Gauss-Seidel convergono o divergono insieme.
Per l'esempio, ha autovalori e (la matrice tridiagonale con zeri sulla diagonale e fuori), quindi e : Gauss-Seidel è due volte più veloce in numero di cifre guadagnate per iterazione.
La dominanza è solo sufficiente, e dipende dall'ordine delle equazioni. non è dominante: ha autovalori , e Jacobi diverge per ogni . Scambiando le equazioni, è dominante: . In pratica si riordinano le equazioni (o si fa il pivoting) per portare il termine grande sulla diagonale.
Nessun metodo domina l'altro. Esistono matrici per cui Jacobi converge e Gauss-Seidel no (e viceversa): ha nilpotente (, Jacobi converge in 3 passi) e con autovalori (, diverge); ha (diverge) e (converge).
4. Stime dell'errore e arresto
A priori. Da : . Per ottenere basta .
A posteriori (dall'incremento). Siccome , gli incrementi decrescono geometricamente; sommando la serie geometrica degli incrementi successivi Quindi si ferma l'iterazione quando l'incremento è abbastanza piccolo: con vicino a l'incremento piccolo non garantisce un errore piccolo (il fattore è grande). L'altro criterio è il residuo , che garantisce un errore relativo (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 →).
Velocità asintotica. L'errore si riduce di circa un fattore a ogni passo (rapporti degli errori che tendono a , o oscillano attorno, quando ci sono autovalori ). Per guadagnare cifre decimali servono iterazioni. Nell'esempio: Jacobi , : 2,2 iterazioni per cifra; Gauss-Seidel , : 1,1 iterazioni per cifra.
Esempio meccanico: barra con sorgente di calore. La temperatura di una barra di lunghezza con generazione uniforme e estremi a 0\,^\circC soddisfa . Con nodi interni e passo le differenze finite danno , cioè con . Qui ha autovalori , quindi Per : e . Per : e , cioè e iterazioni per guadagnare 6 cifre. Per : e , 28,554 e 14,277 iterazioni. Più la griglia è fine, più e più il metodo rallenta (legato al cattivo condizionamento della stessa matrice); i metodi moderni (gradiente coniugato, multigriglia) rimediano. Per questa matrice tridiagonale, tuttavia, Cholesky costa : un metodo iterativo conviene per matrici sparse non a banda stretta (griglie 2D e 3D).
5. Implementazione
import numpy as np
def iterazioni(A, b, metodo, x0, nmax):
"""Jacobi o Gauss-Seidel: restituisce la lista delle approssimazioni x^0, x^1, ..."""
D, L, U = np.diag(np.diag(A)), np.tril(A, -1), np.triu(A, 1)
M = D if metodo == "jacobi" else D + L # A = M - N
N = M - A
xs = [np.array(x0, dtype=float)]
for _ in range(nmax):
xs.append(np.linalg.solve(M, N @ xs[-1] + b)) # M x_new = N x_old + b
return xs
A = np.array([[4, -1, 0], [-1, 4, -1], [0, -1, 4]], dtype=float)
b = np.array([2, 4, 10], dtype=float)
x = np.linalg.solve(A, b) # soluzione esatta (1, 2, 3)
D, L, U = np.diag(np.diag(A)), np.tril(A, -1), np.triu(A, 1)
BJ = -np.linalg.solve(D, L + U)
BGS = -np.linalg.solve(D + L, U)
rho = lambda B: max(abs(np.linalg.eigvals(B)))
print(f"rho(Jacobi) = {rho(BJ):.4f} rho(Gauss-Seidel) = {rho(BGS):.4f} (cos(pi/4)/2 = {np.cos(np.pi/4)/2:.4f}, quadrato: {(np.sqrt(2)/4)**2:.4f})")
print(" k Jacobi: errore rapp. | Gauss-Seidel: errore rapp.")
ej, eg = None, None
for k, (xj, xg) in enumerate(zip(iterazioni(A, b, "jacobi", [0, 0, 0], 8), iterazioni(A, b, "gs", [0, 0, 0], 8))):
nj, ng = np.linalg.norm(x - xj, np.inf), np.linalg.norm(x - xg, np.inf)
rj = f"{nj / ej:5.3f}" if ej else " -"
rg = f"{ng / eg:5.3f}" if eg else " -"
print(f"{k:2d} {nj:.3e} {rj} | {ng:.3e} {rg}")
ej, eg = nj, ngOutput:
rho(Jacobi) = 0.3536 rho(Gauss-Seidel) = 0.1250 (cos(pi/4)/2 = 0.3536, quadrato: 0.1250)
k Jacobi: errore rapp. | Gauss-Seidel: errore rapp.
0 3.000e+00 - | 3.000e+00 -
1 1.000e+00 0.333 | 8.750e-01 0.292
2 2.500e-01 0.250 | 2.188e-01 0.250
3 1.250e-01 0.500 | 2.734e-02 0.125
4 3.125e-02 0.250 | 3.418e-03 0.125
5 1.562e-02 0.500 | 4.272e-04 0.125
6 3.906e-03 0.250 | 5.341e-05 0.125
7 1.953e-03 0.500 | 6.676e-06 0.125
8 4.883e-04 0.250 | 8.345e-07 0.125Il rapporto di Gauss-Seidel si assesta su . Per Jacobi alterna e (la media geometrica è ): gli autovalori di fanno oscillare l'errore.
In MATLAB non ci sono funzioni predefinite per Jacobi e Gauss-Seidel: si scrivono con un ciclo (x = D\(b-(L+U)*x)); per sistemi sparsi grandi si usano A\b (con matrici sparse), pcg (gradiente coniugato, SPD) o gmres.
Errori da evitare
- Confondere e della decomposizione con i fattori della LU: qui sono le parti strettamente triangolari di .
- Usare i valori nuovi in Jacobi (diventa Gauss-Seidel) o i vecchi in Gauss-Seidel.
- Confondere la dominanza per righe con quella per colonne: la prima corrisponde a , la seconda a ; per Jacobi basta una delle due.
- Fidarsi dell'incremento piccolo quando : l'errore può essere volte più grande.
- Dimenticare di riordinare le equazioni quando la diagonale ha elementi piccoli.
- Credere che la dominanza sia necessaria: è solo sufficiente (condizione necessaria e sufficiente: ).
Esercizi svolti: Esercizio - Jacobi a mano, dominanza diagonale e stima del numero di iterazioni, Esercizio - Gauss-Seidel a mano e confronto con Jacobi, Esercizio - matrici di iterazione e raggio spettrale di sistemi 2x2 e 3x3, Esercizio - conduzione del calore in una barra con Jacobi e Gauss-Seidel.
Domande d'esame
- Enunciare e dimostrare il teorema di convergenza dei metodi iterativi . Traccia. ; se tende a zero; se un autovettore dà .
- Scrivere le matrici di iterazione di Jacobi e Gauss-Seidel e dimostrare che Jacobi converge per dominanza diagonale stretta. Traccia. , ; .
- Stimare quante iterazioni servono per ridurre l'errore di con . Traccia. .
- Perché l'incremento piccolo non basta come criterio d'arresto? Traccia. : se il fattore esplode.
Versione ripasso
(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 →, Metodo di bisezione e iterazioni di punto fissoBisezione: se f è continua e f(a)f(b) < 0 si dimezza l'intervallo tenendo la metà con il cambio di segno; dopo n passi |c_n − α| ≤ (b−a)/2^(n+1), cioè un bit di precisione per iterazione (convergenza lineare, sempre garantita). Punto fisso x = g(x): se g manda [a,b] in sé con |g'| ≤ L < 1 (contrazione) il punto fisso è unico, l'iterazione x_{k+1} = g(x_k) converge da ogni x_0 e |x_k − α| ≤ L^k/(1−L)·|x_1−x_0|; l'errore si moltiplica per circa g'(α) a ogni passo. Una stessa equazione ha molte riscritture x = g(x), alcune convergenti e altre no.Metodo di bisezione e iterazioni di punto fisso →)
Splitting. , , , . Errore .
Teorema (D). Converge per ogni ; basta . Se : autovettore, .
Metodi. (parti strettamente triangolari). Jacobi: , , . Gauss-Seidel: , , .
Convergenza. Dominanza diagonale stretta per righe: entrambi (D per Jacobi: ). SPD: Gauss-Seidel. Tridiagonale: . La dominanza è solo sufficiente e dipende dall'ordine: ha , scambiando le righe . Nessun metodo domina l'altro.
Stime. , ; (incremento); residuo: errore . Cifre: .
Esempio , , , :
- Jacobi: , , ;
- Gauss-Seidel: , , ;
- , ; errori GS rapporto , Jacobi alterna e .
Barra con sorgente. : , ; : e iterazioni per 6 cifre. Più fine la griglia, più lento.
Passaggi principali.
Errore: perché .
Incremento: , serie geometrica.
Esempio divergente: , .
Controesempi: : , ; : , .
Numero di iterazioni: ; e danno ; Jacobi iterazioni per cifra contro di Gauss-Seidel nell'esempio.
Perché Gauss-Seidel è più veloce: usa subito le componenti aggiornate (un solo vettore), ma è sequenziale e dipende dall'ordine delle equazioni; Jacobi è parallelizzabile.
Quando conviene: matrici sparse grandi non a banda stretta (griglie 2D, 3D); per le tridiagonali Cholesky costa . MATLAB: ciclo
x = D\(b-(L+U)*x),pcg,gmres.
Errori tipici.
- , scambiati con i fattori della LU.
- Valori nuovi usati in Jacobi o vecchi in Gauss-Seidel.
- Incremento piccolo preso per errore piccolo con .
- Dominanza vista come condizione necessaria.
Esercizi su questo argomento
- Esercizio - conduzione del calore in una barra con Jacobi e Gauss-Seidel
- Esercizio - Gauss-Seidel a mano e confronto con Jacobi
- Esercizio - Jacobi a mano, dominanza diagonale e stima del numero di iterazioni
- Esercizio - matrici di iterazione e raggio spettrale di sistemi 2x2 e 3x3
- Esercizio - residuo ed errore in un sistema ben e mal condizionato