Salta al contenuto
Note per Studenti Esercizio - Radici di un'equazione di secondo grado in F(10,4) senza cancellazione

Esercizio - Radici di un'equazione di secondo grado in F(10,4) senza cancellazione

In questa pagina 3

Teoria: 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 →.

Testo

Si risolve x2−200x+1=0x^2 - 200x + 1 = 0 in un'aritmetica decimale che arrotonda ogni risultato a 44 cifre significative.

  • (a) Calcolare le radici con la formula x1,2=−b±b2−4ac2ax_{1,2} = \dfrac{-b \pm \sqrt{b^2 - 4ac}}{2a} e confrontare con le radici esatte.
  • (b) Calcolare la radice grande con la formula e la piccola con la relazione tra le radici. Confrontare.
  • (c) Domanda teorica: per quale radice la formula standard soffre di cancellazione, in funzione del segno di bb?
  • (d) Con la stessa idea, risolvere in doppia precisione x2−108x+1=0x^2 - 10^8x + 1 = 0 e dire quanto è l'errore della formula standard.

Soluzione

Valori esatti (a 5050 cifre)

x1,2=100±9999x_{1,2} = 100 \pm \sqrt{9999}, quindi x1=199,995000…x_1 = 199{,}995000\ldots e x2=0,005000125…x_2 = 0{,}005000125\ldots.

(a) Formula standard

  • b2=40000b^2 = 40000 (esatto).
  • 4ac=44ac = 4, quindi b2−4ac=39996b^2 - 4ac = 39996, che a 44 cifre significative si arrotonda a 4,000⋅104=400004{,}000 \cdot 10^4 = 40000.
  • 40000=200,0\sqrt{40000} = 200{,}0.
  • x1=200+200,02=200,0x_1 = \dfrac{200 + 200{,}0}{2} = 200{,}0: errore relativo 0,005199,995≈2,5⋅10−5\frac{0{,}005}{199{,}995} \approx 2{,}5 \cdot 10^{-5}, accettabile.
  • x2=200−200,02=0x_2 = \dfrac{200 - 200{,}0}{2} = 0: sbagliata del 100% (la vera radice è 0,0050{,}005).

Il discriminante ha perso le sue ultime cifre nell'arrotondamento, e la differenza tra due numeri quasi uguali (200200 e 39996=199,990\sqrt{39996} = 199{,}990) azzera tutto quello che resta.

(b) Formula stabile

Per la relazione tra radici x1x2=ca=1x_1x_2 = \frac ca = 1 si ha x2=ca x1x_2 = \dfrac{c}{a\,x_1}. Con x1=200,0x_1 = 200{,}0: x2=1200,0=0,005000.x_2 = \frac{1}{200{,}0} = 0{,}005000. Errore relativo: ∣0,005000−0,005000125∣0,005000125≈2,5⋅10−5\frac{|0{,}005000 - 0{,}005000125|}{0{,}005000125} \approx 2{,}5 \cdot 10^{-5}, cioè circa 44–55 cifre corrette, come per x1x_1. La divisione non ha cancellazione, e l'errore di x1x_1 si trasmette in modo relativo (una divisione non lo amplifica).

(c) Quale radice soffre

La cancellazione si ha quando ∣b∣≫∣ac∣|b| \gg |ac|, nella somma tra −b-b e ±b2−4ac≈±∣b∣\pm\sqrt{b^2-4ac} \approx \pm |b|: se i due termini hanno segno opposto si annullano. Per b<0b < 0 (come qui) è la radice con −- (la piccola), per b>0b > 0 è quella con ++. Si calcola quindi per prima la radice in cui i due termini hanno lo stesso segno: x1=−b−sgn⁡(b)b2−4ac2a,x2=ca x1.x_1 = \frac{-b - \operatorname{sgn}(b)\sqrt{b^2 - 4ac}}{2a}, \qquad x_2 = \frac{c}{a\,x_1}.

(d) Doppia precisione

Con b=−108b = -10^8, c=1c = 1: b2−4=1016−4b^2 - 4 = 10^{16} - 4 è un numero di macchina (vicino a 101610^{16} il passo è 22) e la sua radice vale 108−2⋅10−810^8 - 2\cdot 10^{-8} circa. Vicino a 10810^8 il passo tra numeri di macchina è 1,49⋅10−81{,}49\cdot 10^{-8}, quindi la radice è arrotondata a 108−1,49⋅10−810^8 - 1{,}49\cdot 10^{-8} (un solo passo sotto 10810^8). Allora

  • formula standard: x2=108−(108−1,49⋅10−8)2=7,45⋅10−9x_2 = \frac{10^8 - (10^8 - 1{,}49\cdot 10^{-8})}{2} = 7{,}45\cdot 10^{-9} invece di 10−810^{-8}: errore del 25%25\% (la differenza è esatta, ma il suo unico dato è l'ultimo bit della radice);
  • formula stabile: x1=108+⋅2=108x_1 = \frac{10^8 + \sqrt{\cdot}}{2} = 10^8 e x2=1/108=10−8x_2 = 1/10^8 = 10^{-8} (corretto fino all'ultima cifra).

Risultato. Formula standard: x2=0x_2 = \mathbf{0} (sbagliata); formula stabile: x2=0,005000x_2 = \mathbf{0{,}005000} con errore relativo 2,5⋅10−52{,}5\cdot 10^{-5}.

Errori tipici

  • Pensare che il problema dipenda dal calcolatore: è la formula a essere instabile, non l'equazione (le due radici sono ben condizionate).
  • Usare la relazione x1x2=c/ax_1x_2 = c/a prima di aver calcolato x1x_1 con la formula giusta (cioè senza cancellazione).

Versione ripasso

Esatte: 100±9999100\pm\sqrt{9999}, cioè 199,995000199{,}995000 e 0,0050001250{,}005000125.

(a) Formula standard con 44 cifre: b2−4ac=39996→4,000⋅104b^2-4ac=39996\to4{,}000\cdot10^4, 40000=200,0\sqrt{40000}=200{,}0; x1=200+200,02=200,0x_1=\frac{200+200{,}0}2=200{,}0 (errore 2,5⋅10−52{,}5\cdot10^{-5}), x2=200−200,02=0x_2=\frac{200-200{,}0}2=0 (errore 100%100\%).

(b) x1x2=cax_1x_2=\frac ca: x2=1200,0=0,005000x_2=\frac{1}{200{,}0}=0{,}005000, errore relativo 2,5⋅10−52{,}5\cdot10^{-5} (la divisione non amplifica).

(c) Cancella la radice in cui −b-b e ±⋅\pm\sqrt{\cdot} hanno segno opposto: la piccola. Si usa x1=−b−sgn⁡(b)b2−4ac2ax_1=\frac{-b-\operatorname{sgn}(b)\sqrt{b^2-4ac}}{2a} e x2=cax1x_2=\frac c{a x_1}.

(d) x2−108x+1=0x^2-10^8x+1=0 in doppia: formula standard x2=7,45⋅10−9x_2=7{,}45\cdot10^{-9} (errore 25%25\%), formula stabile 10−810^{-8}.

Errori tipici: incolpare l'equazione (le radici sono ben condizionate: è la formula a essere instabile); usare c/(ax1)c/(ax_1) con un x1x_1 già calcolato con cancellazione.

Teoria collegata