Salta al contenuto
Note per Studenti Condizionamento di un problema e stabilità di un algoritmo

Condizionamento di un problema e stabilità di un algoritmo

In questa pagina 7

Prerequisiti: 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 → (errore relativo, unità di arrotondamento uu), Derivata - definizione e significatoLa derivata è il limite del rapporto incrementale; geometricamente è la pendenza della retta tangente. f è derivabile in x0 se e solo se f(x) = f(x0) + f'(x0)(x − x0) + o(x − x0); derivabile implica continua, non viceversa. Derivata destra e sinistra, punti angolosi, flessi a tangente verticale, cuspidi.Derivata - definizione e significato → e Teoremi di Rolle e di LagrangeRolle: f continua su [a,b], derivabile in ]a,b[, f(a) = f(b) ⇒ esiste c in ]a,b[ con f'(c) = 0. Lagrange (valor medio): stesse ipotesi senza f(a) = f(b) ⇒ esiste c con f'(c) = (f(b) − f(a))/(b − a): la tangente in c è parallela alla corda. Conseguenza: su un intervallo f è costante se e solo se f' = 0; su un insieme che non è un intervallo è solo costante a tratti (arctan x + arctan(1/x)).Teoremi di Rolle e di Lagrange →.

Il calcolo numerico si occupa di due domande distinte che è facile confondere:

  • quanto è sensibile il problema ai piccoli errori sui dati? (condizionamento, proprietà del problema);
  • quanto è sensibile il procedimento con cui lo risolviamo agli errori di arrotondamento? (stabilità, proprietà dell'algoritmo).

Le sorgenti dell'errore

L'errore con cui si ottiene un risultato ha tre origini:

  1. Errore sui dati (o inerente): i dati di partenza sono misure (un calibro dà 12,347 mm12{,}347\,\text{mm} con incertezza ±5⋅10−4 mm\pm 5\cdot 10^{-4}\,\text{mm}) oppure numeri reali arrotondati per entrare nel calcolatore.
  2. Errore di troncamento (o analitico): il metodo sostituisce un oggetto infinito o continuo con uno finito. Esempio: si calcola una derivata con un rapporto incrementale, si arresta una serie, si approssima un integrale con una somma.
  3. Errore di arrotondamento: ogni operazione di macchina commette un errore relativo ≤u\le u.

Problemi ben posti

Definizione (problema ben posto, Hadamard). Il problema "dato dd, trova xx tale che F(x,d)=0F(x, d) = 0" è ben posto se: (1) la soluzione xx esiste; (2) è unica; (3) dipende con continuità dai dati dd. Altrimenti è mal posto.

La terza condizione è la più importante in pratica: se una piccola variazione di dd può produrre una grande variazione di xx, i dati inevitabilmente sporchi (misure, arrotondamenti) rendono il risultato inaffidabile. La continuità però non basta: serve sapere quanto il problema amplifica.

Numero di condizionamento

Si perturba il dato xx in x~=x(1+ε)\tilde x = x(1 + \varepsilon), con ∣ε∣|\varepsilon| piccolo, e si calcola y=f(x)y = f(x). Per la formula di Lagrange (o di Taylor al primo ordine, Formula di Taylor con resto di LagrangeSe f ha n+1 derivate continue su [a,b], l'errore tra f e il suo polinomio di Taylor si scrive esattamente come f^(n+1)(c)(x-x0)^(n+1)/(n+1)! per un c opportuno: serve a stimare l'errore su tutto un intervallo e a scegliere il grado del polinomio.Formula di Taylor con resto di Lagrange →) f(x~)−f(x)=f′(ξ)(x~−x)≈f′(x) x ε,f(\tilde x) - f(x) = f'(\xi)(\tilde x - x) \approx f'(x)\,x\,\varepsilon, e dividendo per f(x)f(x) si ottiene l'errore relativo sul risultato: f(x~)−f(x)f(x)≈xf′(x)f(x)⏟K(x)  ε.\frac{f(\tilde x) - f(x)}{f(x)} \approx \underbrace{\frac{x f'(x)}{f(x)}}_{K(x)}\;\varepsilon.

