Salta al contenuto
Note per Studenti Esercizio - conduzione del calore in una barra con Jacobi e Gauss-Seidel

Esercizio - conduzione del calore in una barra con Jacobi e Gauss-Seidel

Teoria: Metodi iterativi - Jacobi, Gauss-Seidel e convergenzaSi spezza $A=M-N$ con $M$ facile da invertire e si itera $M\mathbf x^{(k+1)}=N\mathbf x^{(k)}+\mathbf b$, cioè $\mathbf x^{(k+1)}=B\mathbf x^{(k)}+\mathbf c$ con $B=M^{-1}N=I-M^{-1}A$. Con $A=D+L+U$ (diagonale, parte strettamente inferiore e superiore): Jacobi $M=D$, $x_i^{(k+1)}=\frac1{a_{ii}}\big(b_i-\sum_{j\ne i}a_{ij}x_j^{(k)}\big)$; Gauss-Seidel $M=D+L$, usa subito i valori nuovi $x_j^{(k+1)}$, $j<i$. Convergenza per ogni $\mathbf x^{(0)}$ se e solo se $\rho(B)<1$ (D); basta $|B|<1$. Matrice a dominanza diagonale stretta per righe: convergono entrambi; $A$ SPD: converge Gauss-Seidel; per matrici tridiagonali $\rho(B_{GS})=\rho(B_J)^2$. Errore: $\mathbf e^{(k)}=B^k\mathbf e^{(0)}$, $|\mathbf e^{(k)}|\le|B|^k|\mathbf e^{(0)}|$ e $|\mathbf x-\mathbf x^{(k)}|\le\frac{|B|}{1-|B|}|\mathbf x^{(k)}-\mathbf x^{(k-1)}|$. Per guadagnare $d$ cifre servono $k\approx\frac d{-\log_{10}\rho(B)}$ iterazioni.Metodi iterativi - Jacobi, Gauss-Seidel e convergenza →; la stessa matrice è in Esercizio - condizionamento della matrice di rigidezza di una catena di molle.

Testo. Una barra di lunghezza L=1L=1 m con generazione interna di calore uniforme ha, a regime, temperatura T(x)T(x) che soddisfa −T′′=s-T''=s con s=8 K/m2s=8\ \text{K/m}^2 e T(0)=T(L)=0\,^\circC (scostamento dalla temperatura degli estremi). La soluzione esatta è T(x)=4x(1−x)T(x)=4x(1-x). Si discretizza con n=3n=3 nodi interni a passo h=L4=0,25h=\frac L4=0{,}25 m: la formula alle differenze centrate dà 2Ti−Ti−1−Ti+1=h2s=0,5 K(i=1,2,3, T0=T4=0).2T_i-T_{i-1}-T_{i+1}=h^2s=0{,}5\ \text{K}\qquad(i=1,2,3,\ T_0=T_4=0).

  1. Scrivere il sistema e verificare che la soluzione esatta del sistema è Ti=T(xi)T_i=T(x_i).
  2. Eseguire tre iterazioni di Jacobi e tre di Gauss-Seidel da T(0)=0\mathbf T^{(0)}=\mathbf 0 e calcolare gli errori.
  3. Calcolare ρ(BJ)\rho(B_J) e ρ(BGS)\rho(B_{GS}) e il numero di iterazioni per ridurre l'errore di un fattore 10−310^{-3}.
  4. Quante iterazioni servirebbero con n=100n=100? Conviene un metodo iterativo?

Soluzione

1. Sistema. KT=0,5 1K\mathbf T=0{,}5\,\mathbf 1 con K=(2−10−12−10−12)K=\begin{pmatrix}2&-1&0\\-1&2&-1\\0&-1&2\end{pmatrix}. I nodi sono x=0,25; 0,5; 0,75x=0{,}25;\,0{,}5;\,0{,}75 e T(xi)=4xi(1−xi)=(0,75; 1; 0,75)T(x_i)=4x_i(1-x_i)=(0{,}75;\ 1;\ 0{,}75) K. Verifica: 2⋅0,75−1=0,52\cdot0{,}75-1=0{,}5 ✓; 2⋅1−0,75−0,75=0,52\cdot1-0{,}75-0{,}75=0{,}5 ✓; 2⋅0,75−1=0,52\cdot0{,}75-1=0{,}5 ✓. (Le differenze centrate sono esatte per i polinomi di secondo grado, quindi la soluzione discreta coincide con quella continua nei nodi.) Esplicitando le incognite: T1=0,5+T22T_1=\frac{0{,}5+T_2}2, T2=0,5+T1+T32T_2=\frac{0{,}5+T_1+T_3}2, T3=0,5+T22T_3=\frac{0{,}5+T_2}2.

