Salta al contenuto
Note per Studenti Metodi iterativi - Jacobi, Gauss-Seidel e convergenza

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 23n3\frac23n^3 operazioni e, soprattutto, riempiono la matrice: i fattori LL e UU 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 AA. 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 AA. 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 x=Bx+c\mathbf x=B\mathbf x+\mathbf c è un'iterazione di punto fisso).

1. Splitting e iterazione di punto fisso

Si scrive A=M−NA=M-N con MM invertibile e facile da invertire (diagonale o triangolare). Allora Ax=b  ⟺  Mx=Nx+b  ⟺  x=M−1N⏟B x+M−1b⏟cA\mathbf x=\mathbf b\iff M\mathbf x=N\mathbf x+\mathbf b\iff\mathbf x=\underbrace{M^{-1}N}_{B}\,\mathbf x+\underbrace{M^{-1}\mathbf b}_{\mathbf c} e si definisce x(k+1)=Bx(k)+c\mathbf x^{(k+1)}=B\mathbf x^{(k)}+\mathbf c, cioè si risolve a ogni passo il sistema facile Mx(k+1)=Nx(k)+bM\mathbf x^{(k+1)}=N\mathbf x^{(k)}+\mathbf b. La soluzione esatta x\mathbf x è un punto fisso. Sottraendo x=Bx+c\mathbf x=B\mathbf x+\mathbf c da x(k+1)=Bx(k)+c\mathbf x^{(k+1)}=B\mathbf x^{(k)}+\mathbf c si ottiene la regola dell'errore e(k)=x−x(k)\mathbf e^{(k)}=\mathbf x-\mathbf x^{(k)}: e(k+1)=B e(k)⟹e(k)=Bke(0).\mathbf e^{(k+1)}=B\,\mathbf e^{(k)}\quad\Longrightarrow\quad\mathbf e^{(k)}=B^k\mathbf e^{(0)} .

Teorema (convergenza, D). L'iterazione converge per ogni x(0)\mathbf x^{(0)} se e solo se ρ(B)<1\rho(B)<1. Basta che ∥B∥<1\|B\|<1 per una norma indotta.

Dimostrazione. (⇐\Leftarrow nel caso ∥B∥<1\|B\|<1) ∥e(k)∥≤∥B∥k∥e(0)∥→0\|\mathbf e^{(k)}\|\le\|B\|^k\|\mathbf e^{(0)}\|\to0. Nel caso generale ρ(B)<1\rho(B)<1 esiste una norma indotta con ∥B∥<ρ(B)+ε<1\|B\|<\rho(B)+\varepsilon<1 (con la forma di Jordan), e si riconduce al caso precedente. (⇒\Rightarrow) Se ρ(B)≥1\rho(B)\ge1 sia λ\lambda un autovalore con ∣λ∣≥1|\lambda|\ge1 e v\mathbf v un autovettore: scegliendo x(0)=x−v\mathbf x^{(0)}=\mathbf x-\mathbf v (per autovalori complessi si lavora nel complesso, o con parte reale e immaginaria) è e(k)=λkv↛0\mathbf e^{(k)}=\lambda^k\mathbf v\not\to0. ■\blacksquare

La convergenza dipende dunque solo da BB, non da b\mathbf b né dalla stima iniziale. Se ρ(B)≥1\rho(B)\ge1 nessuna stima iniziale (tranne quelle fortunate) fa convergere il metodo.

2. Jacobi e Gauss-Seidel

Si decompone A=D+L+UA=D+L+U, con DD diagonale di AA, LL la parte strettamente inferiore, UU la parte strettamente superiore (non sono i fattori della LU). Si supponga aii≠0a_{ii}\ne0.

Metodo di Jacobi (M=DM=D, N=−(L+U)N=-(L+U)): x(k+1)=−D−1(L+U)x(k)+D−1b\mathbf x^{(k+1)}=-D^{-1}(L+U)\mathbf x^{(k)}+D^{-1}\mathbf b, cioè, per ogni ii, xi(k+1)=1aii(bi−∑j≠iaij xj(k)).x_i^{(k+1)}=\frac1{a_{ii}}\Big(b_i-\sum_{j\ne i}a_{ij}\,x_j^{(k)}\Big). Metodo di Gauss-Seidel (M=D+LM=D+L, N=−UN=-U): (D+L)x(k+1)=−Ux(k)+b(D+L)\mathbf x^{(k+1)}=-U\mathbf x^{(k)}+\mathbf b, cioè xi(k+1)=1aii(bi−∑j<iaij xj(k+1)−∑j>iaij xj(k)).x_i^{(k+1)}=\frac1{a_{ii}}\Big(b_i-\sum_{j<i}a_{ij}\,x_j^{(k+1)}-\sum_{j>i}a_{ij}\,x_j^{(k)}\Big).