Definizione (numero di condizionamento). Per y=f(x)y = f(x) derivabile con xf(x)≠0x f(x) \ne 0 K(x)=∣x f′(x)f(x)∣K(x) = \left|\frac{x\,f'(x)}{f(x)}\right| è il fattore con cui un errore relativo sul dato xx viene moltiplicato nel risultato. Il problema è ben condizionato se KK è piccolo (qualche unità), mal condizionato se KK è grande.

Regola pratica. Se i dati hanno kk cifre significative corrette, il risultato ne ha circa k−log⁡10Kk - \log_{10} K. Un errore di solo arrotondamento (u≈10−16u \approx 10^{-16}) con K=1010K = 10^{10} lascia solo 66 cifre.

Altri casi con più variabili: per y=f(x1,…,xn)y = f(x_1, \dots, x_n) ogni dato ha il suo Ki=∣xi ∂iff∣K_i = \left|\frac{x_i\,\partial_i f}{f}\right| e l'errore massimo è circa ∑iKi∣εi∣\sum_i K_i |\varepsilon_i|.

operazione KK commento
a⋅ba \cdot b, a/ba / b 11 per ciascun dato errori relativi che si sommano, ben condizionato
a+ba + b, a−ba - b ∣a∣∣a±b∣\dfrac{\lvert a \rvert}{\lvert a \pm b \rvert}, ∣b∣∣a±b∣\dfrac{\lvert b \rvert}{\lvert a \pm b \rvert} mal condizionato quando a≈ba \approx b nella differenza: è la cancellazione
x\sqrt x 12\tfrac12 gli errori si dimezzano
xnx^n ∣n∣\lvert n \rvert
exe^x ∣x∣\lvert x \rvert mal condizionato solo per ∣x∣\lvert x \rvert grande
ln⁡x\ln x 1∣ln⁡x∣\dfrac{1}{\lvert \ln x \rvert} mal condizionato vicino a x=1x = 1 (dove ln⁡x=0\ln x = 0)
cos⁡x\cos x ∣xtan⁡x∣\lvert x \tan x \rvert mal condizionato vicino a π2\frac\pi2

Esempio 1: il coseno vicino a π2\frac\pi2. Per x=1,57x = 1{,}57: K=1,57⋅tan⁡1,57=1,57⋅1255,77≈1971,6K = 1{,}57 \cdot \tan 1{,}57 = 1{,}57 \cdot 1255{,}77 \approx 1971{,}6. Si perturba xx con errore relativo 10−410^{-4}, cioè x~=1,57⋅1,0001=1,570157\tilde x = 1{,}57 \cdot 1{,}0001 = 1{,}570157. Previsione: errore relativo su cos⁡x\cos x circa 1971,6⋅10−4≈0,1971971{,}6 \cdot 10^{-4} \approx 0{,}197 (19,7%19{,}7\%). Calcolo diretto: cos⁡1,57=7,9633⋅10−4\cos 1{,}57 = 7{,}9633\cdot 10^{-4} e cos⁡1,570157=6,3933⋅10−4\cos 1{,}570157 = 6{,}3933\cdot 10^{-4}, variazione relativa 1,570⋅10−47,9633⋅10−4=0,1972\frac{1{,}570\cdot 10^{-4}}{7{,}9633\cdot 10^{-4}} = 0{,}1972 ✓. Una perturbazione dello 0,01%0{,}01\% sull'angolo cambia il risultato del 20%20\%: vicino a π2\frac\pi2 la pendenza del coseno vale circa −1-1, quindi la variazione assoluta del risultato è pari a quella del dato (1,57⋅10−41{,}57\cdot 10^{-4}); ma il valore del coseno è prossimo a zero, e diviso per un numero così piccolo l'errore relativo esplode.

Esempio 2: radice doppia. Le radici di (x−1)2=ε(x-1)^2 = \varepsilon sono x=1±εx = 1 \pm \sqrt\varepsilon. Se il termine noto del polinomio x2−2x+1x^2 - 2x + 1 viene perturbato di ε=10−10\varepsilon = 10^{-10} (errore minuscolo, come un arrotondamento) le radici si spostano di ε=10−5\sqrt\varepsilon = 10^{-5}: amplificazione 10510^{5}. Per ε=−10−10\varepsilon = -10^{-10} le radici diventano complesse 1±10−5i1 \pm 10^{-5}i (Python: np.roots([1, -2, 1 + 1e-10]) dà 1 ± 1e-5j). Una radice multipla è sempre mal condizionata: il grafico del polinomio è tangente all'asse, una piccola traslazione verticale lo allontana molto in orizzontale.

Esempio 3: sistema lineare. Il sistema x+y=2x + y = 2, x+1,0001 y=2,0001x + 1{,}0001\,y = 2{,}0001 ha soluzione (1,1)(1, 1). Se il secondo termine noto passa da 2,00012{,}0001 a 2,00022{,}0002 (variazione relativa 5⋅10−55\cdot 10^{-5}) la soluzione diventa (0,2)(0, 2): il risultato cambia del 100%100\%. Le due rette sono quasi parallele; amplificazione dell'ordine di 2⋅1042\cdot 10^4. Il numero di condizionamento di un sistema è trattato in 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 →.

Stabilità di un algoritmo

Un algoritmo calcola y=f(x)y = f(x) con una successione di operazioni elementari; ciascuna introduce un errore ≤u\le u, e questi errori si propagano e si possono amplificare. Sia y^\hat y il risultato calcolato.

Definizione (errore in avanti e all'indietro).

  • Errore in avanti (forward): ∣y^−f(x)∣∣f(x)∣\dfrac{|\hat y - f(x)|}{|f(x)|}.
  • Errore all'indietro (backward): la perturbazione Δx\Delta x dei dati per cui y^\hat y è il risultato esatto, y^=f(x+Δx)\hat y = f(x + \Delta x), cioè ∣Δx∣∣x∣\dfrac{|\Delta x|}{|x|}. Un algoritmo è stabile all'indietro se l'errore all'indietro è dell'ordine di uu (di poco più di un arrotondamento sui dati).

Collegamento fondamentale, dalla definizione di KK: errore in avanti  ≲  K(x)⋅errore all’indietro  ≈  K(x)⋅u.\text{errore in avanti} \;\lesssim\; K(x) \cdot \text{errore all'indietro} \;\approx\; K(x)\cdot u . Quindi un algoritmo stabile applicato a un problema ben condizionato dà un risultato accurato. Se invece il problema è mal condizionato (KK grande), nessun algoritmo può dare di più di circa log⁡10(1/(Ku))\log_{10}(1/(K u)) cifre corrette: l'errore è nel problema, non nel metodo. Se il problema è ben condizionato e il risultato è sbagliato, l'algoritmo è instabile.

Esempio svolto: ricorrenza instabile. Sia In=∫01xnex−1 dxI_n = \displaystyle\int_0^1 x^n e^{x-1}\,dx per n≥0n \ge 0. Per parti (Integrazione per parti∫ f·g' dx = f·g − ∫ f'·g dx (regola del prodotto letta al contrario). Si usa per log x, arcsin x, arctan x (scritti come "funzione per 1"), per sin²x, cos²x, sinh²x, cosh²x (integrale circolare: l'integrale di partenza ricompare e si porta a sinistra) e per prodotti come x^n·e^(αx), x^n·sin(βx), e^(αx)·sin(βx).Integrazione per parti →): In=[xnex−1]01−n∫01xn−1ex−1dx=1−n In−1,I0=1−e−1=0,63212…I_n = \bigl[x^n e^{x-1}\bigr]_0^1 - n\int_0^1 x^{n-1}e^{x-1}dx = 1 - n\,I_{n-1}, \qquad I_0 = 1 - e^{-1} = 0{,}63212\ldots Il problema è ben condizionato (un integrale di una funzione positiva e limitata: 1e(n+1)≤In≤1n+1\frac{1}{e(n+1)} \le I_n \le \frac1{n+1}, cioè InI_n è piccolo e decrescente). Si prova la ricorrenza in avanti con 44 cifre significative, partendo da I0→0,6321I_0 \to 0{,}6321 (errore e0=2,06⋅10−5e_0 = 2{,}06\cdot 10^{-5}):

nn InI_n calcolato InI_n esatto errore assoluto errore/e0/e_0
00 0,63210{,}6321 0,6321210{,}632121 2,1⋅10−52{,}1\cdot 10^{-5} 11
11 0,36790{,}3679 0,3678790{,}367879 2,1⋅10−52{,}1\cdot 10^{-5} 11
22 0,26420{,}2642 0,2642410{,}264241 4,1⋅10−54{,}1\cdot 10^{-5} 22
33 0,20740{,}2074 0,2072770{,}207277 1,2⋅10−41{,}2\cdot 10^{-4} 66
44 0,17040{,}1704 0,1708930{,}170893 4,9⋅10−44{,}9\cdot 10^{-4} 2424
55 0,14800{,}1480 0,1455330{,}145533 2,5⋅10−32{,}5\cdot 10^{-3} 120120
66 0,11200{,}1120 0,1268020{,}126802 1,5⋅10−21{,}5\cdot 10^{-2} ≈720\approx 720
77 0,21600{,}2160 0,1123840{,}112384 1,0⋅10−11{,}0\cdot 10^{-1} ≈5040\approx 5040

Il motivo: se I~n−1=In−1+en−1\tilde I_{n-1} = I_{n-1} + e_{n-1}, allora I~n=1−n(In−1+en−1)\tilde I_n = 1 - n(I_{n-1} + e_{n-1}) e quindi en=−n en−1e_n = -n\,e_{n-1}, cioè ∣en∣=n! ∣e0∣.|e_n| = n!\,|e_0|. Ad ogni passo l'errore viene moltiplicato per nn: già a n=7n = 7 il risultato è sbagliato quasi del 100%100\%. In doppia precisione e0≈10−16e_0 \approx 10^{-16}, e 18!⋅10−16≈0,618! \cdot 10^{-16} \approx 0{,}6: la ricorrenza in avanti dà I20=−30,19I_{20} = -30{,}19, un valore assurdo (l'integrale di una funzione positiva è positivo).

Rimedio. Si inverte la ricorrenza: In−1=1−InnI_{n-1} = \dfrac{1 - I_n}{n}. Ora l'errore viene diviso per nn a ogni passo: en−1=−en/ne_{n-1} = -e_n/n. Si può partire da un valore anche grossolano a un indice alto NN, ad esempio IN≈0I_N \approx 0 (l'errore è ≤1N+1\le \frac{1}{N+1}), e a nn basso l'errore residuo è n!N!⋅1N+1\frac{n!}{N!}\cdot\frac{1}{N+1}. Con 44 cifre e partendo da I10≈0I_{10} \approx 0 si ottiene all'indietro I9=0,1000I_9 = 0{,}1000 (esatto 0,09160{,}0916), I8=0,1000I_8 = 0{,}1000 (0,10090{,}1009), I7=0,1125I_7 = 0{,}1125 (0,11240{,}1124), I6=0,1268I_6 = 0{,}1268 (0,12680{,}1268), …\dots, I0=0,6321I_0 = 0{,}6321 ✓: le cifre corrette sono quelle del dato, nessuna amplificazione. Lo stesso problema, due algoritmi: uno instabile, uno stabile.

Consistenza, stabilità e convergenza di uno schema numerico

Un metodo numerico dipende da un parametro che ne fissa l'accuratezza (il passo hh, il numero nn di iterazioni o nodi): Fn(xn,d)=0F_n(x_n, d) = 0 approssima F(x,d)=0F(x, d) = 0.

Definizione.

  • Consistenza: se si inserisce nello schema la soluzione esatta xx, il residuo tende a zero per h→0h \to 0 (n→∞n \to \infty): lo schema "assomiglia" al problema.
  • Stabilità: la soluzione numerica dipende con continuità, in modo uniforme rispetto a hh, dai dati: piccole perturbazioni dei dati non vengono amplificate al diminuire di hh.
  • Convergenza: xn→xx_n \to x per h→0h \to 0.

Teorema (di equivalenza di Lax-Richtmyer). Per un problema ben posto e lineare, uno schema consistente è convergente se e solo se è stabile. Per i problemi non lineari vale in generale almeno la direzione consistenza + stabilità ⇒\Rightarrow convergenza.

Perché funziona. La soluzione esatta xx, inserita nello schema, non lo soddisfa esattamente: lascia un residuo τh\tau_h (errore di troncamento), cioè xx è la soluzione dello schema con dati perturbati di τh\tau_h. La soluzione numerica xhx_h è invece la soluzione dello schema con i dati veri. La stabilità dice che due soluzioni dello schema con dati che differiscono di τh\tau_h distano al più C ∣τh∣C\,|\tau_h|, con CC indipendente da hh. Quindi ∣x−xh∣≤C ∣τh∣→0|x - x_h| \le C\,|\tau_h| \to 0 per la consistenza. Se CC dipendesse da hh e crescesse (per esempio come 1/h1/h), il prodotto C ∣τh∣C\,|\tau_h| potrebbe non tendere a zero: per questo la stabilità deve essere uniforme. Lo schema si applica alle equazioni differenziali in Metodi di Eulero esplicito, implicito e Crank-NicolsonProblema di Cauchy $y'=f(t,y)$, $y(t_0)=y_0$, con $f$ lipschitziana in $y$ (costante $L$): ben posto. Nodi $t_n=t_0+nh$, $u_n\approx y(t_n)$. Eulero esplicito $u_{n+1}=u_n+h,f(t_n,u_n)$; Eulero implicito $u_{n+1}=u_n+h,f(t_{n+1},u_{n+1})$ (equazione da risolvere a ogni passo: punto fisso se $hL<1$, Newton, o formula chiusa se $f$ è lineare); Crank-Nicolson $u_{n+1}=u_n+\frac h2[f(t_n,u_n)+f(t_{n+1},u_{n+1})]$ (regola dei trapezi). Errore di troncamento locale $\tau_n=\frac{y(t_{n+1})-y(t_n)}h-\Phi$: $\frac h2y''$ (EE), $-\frac h2y''$ (EI), $-\frac{h^2}{12}y'''$ (CN). Consistenza + stabilità $\Rightarrow$ convergenza: ordine 1 per EE e EI, ordine 2 per CN, cioè errore globale $O(h)$ e $O(h^2)$; per EE $|e_n|\le\frac{Mh}{2L}\big(e^{L(t_n-t_0)}-1\big)$ con $M=\max|y''|$ (D). Dimezzando $h$ l'errore si divide per 2 (EE, EI) o per 4 (CN).Metodi di Eulero esplicito, implicito e Crank-Nicolson →, dove τh\tau_h è l'errore di troncamento locale.

Esempio svolto: derivata numerica. Per approssimare f′(x)f'(x) si usa il rapporto incrementale Dh=f(x+h)−f(x)hD_h = \dfrac{f(x + h) - f(x)}{h}.

  • Errore di troncamento: dallo sviluppo di Taylor, Dh−f′(x)=h2f′′(ξ)D_h - f'(x) = \frac h2 f''(\xi). Tende a zero con hh (schema consistente, di ordine 11).
  • Errore di arrotondamento: i due valori f(x+h)f(x+h) e f(x)f(x) hanno ciascuno errore relativo uu; la loro differenza (numeri quasi uguali!) ha errore assoluto ≈2u∣f∣\approx 2u|f|, e dividendo per hh l'errore diventa ≈2u∣f∣h\approx \frac{2u|f|}{h}: cresce al diminuire di hh.
  • Errore totale E(h)≈h2∣f′′∣+2u∣f∣hE(h) \approx \dfrac h2|f''| + \dfrac{2u|f|}{h}. Il minimo è per hott=2u∣f∣∣f′′∣h_{\text{ott}} = 2\sqrt{\dfrac{u|f|}{|f''|}}, circa u≈10−8\sqrt u \approx 10^{-8} in doppia precisione.

Per f=exf = e^x in x=1x = 1 (f′=e=2,71828…f' = e = 2{,}71828\ldots), errore relativo calcolato:

hh 10−210^{-2} 10−410^{-4} 10−610^{-6} 10−810^{-8} 10−1010^{-10} 10−1210^{-12}
errore relativo 5,0⋅10−35{,}0\cdot 10^{-3} 5,0⋅10−55{,}0\cdot 10^{-5} 5,0⋅10−75{,}0\cdot 10^{-7} 2,4⋅10−92{,}4\cdot 10^{-9} 5,7⋅10−75{,}7\cdot 10^{-7} 1,6⋅10−41{,}6\cdot 10^{-4}

L'errore scende come hh (troncamento) fino a h≈10−8h \approx 10^{-8}, poi risale come 1/h1/h (arrotondamento): rimpicciolire hh oltre il necessario peggiora il risultato. Nel linguaggio delle definizioni: lo schema è consistente (il troncamento tende a zero), ma una perturbazione δ\delta dei dati f(x)f(x), f(x+h)f(x+h) produce sul risultato un errore fino a 2δ/h2\delta/h, con un fattore di amplificazione 2/h2/h che non è limitato uniformemente in hh. Lo schema non è stabile rispetto agli errori di arrotondamento, e infatti in aritmetica di macchina non converge per h→0h \to 0.

Codice

python
import math

I = 1 - math.exp(-1)                     # I_n = integrale di x^n e^(x-1) su [0,1]
for n in range(1, 21):
    I = 1 - n * I                        # in avanti: instabile
print("avanti   I_20 =", I)
J = 0.0
for n in range(40, 20, -1):
    J = (1 - J) / n                      # all'indietro: stabile, parte da I_40 ~ 0
print("indietro I_20 =", J)

for k in (2, 4, 6, 8, 10, 12):           # derivata numerica di exp in x = 1
    h = 10.0**-k
    print(k, abs((math.exp(1 + h) - math.exp(1)) / h - math.e) / math.e)

Output:

avanti   I_20 = -30.19239488558378
indietro I_20 = 0.045544884075818054
2 0.005016708416805288
4 5.000166739738369e-05
6 4.999377015549417e-07
8 2.429016271026634e-09
10 5.693704999536528e-07
12 0.00015903952213936482

In MATLAB il numero di condizionamento di una matrice è cond(A); per le derivate diff e per le radici di un polinomio roots.

Errori tipici

  • Confondere condizionamento e stabilità: il primo riguarda il problema (indipendente dall'algoritmo), la seconda l'algoritmo. Un metodo instabile si cambia; un problema mal condizionato si può solo riformulare o accettare.
  • Credere che ridurre hh migliori sempre un'approssimazione: oltre hotth_{\text{ott}} domina l'arrotondamento.
  • Calcolare KK come ∣f′(x)∣|f'(x)| (condizionamento assoluto): il fattore relativo è ∣xf′(x)f(x)∣\left|\frac{xf'(x)}{f(x)}\right|.
  • Dedurre dal fatto che l'algoritmo è "corretto" (formula giusta) che sia anche stabile: la ricorrenza In=1−nIn−1I_n = 1 - nI_{n-1} è esatta ma instabile.

Domande d'esame

  1. Quando un problema è ben posto? Risposta: se la soluzione esiste, è unica e dipende con continuità dai dati.
  2. Definire il numero di condizionamento di y=f(x)y = f(x) e calcolarlo per x\sqrt x. Risposta: K=∣xf′(x)/f(x)∣K = |xf'(x)/f(x)|; per x\sqrt x vale x⋅12x/x=12x\cdot\frac{1}{2\sqrt x}/\sqrt x = \frac12.
  3. Differenza tra problema mal condizionato e algoritmo instabile. Risposta: il primo amplifica gli errori sui dati qualunque sia il metodo; il secondo amplifica gli errori di arrotondamento anche su un problema ben condizionato.
  4. Perché nella derivata numerica esiste un hh ottimale? Risposta: il troncamento ∝h\propto h cala con hh, l'arrotondamento ∝u/h\propto u/h cresce: la somma ha un minimo a h≈uh \approx \sqrt u.

Versione ripasso

Sorgenti dell'errore: dati (misure, arrotondamento in ingresso), troncamento (metodo), arrotondamento (macchina, ∣δ∣≤u|\delta|\le u; vedi 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 →).

Problema ben posto (Hadamard): soluzione esistente, unica, dipendente con continuità dai dati.

Condizionamento: da f(x~)−f(x)≈f′(x) x εf(\tilde x)-f(x)\approx f'(x)\,x\,\varepsilon (Lagrange, Formula di Taylor con resto di LagrangeSe f ha n+1 derivate continue su [a,b], l'errore tra f e il suo polinomio di Taylor si scrive esattamente come f^(n+1)(c)(x-x0)^(n+1)/(n+1)! per un c opportuno: serve a stimare l'errore su tutto un intervallo e a scegliere il grado del polinomio.Formula di Taylor con resto di Lagrange →) K(x)=∣xf′(x)f(x)∣,cifre perse≈log⁡10K.K(x)=\left|\frac{x f'(x)}{f(x)}\right|,\qquad \text{cifre perse}\approx\log_{10}K.

Stabilità: errore in avanti ∣y^−f(x)∣∣f(x)∣\frac{|\hat y-f(x)|}{|f(x)|}; all'indietro y^=f(x+Δx)\hat y=f(x+\Delta x). Backward stabile se ∣Δx∣/∣x∣∼u|\Delta x|/|x|\sim u. Vale: errore in avanti ≲K⋅\lesssim K\cdot errore all'indietro. Problema mal condizionato: nessun algoritmo salva.

Ricorrenza In=1−nIn−1I_n=1-nI_{n-1}, I0=1−e−1I_0=1-e^{-1} (per parti, Integrazione per parti∫ f·g' dx = f·g − ∫ f'·g dx (regola del prodotto letta al contrario). Si usa per log x, arcsin x, arctan x (scritti come "funzione per 1"), per sin²x, cos²x, sinh²x, cosh²x (integrale circolare: l'integrale di partenza ricompare e si porta a sinistra) e per prodotti come x^n·e^(αx), x^n·sin(βx), e^(αx)·sin(βx).Integrazione per parti →): en=−nen−1e_n=-ne_{n-1}, ∣en∣=n! ∣e0∣|e_n|=n!\,|e_0|. A 44 cifre: I7=0,2160I_7=0{,}2160 contro 0,11240{,}1124; in doppia I20=−30,19I_{20}=-30{,}19. Rimedio: In−1=1−InnI_{n-1}=\frac{1-I_n}{n} da I40≈0I_{40}\approx0 (errore diviso per nn): I20=0,045545I_{20}=0{,}045545.

Schemi: consistenza (residuo →0\to0), stabilità (uniforme in hh), convergenza; consistenza + stabilità ⇒\Rightarrow convergenza, perché ∣x−xh∣≤C∣τh∣|x-x_h|\le C|\tau_h| con CC indipendente da hh; per problemi lineari vale anche il viceversa (Lax-Richtmyer) (Metodi di Eulero esplicito, implicito e Crank-NicolsonProblema di Cauchy $y'=f(t,y)$, $y(t_0)=y_0$, con $f$ lipschitziana in $y$ (costante $L$): ben posto. Nodi $t_n=t_0+nh$, $u_n\approx y(t_n)$. Eulero esplicito $u_{n+1}=u_n+h,f(t_n,u_n)$; Eulero implicito $u_{n+1}=u_n+h,f(t_{n+1},u_{n+1})$ (equazione da risolvere a ogni passo: punto fisso se $hL<1$, Newton, o formula chiusa se $f$ è lineare); Crank-Nicolson $u_{n+1}=u_n+\frac h2[f(t_n,u_n)+f(t_{n+1},u_{n+1})]$ (regola dei trapezi). Errore di troncamento locale $\tau_n=\frac{y(t_{n+1})-y(t_n)}h-\Phi$: $\frac h2y''$ (EE), $-\frac h2y''$ (EI), $-\frac{h^2}{12}y'''$ (CN). Consistenza + stabilità $\Rightarrow$ convergenza: ordine 1 per EE e EI, ordine 2 per CN, cioè errore globale $O(h)$ e $O(h^2)$; per EE $|e_n|\le\frac{Mh}{2L}\big(e^{L(t_n-t_0)}-1\big)$ con $M=\max|y''|$ (D). Dimezzando $h$ l'errore si divide per 2 (EE, EI) o per 4 (CN).Metodi di Eulero esplicito, implicito e Crank-Nicolson →).

Derivata numerica: Dh−f′=h2f′′(ξ)D_h-f'=\frac h2f''(\xi) (troncamento) più ≈2u∣f∣h\approx\frac{2u|f|}{h} (arrotondamento); hott=2u∣f∣/∣f′′∣≈10−8h_{\text{ott}}=2\sqrt{u|f|/|f''|}\approx10^{-8}. Per exe^x in x=1x=1: errore relativo 5⋅10−35\cdot10^{-3} (h=10−2h=10^{-2}), 2,4⋅10−92{,}4\cdot10^{-9} (h=10−8h=10^{-8}), 1,6⋅10−41{,}6\cdot10^{-4} (h=10−12h=10^{-12}). MATLAB: cond(A), roots, diff.

Passaggi principali.

  • Derivazione di KK: x~=x(1+ε)\tilde x=x(1+\varepsilon), f(x~)−f(x)=f′(ξ)(x~−x)≈f′(x) x εf(\tilde x)-f(x)=f'(\xi)(\tilde x-x)\approx f'(x)\,x\,\varepsilon, si divide per f(x)f(x). Più variabili: Ki=∣xi ∂iff∣K_i=\left|\frac{x_i\,\partial_if}{f}\right|, errore massimo ≈∑iKi∣εi∣\approx\sum_iK_i|\varepsilon_i|.
  • cos⁡x\cos x a x=1,57x=1{,}57: tan⁡1,57=1255,77\tan1{,}57=1255{,}77, K=1,57⋅1255,77=1971,6K=1{,}57\cdot1255{,}77=1971{,}6; cos⁡1,57=7,9633⋅10−4\cos1{,}57=7{,}9633\cdot10^{-4} e cos⁡1,570157=6,3933⋅10−4\cos1{,}570157=6{,}3933\cdot10^{-4}, variazione relativa 0,19720{,}1972 (prevista 0,19720{,}1972).
  • Ricorrenza a 44 cifre: 0,6321, 0,3679, 0,2642, 0,2074, 0,1704, 0,1480, 0,1120, 0,21600{,}6321,\ 0{,}3679,\ 0{,}2642,\ 0{,}2074,\ 0{,}1704,\ 0{,}1480,\ 0{,}1120,\ 0{,}2160 (n=0..7n=0..7); errore/e0/e_0: 1,1,2,6,24,120,≈720,≈50401,1,2,6,24,120,\approx720,\approx5040, cioè n!n!.
  • Limiti di InI_n: 1e(n+1)≤In≤1n+1\frac1{e(n+1)}\le I_n\le\frac1{n+1} (da e−1≤ex−1≤1e^{-1}\le e^{x-1}\le1); partendo da IN≈0I_N\approx0 l'errore a nn è ≤n!N!⋅1N+1\le\frac{n!}{N!}\cdot\frac1{N+1}.
  • All'indietro da I10=0I_{10}=0 a 44 cifre: I9=0,1000I_9=0{,}1000, I8=0,1000I_8=0{,}1000, I7=0,1125I_7=0{,}1125, I6=0,1268I_6=0{,}1268, …\dots, I0=0,6321I_0=0{,}6321.
  • Derivata numerica: errore totale E(h)≈h2∣f′′∣+2u∣f∣hE(h)\approx\frac h2|f''|+\frac{2u|f|}{h}, minimo per h=2u∣f∣/∣f′′∣h=2\sqrt{u|f|/|f''|} (annullando la derivata rispetto a hh).

Errori tipici: confondere condizionamento (problema) e stabilità (algoritmo); credere che hh piccolo migliori sempre; usare ∣f′∣|f'| invece di ∣xf′f∣\left|\frac{xf'}{f}\right|; ritenere stabile un algoritmo solo perché la formula è esatta.

Esercizi su questo argomento

Teoria collegata