2. Iterazioni (temperature in K, errore in norma ∞\infty rispetto a (0,75;1;0,75)(0{,}75;1;0{,}75)). Jacobi:

  • k=1k=1: T1=0,5+02=0,25T_1=\frac{0{,}5+0}2=0{,}25; T2=0,52=0,25T_2=\frac{0{,}5}2=0{,}25; T3=0,25T_3=0{,}25. Errore 0,750{,}75.
  • k=2k=2: T1=0,5+0,252=0,375T_1=\frac{0{,}5+0{,}25}2=0{,}375; T2=0,5+0,25+0,252=0,5T_2=\frac{0{,}5+0{,}25+0{,}25}2=0{,}5; T3=0,375T_3=0{,}375. Errore 0,50{,}5.
  • k=3k=3: T1=0,5+0,52=0,5T_1=\frac{0{,}5+0{,}5}2=0{,}5; T2=0,5+0,375+0,3752=0,625T_2=\frac{0{,}5+0{,}375+0{,}375}2=0{,}625; T3=0,5T_3=0{,}5. Errore 0,3750{,}375.

Gauss-Seidel:

  • k=1k=1: T1=0,52=0,25T_1=\frac{0{,}5}2=0{,}25; T2=0,5+0,25+02=0,375T_2=\frac{0{,}5+0{,}25+0}2=0{,}375; T3=0,5+0,3752=0,4375T_3=\frac{0{,}5+0{,}375}2=0{,}4375. Errore 0,6250{,}625.
  • k=2k=2: T1=0,5+0,3752=0,4375T_1=\frac{0{,}5+0{,}375}2=0{,}4375; T2=0,5+0,4375+0,43752=0,6875T_2=\frac{0{,}5+0{,}4375+0{,}4375}2=0{,}6875; T3=0,5+0,68752=0,59375T_3=\frac{0{,}5+0{,}6875}2=0{,}59375. Errore 0,31250{,}3125.
  • k=3k=3: T1=0,5+0,68752=0,59375T_1=\frac{0{,}5+0{,}6875}2=0{,}59375; T2=0,5+0,59375+0,593752=0,84375T_2=\frac{0{,}5+0{,}59375+0{,}59375}2=0{,}84375; T3=0,5+0,843752=0,671875T_3=\frac{0{,}5+0{,}84375}2=0{,}671875. Errore 0,156250{,}15625.

Dopo 3 iterazioni la temperatura al centro è 0,6250{,}625 K (Jacobi) o 0,8440{,}844 K (Gauss-Seidel) contro 11 K: la convergenza è lenta. Il rapporto fra errori successivi di Gauss-Seidel è esattamente 0,50{,}5 da k=2k=2 in poi.

3. Raggi spettrali. BJ=I−12K=(0120120120120)B_J=I-\frac12K=\begin{pmatrix}0&\frac12&0\\\frac12&0&\frac12\\0&\frac12&0\end{pmatrix} ha autovalori cos⁡jπ4\cos\frac{j\pi}4: ±22, 0\pm\frac{\sqrt2}2,\ 0, quindi ρ(BJ)=cos⁡π4=0,7071,ρ(BGS)=ρ(BJ)2=0,5(matrice tridiagonale).\rho(B_J)=\cos\frac\pi4=0{,}7071,\qquad\rho(B_{GS})=\rho(B_J)^2=0{,}5\quad(\text{matrice tridiagonale}). Per ridurre l'errore di 10−310^{-3}: Jacobi k≥3−log⁡100,7071=30,1505=19,9⇒20k\ge\frac3{-\log_{10}0{,}7071}=\frac3{0{,}1505}=19{,}9\Rightarrow20 iterazioni; Gauss-Seidel k≥3−log⁡100,5=30,301=9,97⇒10k\ge\frac3{-\log_{10}0{,}5}=\frac3{0{,}301}=9{,}97\Rightarrow10 iterazioni. Gauss-Seidel dimezza il numero di iterazioni.

4. Griglia fine. In generale ρ(BJ)=cos⁡πn+1\rho(B_J)=\cos\frac\pi{n+1}. Per n=100n=100: ρJ=0,99952\rho_J=0{,}99952, ρGS=0,99903\rho_{GS}=0{,}99903; per guadagnare 6 cifre servono 6−log⁡10ρ=28 554\frac6{-\log_{10}\rho}=28\,554 iterazioni di Jacobi e 14 27714\,277 di Gauss-Seidel. Ogni iterazione costa ≈5n\approx5n operazioni: in totale ≈7⋅106\approx7\cdot10^6 flop per Gauss-Seidel, contro ≈8n=800\approx8n=800 flop per risolvere direttamente il sistema tridiagonale (Cholesky o LU per matrici tridiagonali: O(n)O(n)). Per una matrice a banda stretta conviene il metodo diretto. Gli iterativi servono per matrici sparse di grandi dimensioni non a banda stretta (griglie 2D o 3D), e anche lì con accelerazioni (gradiente coniugato, multigriglia), perché ρ→1\rho\to1 al raffinare della griglia.

Risultati: errori dopo 3 iterazioni: Jacobi 0,3750{,}375 K, Gauss-Seidel 0,1560{,}156 K; ρJ=0,7071\rho_J=0{,}7071, ρGS=0,5\rho_{GS}=0{,}5; 20 e 10 iterazioni per 10−310^{-3}; con n=100n=100: 28 55428\,554 e 14 27714\,277 iterazioni per 10−610^{-6}.