Interpretazione: l'equazione ii viene risolta rispetto all'incognita xix_i, tenendo fissi gli altri valori. In Jacobi si usano tutti i valori della iterazione precedente (aggiornamento «in parallelo»: si può calcolare ogni xix_i indipendentemente, ma servono due vettori). In Gauss-Seidel si usano subito i valori appena calcolati (xj(k+1)x_j^{(k+1)} con j<ij<i): 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 BJ=−D−1(L+U),BGS=−(D+L)−1U.B_J=-D^{-1}(L+U),\qquad B_{GS}=-(D+L)^{-1}U .

Esempio (a mano). A=(4−10−14−10−14)A=\begin{pmatrix}4&-1&0\\-1&4&-1\\0&-1&4\end{pmatrix}, b=(2,4,10)T\mathbf b=(2,4,10)^T, soluzione x=(1,2,3)T\mathbf x=(1,2,3)^T, partenza x(0)=0\mathbf x^{(0)}=\mathbf 0. Le equazioni risolte per l'incognita diagonale sono x1=2+x24x_1=\frac{2+x_2}4, x2=4+x1+x34x_2=\frac{4+x_1+x_3}4, x3=10+x24x_3=\frac{10+x_2}4.

Jacobi.

  • x(1)\mathbf x^{(1)}: x1=2+04=0,5x_1=\frac{2+0}4=0{,}5; x2=4+0+04=1x_2=\frac{4+0+0}4=1; x3=10+04=2,5x_3=\frac{10+0}4=2{,}5.
  • x(2)\mathbf x^{(2)} (usando x(1)\mathbf x^{(1)}): x1=2+14=0,75x_1=\frac{2+1}4=0{,}75; x2=4+0,5+2,54=1,75x_2=\frac{4+0{,}5+2{,}5}4=1{,}75; x3=10+14=2,75x_3=\frac{10+1}4=2{,}75.
  • x(3)\mathbf x^{(3)}: x1=2+1,754=0,9375x_1=\frac{2+1{,}75}4=0{,}9375; x2=4+0,75+2,754=1,875x_2=\frac{4+0{,}75+2{,}75}4=1{,}875; x3=10+1,754=2,9375x_3=\frac{10+1{,}75}4=2{,}9375.

Gauss-Seidel (ogni componente usa quelle già aggiornate).

  • x(1)\mathbf x^{(1)}: x1=2+04=0,5x_1=\frac{2+0}4=0{,}5; x2=4+0,5+04=1,125x_2=\frac{4+0{,}5+0}4=1{,}125 (usa il nuovo x1x_1); x3=10+1,1254=2,78125x_3=\frac{10+1{,}125}4=2{,}78125.
  • x(2)\mathbf x^{(2)}: x1=2+1,1254=0,78125x_1=\frac{2+1{,}125}4=0{,}78125; x2=4+0,78125+2,781254=1,890625x_2=\frac{4+0{,}78125+2{,}78125}4=1{,}890625; x3=10+1,8906254=2,972656x_3=\frac{10+1{,}890625}4=2{,}972656.
  • x(3)\mathbf x^{(3)}: x1=2+1,8906254=0,972656x_1=\frac{2+1{,}890625}4=0{,}972656; x2=4+0,972656+2,9726564=1,986328x_2=\frac{4+0{,}972656+2{,}972656}4=1{,}986328; x3=10+1,9863284=2,996582x_3=\frac{10+1{,}986328}4=2{,}996582.

Dopo tre iterazioni l'errore (in norma ∞\infty) è 2,7⋅10−22{,}7\cdot10^{-2} per Gauss-Seidel e 0,1250{,}125 per Jacobi.

3. Quando convergono

Teorema (dominanza diagonale). Se AA è a dominanza diagonale stretta per righe, ∣aii∣>∑j≠i∣aij∣|a_{ii}|>\sum_{j\ne i}|a_{ij}| per ogni ii, Jacobi e Gauss-Seidel convergono.

Per Jacobi la dimostrazione è immediata: BJ=−D−1(L+U)B_J=-D^{-1}(L+U) ha elementi −aijaii-\frac{a_{ij}}{a_{ii}} (j≠ij\ne i) e diagonale nulla, quindi ∥BJ∥∞=max⁡i∑j≠i∣aij∣∣aii∣<1\|B_J\|_\infty=\max_i\sum_{j\ne i}\frac{|a_{ij}|}{|a_{ii}|}<1. (Per Gauss-Seidel si dimostra che ∥BGS∥∞≤∥BJ∥∞<1\|B_{GS}\|_\infty\le\|B_J\|_\infty<1.) Nell'esempio precedente ∥BJ∥∞=24=12<1\|B_J\|_\infty=\frac24=\frac12<1.

Teorema (SPD). Se AA è simmetrica definita positiva, Gauss-Seidel converge (Jacobi in generale no: richiede anche 2D−A2D-A definita positiva). Tridiagonali. Se AA è tridiagonale con diagonale non nulla, ρ(BGS)=ρ(BJ)2\rho(B_{GS})=\rho(B_J)^2 e Jacobi e Gauss-Seidel convergono o divergono insieme.

Per l'esempio, BJB_J ha autovalori ±24\pm\frac{\sqrt2}4 e 00 (la matrice tridiagonale con zeri sulla diagonale e 14\frac14 fuori), quindi ρ(BJ)=0,3536\rho(B_J)=0{,}3536 e ρ(BGS)=0,35362=0,125\rho(B_{GS})=0{,}3536^2=0{,}125: Gauss-Seidel è due volte più veloce in numero di cifre guadagnate per iterazione.

La dominanza è solo sufficiente, e dipende dall'ordine delle equazioni. A=(1231)A=\begin{pmatrix}1&2\\3&1\end{pmatrix} non è dominante: BJ=(0−2−30)B_J=\begin{pmatrix}0&-2\\-3&0\end{pmatrix} ha autovalori ±6\pm\sqrt6, ρ=2,45>1\rho=2{,}45>1 e Jacobi diverge per ogni x(0)≠x\mathbf x^{(0)}\ne\mathbf x. Scambiando le equazioni, (3112)\begin{pmatrix}3&1\\1&2\end{pmatrix} è dominante: ρ(BJ)=16=0,408<1\rho(B_J)=\sqrt{\frac16}=0{,}408<1. 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): (12−2111221)\begin{pmatrix}1&2&-2\\1&1&1\\2&2&1\end{pmatrix} ha BJB_J nilpotente (ρ=0\rho=0, Jacobi converge in 3 passi) e BGSB_{GS} con autovalori 0,2,20,2,2 (ρ=2\rho=2, diverge); (2−11222−1−12)\begin{pmatrix}2&-1&1\\2&2&2\\-1&-1&2\end{pmatrix} ha ρ(BJ)=52=1,118>1\rho(B_J)=\frac{\sqrt5}2=1{,}118>1 (diverge) e ρ(BGS)=12\rho(B_{GS})=\frac12 (converge).

4. Stime dell'errore e arresto

A priori. Da e(k)=Bke(0)\mathbf e^{(k)}=B^k\mathbf e^{(0)}: ∥e(k)∥≤∥B∥k∥e(0)∥\|\mathbf e^{(k)}\|\le\|B\|^k\|\mathbf e^{(0)}\|. Per ottenere ∥e(k)∥≤ε∥e(0)∥\|\mathbf e^{(k)}\|\le\varepsilon\|\mathbf e^{(0)}\| basta k≥ln⁡εln⁡∥B∥k\ge\dfrac{\ln\varepsilon}{\ln\|B\|}.