Errori tipici. Usare ρGS=ρJ\rho_{GS}=\rho_J (vale il quadrato); dimenticare che h2sh^2s è il termine noto di ogni equazione e non solo del nodo centrale; concludere che un metodo iterativo è sempre più economico di uno diretto.

Versione ripasso

(Metodi iterativi - Jacobi, Gauss-Seidel e convergenzaSi spezza $A=M-N$ con $M$ facile da invertire e si itera $M\mathbf x^{(k+1)}=N\mathbf x^{(k)}+\mathbf b$, cioè $\mathbf x^{(k+1)}=B\mathbf x^{(k)}+\mathbf c$ con $B=M^{-1}N=I-M^{-1}A$. Con $A=D+L+U$ (diagonale, parte strettamente inferiore e superiore): Jacobi $M=D$, $x_i^{(k+1)}=\frac1{a_{ii}}\big(b_i-\sum_{j\ne i}a_{ij}x_j^{(k)}\big)$; Gauss-Seidel $M=D+L$, usa subito i valori nuovi $x_j^{(k+1)}$, $j<i$. Convergenza per ogni $\mathbf x^{(0)}$ se e solo se $\rho(B)<1$ (D); basta $|B|<1$. Matrice a dominanza diagonale stretta per righe: convergono entrambi; $A$ SPD: converge Gauss-Seidel; per matrici tridiagonali $\rho(B_{GS})=\rho(B_J)^2$. Errore: $\mathbf e^{(k)}=B^k\mathbf e^{(0)}$, $|\mathbf e^{(k)}|\le|B|^k|\mathbf e^{(0)}|$ e $|\mathbf x-\mathbf x^{(k)}|\le\frac{|B|}{1-|B|}|\mathbf x^{(k)}-\mathbf x^{(k-1)}|$. Per guadagnare $d$ cifre servono $k\approx\frac d{-\log_{10}\rho(B)}$ iterazioni.Metodi iterativi - Jacobi, Gauss-Seidel e convergenza →)

−T′′=8-T''=8, T(0)=T(1)=0T(0)=T(1)=0, T=4x(1−x)T=4x(1-x); n=3n=3, h=14h=\frac14: 2Ti−Ti−1−Ti+1=h2s=0,52T_i-T_{i-1}-T_{i+1}=h^2s=0{,}5; esatto (0,75;1;0,75)(0{,}75;1;0{,}75).

  • Jacobi: (0,25)3(0{,}25)^3; (0,375;0,5;0,375)(0{,}375;0{,}5;0{,}375); (0,5;0,625;0,5)(0{,}5;0{,}625;0{,}5); errori 0,75; 0,5; 0,3750{,}75;\,0{,}5;\,0{,}375.

  • Gauss-Seidel: (0,25;0,375;0,4375)(0{,}25;0{,}375;0{,}4375); (0,4375;0,6875;0,59375)(0{,}4375;0{,}6875;0{,}59375); (0,59375;0,84375;0,671875)(0{,}59375;0{,}84375;0{,}671875); errori 0,625; 0,3125; 0,156250{,}625;\,0{,}3125;\,0{,}15625 (rapporto 0,50{,}5).

  • BJ=I−12KB_J=I-\frac12K, ρJ=cos⁡π4=0,7071\rho_J=\cos\frac\pi4=0{,}7071, ρGS=ρJ2=0,5\rho_{GS}=\rho_J^2=0{,}5. Fattore 10−310^{-3}: 30,1505→20\frac3{0{,}1505}\to20 (Jacobi), 30,301→10\frac3{0{,}301}\to10 (GS).

  • n=100n=100: ρJ=cos⁡π101=0,99952\rho_J=\cos\frac\pi{101}=0{,}99952; 28 55428\,554 e 14 27714\,277 iterazioni per 10−610^{-6} (≈7⋅106\approx7\cdot10^6 flop) contro ≈8n\approx8n del metodo diretto tridiagonale.

  • Equazioni: T1=0,5+T22T_1=\frac{0{,}5+T_2}2, T2=0,5+T1+T32T_2=\frac{0{,}5+T_1+T_3}2, T3=0,5+T22T_3=\frac{0{,}5+T_2}2; verifica esatta 2⋅0,75−1=0,52\cdot0{,}75-1=0{,}5.

  • Dopo 3 iterazioni la temperatura al centro è 0,6250{,}625 (Jacobi), 0,8440{,}844 (GS), esatta 11 K: convergenza lenta; le differenze centrate sono esatte sui polinomi di grado 2.

  • Per griglie fini ρ→1\rho\to1: servono accelerazioni (gradiente coniugato, multigriglia); per matrici a banda stretta conviene il diretto.

Errori tipici: ρGS=ρJ\rho_{GS}=\rho_J (è il quadrato); termine noto h2sh^2s ovunque; iterativo sempre più economico.

Teoria collegata