A posteriori (dall'incremento). Siccome x(k+1)−x(k)=B(x(k)−x(k−1))\mathbf x^{(k+1)}-\mathbf x^{(k)}=B\big(\mathbf x^{(k)}-\mathbf x^{(k-1)}\big), gli incrementi decrescono geometricamente; sommando la serie geometrica degli incrementi successivi ∥x−x(k)∥≤∥B∥1−∥B∥ ∥x(k)−x(k−1)∥.\|\mathbf x-\mathbf x^{(k)}\|\le\frac{\|B\|}{1-\|B\|}\,\|\mathbf x^{(k)}-\mathbf x^{(k-1)}\| . Quindi si ferma l'iterazione quando l'incremento è abbastanza piccolo: con ∥B∥\|B\| vicino a 11 l'incremento piccolo non garantisce un errore piccolo (il fattore ∥B∥1−∥B∥\frac{\|B\|}{1-\|B\|} è grande). L'altro criterio è il residuo ∥b−Ax(k)∥≤tol ∥b∥\|\mathbf b-A\mathbf x^{(k)}\|\le\text{tol}\,\|\mathbf b\|, che garantisce un errore relativo ≤κ(A) tol\le\kappa(A)\,\text{tol} (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 ρ(B)\rho(B) a ogni passo (rapporti degli errori che tendono a ρ\rho, o oscillano attorno, quando ci sono autovalori ±ρ\pm\rho). Per guadagnare dd cifre decimali servono k≈d−log⁡10ρ(B)k\approx\frac{d}{-\log_{10}\rho(B)} iterazioni. Nell'esempio: Jacobi ρ=0,354\rho=0{,}354, −log⁡10ρ=0,45-\log_{10}\rho=0{,}45: 2,2 iterazioni per cifra; Gauss-Seidel ρ=0,125\rho=0{,}125, 0,900{,}90: 1,1 iterazioni per cifra.

Esempio meccanico: barra con sorgente di calore. La temperatura TT di una barra di lunghezza LL con generazione uniforme e estremi a 0\,^\circC soddisfa −T′′=s-T''=s. Con nn nodi interni e passo h=Ln+1h=\frac L{n+1} le differenze finite danno 2Ti−Ti−1−Ti+1=h2s2T_i-T_{i-1}-T_{i+1}=h^2s, cioè KnT=h2s 1K_n\mathbf T=h^2s\,\mathbf 1 con Kn=tridiag⁡(−1,2,−1)K_n=\operatorname{tridiag}(-1,2,-1). Qui BJ=I−12KnB_J=I-\frac12K_n ha autovalori cos⁡jπn+1\cos\frac{j\pi}{n+1}, quindi ρ(BJ)=cos⁡πn+1,ρ(BGS)=cos⁡2πn+1.\rho(B_J)=\cos\frac\pi{n+1},\qquad\rho(B_{GS})=\cos^2\frac\pi{n+1}. Per n=3n=3: 0,7070{,}707 e 0,50{,}5. Per n=10n=10: 0,95950{,}9595 e 0,92060{,}9206, cioè 334334 e 167167 iterazioni per guadagnare 6 cifre. Per n=100n=100: 0,999520{,}99952 e 0,999030{,}99903, 28,554 e 14,277 iterazioni. Più la griglia è fine, più ρ→1\rho\to1 e più il metodo rallenta (legato al cattivo condizionamento κ≈4(n+1)2π2\kappa\approx\frac{4(n+1)^2}{\pi^2} della stessa matrice); i metodi moderni (gradiente coniugato, multigriglia) rimediano. Per questa matrice tridiagonale, tuttavia, Cholesky costa O(n)O(n): un metodo iterativo conviene per matrici sparse non a banda stretta (griglie 2D e 3D).

5. Implementazione

python
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, ng

Output:

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.125

Il rapporto di Gauss-Seidel si assesta su ρ=0,125\rho=0{,}125. Per Jacobi alterna 0,250{,}25 e 0,50{,}5 (la media geometrica è 0,125=0,354=ρ\sqrt{0{,}125}=0{,}354=\rho): gli autovalori ±ρ\pm\rho di BJB_J 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 LL e UU della decomposizione A=D+L+UA=D+L+U con i fattori della LU: qui sono le parti strettamente triangolari di AA.
  • 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 ∥BJ∥∞<1\|B_J\|_\infty<1, la seconda a ∥BJ∥1<1\|B_J\|_1<1; per Jacobi basta una delle due.
  • Fidarsi dell'incremento piccolo quando ∥B∥≈1\|B\|\approx1: l'errore può essere ∥B∥1−∥B∥\frac{\|B\|}{1-\|B\|} 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: ρ(B)<1\rho(B)<1).

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

  1. Enunciare e dimostrare il teorema di convergenza dei metodi iterativi x(k+1)=Bx(k)+c\mathbf x^{(k+1)}=B\mathbf x^{(k)}+\mathbf c. Traccia. e(k)=Bke(0)\mathbf e^{(k)}=B^k\mathbf e^{(0)}; se ∥B∥<1\|B\|<1 tende a zero; se ρ(B)≥1\rho(B)\ge1 un autovettore dà λkv↛0\lambda^k\mathbf v\not\to0.
  2. Scrivere le matrici di iterazione di Jacobi e Gauss-Seidel e dimostrare che Jacobi converge per dominanza diagonale stretta. Traccia. BJ=−D−1(L+U)B_J=-D^{-1}(L+U), BGS=−(D+L)−1UB_{GS}=-(D+L)^{-1}U; ∥BJ∥∞=max⁡i∑j≠i∣aij∣∣aii∣<1\|B_J\|_\infty=\max_i\sum_{j\ne i}\frac{|a_{ij}|}{|a_{ii}|}<1.
  3. Stimare quante iterazioni servono per ridurre l'errore di 10−610^{-6} con ρ(B)=0,9\rho(B)=0{,}9. Traccia. k≈6−log⁡100,9=60,0458=131k\approx\frac6{-\log_{10}0{,}9}=\frac6{0{,}0458}=131.
  4. Perché l'incremento ∥x(k+1)−x(k)∥\|\mathbf x^{(k+1)}-\mathbf x^{(k)}\| piccolo non basta come criterio d'arresto? Traccia. ∥e(k)∥≤∥B∥1−∥B∥∥x(k)−x(k−1)∥\|\mathbf e^{(k)}\|\le\frac{\|B\|}{1-\|B\|}\|\mathbf x^{(k)}-\mathbf x^{(k-1)}\|: se ∥B∥→1\|B\|\to1 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. A=M−NA=M-N, Mx(k+1)=Nx(k)+bM\mathbf x^{(k+1)}=N\mathbf x^{(k)}+\mathbf b, x(k+1)=Bx(k)+c\mathbf x^{(k+1)}=B\mathbf x^{(k)}+\mathbf c, B=M−1N=I−M−1AB=M^{-1}N=I-M^{-1}A. Errore e(k)=Bke(0)\mathbf e^{(k)}=B^k\mathbf e^{(0)}.

Teorema (D). Converge per ogni x(0)\mathbf x^{(0)}   ⟺  ρ(B)<1\iff\rho(B)<1; basta ∥B∥<1\|B\|<1. Se ρ(B)≥1\rho(B)\ge1: e(0)=v\mathbf e^{(0)}=\mathbf v autovettore, λkv↛0\lambda^k\mathbf v\not\to0.

Metodi. A=D+L+UA=D+L+U (parti strettamente triangolari). Jacobi: M=DM=D, xi(k+1)=1aii(bi−∑j≠iaijxj(k))x_i^{(k+1)}=\frac1{a_{ii}}(b_i-\sum_{j\ne i}a_{ij}x_j^{(k)}), BJ=−D−1(L+U)B_J=-D^{-1}(L+U). Gauss-Seidel: M=D+LM=D+L, xi(k+1)=1aii(bi−∑j<iaijxj(k+1)−∑j>iaijxj(k))x_i^{(k+1)}=\frac1{a_{ii}}(b_i-\sum_{j<i}a_{ij}x_j^{(k+1)}-\sum_{j>i}a_{ij}x_j^{(k)}), BGS=−(D+L)−1UB_{GS}=-(D+L)^{-1}U.

Convergenza. Dominanza diagonale stretta per righe: entrambi (D per Jacobi: ∥BJ∥∞=max⁡i∑j≠i∣aij∣∣aii∣<1\|B_J\|_\infty=\max_i\sum_{j\ne i}\frac{|a_{ij}|}{|a_{ii}|}<1). SPD: Gauss-Seidel. Tridiagonale: ρGS=ρJ2\rho_{GS}=\rho_J^2. La dominanza è solo sufficiente e dipende dall'ordine: (1231)\begin{pmatrix}1&2\\3&1\end{pmatrix} ha ρJ=6\rho_J=\sqrt6, scambiando le righe ρJ=16\rho_J=\frac1{\sqrt6}. Nessun metodo domina l'altro.

Stime. ∥e(k)∥≤∥B∥k∥e(0)∥\|\mathbf e^{(k)}\|\le\|B\|^k\|\mathbf e^{(0)}\|, k≥ln⁡εln⁡∥B∥k\ge\frac{\ln\varepsilon}{\ln\|B\|}; ∥x−x(k)∥≤∥B∥1−∥B∥∥x(k)−x(k−1)∥\|\mathbf x-\mathbf x^{(k)}\|\le\frac{\|B\|}{1-\|B\|}\|\mathbf x^{(k)}-\mathbf x^{(k-1)}\| (incremento); residuo: errore ≤κ tol\le\kappa\,\text{tol}. Cifre: k≈d−log⁡10ρk\approx\frac d{-\log_{10}\rho}.

Esempio A=(4−10−14−10−14)A=\begin{pmatrix}4&-1&0\\-1&4&-1\\0&-1&4\end{pmatrix}, b=(2,4,10)\mathbf b=(2,4,10), x=(1,2,3)\mathbf x=(1,2,3), x(0)=0\mathbf x^{(0)}=\mathbf 0:

  • Jacobi: (0,5;1;2,5)(0{,}5;1;2{,}5), (0,75;1,75;2,75)(0{,}75;1{,}75;2{,}75), (0,9375;1,875;2,9375)(0{,}9375;1{,}875;2{,}9375);
  • Gauss-Seidel: (0,5;1,125;2,78125)(0{,}5;1{,}125;2{,}78125), (0,78125;1,890625;2,972656)(0{,}78125;1{,}890625;2{,}972656), (0,972656;1,986328;2,996582)(0{,}972656;1{,}986328;2{,}996582);
  • ρJ=24=0,354\rho_J=\frac{\sqrt2}4=0{,}354, ρGS=0,125\rho_{GS}=0{,}125; errori GS rapporto 0,1250{,}125, Jacobi alterna 0,250{,}25 e 0,50{,}5.

Barra con sorgente. Kn=tridiag⁡(−1,2,−1)K_n=\operatorname{tridiag}(-1,2,-1): ρJ=cos⁡πn+1\rho_J=\cos\frac\pi{n+1}, ρGS=cos⁡2πn+1\rho_{GS}=\cos^2\frac\pi{n+1}; n=100n=100: 28 55428\,554 e 14 27714\,277 iterazioni per 6 cifre. Più fine la griglia, più lento.

Passaggi principali.

  • Errore: x−x(k+1)=B(x−x(k))\mathbf x-\mathbf x^{(k+1)}=B(\mathbf x-\mathbf x^{(k)}) perché x=Bx+c\mathbf x=B\mathbf x+\mathbf c.

  • Incremento: x(k+1)−x(k)=B(x(k)−x(k−1))\mathbf x^{(k+1)}-\mathbf x^{(k)}=B(\mathbf x^{(k)}-\mathbf x^{(k-1)}), serie geometrica.

  • Esempio divergente: BJ=(0−2−30)B_J=\begin{pmatrix}0&-2\\-3&0\end{pmatrix}, λ=±6\lambda=\pm\sqrt6.

  • Controesempi: (12−2111221)\begin{pmatrix}1&2&-2\\1&1&1\\2&2&1\end{pmatrix}: ρJ=0\rho_J=0, ρGS=2\rho_{GS}=2; (2−11222−1−12)\begin{pmatrix}2&-1&1\\2&2&2\\-1&-1&2\end{pmatrix}: ρJ=1,118\rho_J=1{,}118, ρGS=0,5\rho_{GS}=0{,}5.

  • Numero di iterazioni: k≈d−log⁡10ρk\approx\frac d{-\log_{10}\rho}; ρ=0,9\rho=0{,}9 e d=6d=6 danno 131131; Jacobi 2,22{,}2 iterazioni per cifra contro 1,11{,}1 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 O(n)O(n). MATLAB: ciclo x = D\(b-(L+U)*x), pcg, gmres.

Errori tipici.

  • LL, UU scambiati con i fattori della LU.
  • Valori nuovi usati in Jacobi o vecchi in Gauss-Seidel.
  • Incremento piccolo preso per errore piccolo con ∥B∥≈1\|B\|\approx1.
  • Dominanza vista come condizione necessaria.

Esercizi su questo argomento

Teoria collegata