Sei sulla pagina 1di 11

Introduzione agli errori numerici

—————
Appunti per l’Insegnamento di
Metodi computazionali per l’economia e per la finanza
Anno Accademico 2007/2008

Riccardo Cambini
Dipartimento di Statistica e Matematica Applicata all’Economia
Facoltà di Economia, Università di Pisa,
Via Cosimo Ridolfi 10, 56124 Pisa, ITALY
E-mail: cambric@ec.unipi.it

Versione Preliminare
Gennaio 2008

1 Cause degli errori numerici


Un luogo comune asserisce che i calcolatori siano estremamente bravi ed
efficienti nello svolgere i calcoli matematici. In realtà i calcolatori sono molto
veloci nel compiere i calcoli, ma non sono molto “bravi” nel farlo. Infatti, per
il modo in cui sono costruiti, i calcolatori nel compiere i calcoli matematici
commettono diversi errori, detti errori numerici. In questa prima sezione
vedremo di analizzare le cause di questi errori numerici.

1.1 Numeri di macchina


Il calcolatore, essendo una macchina finita, consente la rappresentazione so-
lamente di un numero finito, anche se grande, di numeri reali. In particolare,
si definisce numero di macchina uno dei valori reali rappresentabili dal com-
puter, mentre si definisce insieme dei numeri di macchina l’insieme di tutti
i numeri rappresentabili dal computer.
I numeri reali vengono rappresentati da un computer nel cosiddetto
formato in virgola mobile (floating point), ovvero in formato esponenziale:

± mantissa ∗ baseesponente

Essendo la base fissata a priori (i calcolatori utilizzano la base2), per me-


morizzare un numero è sufficiente memorizzarne il segno, l’esponente e la

1
mantissa. Chiaramente, per memorizzare il segno del numero è sufficiente
un singolo bit; per memorizzare invece la mantissa e l’esponente i calcolatori
mettono a disposizione una quantità limitata di memoria la cui dimensione
è definita da una convenzione internazionale. Di conseguenza, i calcolatori
non sono in grado di rappresentare tutti i numeri reali (che sono infiniti),
ma solamente una quantità finita di essi.
Ogni numero reale non di macchina viene automaticamente approssi-
mato dal calcolatore con un numero di macchina tramite tecniche di arro-
tondamento (si cerca il numero macchina più vicino) o di troncamento (si
eliminano le cifre in eccesso, ovvero si prende il numero di macchina più
piccolo e più vicino). Questa approssimazione comporta il seguente errore:
• Errore relativo di rappresentazione: errore commesso approssimando
il numero reale x con il numero di macchina x̃:
x̃ − x
x =
x

Si osservi inoltre che, a causa dello spazio di memoria limitato messo a


disposizione della mantissa e dell’esponente, esisterà il numero di macchina
positivo più grande di tutti (detto “realmax”) ed il numero di macchina
positivo più vicino di tutti allo zero (detto “realmin”). I numeri reali più
grandi di “realmax” non sono quindi rappresentabili dal calcolatore e com-
porteranno un errore di “overflow”, analogamente i numeri reali non nulli
più vicini allo zero di “realmin” comporteranno un errore di “underflow” (e
verranno approssimati a zero). Nel caso di errori di underflow (x 6= 0 con
x̃ = 0) risulta |x | = 1, in altre parole l’errore relativo è del 100%. Nel caso
di errori di overflow (−∞ < x < +∞ con x̃ = ±∞) è invece |x | = +∞.
E’ possibile dimostrare (si veda ad esempio [2]) che, nel caso in cui non
si siano verificati né errori di underflow né di overflow, è possibile dare una
limitazione superiore alla dimensione dell’errore relativo di rappresentazione:
x̃ − x

|x | =
<u
x
dove la quantità u, detta precisione di macchina, è data da:

u = base1−numero cif re mantissa

Si osservi infine che, proprio per l’utilizzo della notazione esponenziale,


la quantità di numeri di macchina compresi nell’intervallo [0, 1] è uguale alla
quantità di numeri di macchina nell’intervallo [1, +∞]; in altre parole i nu-
meri di macchina sono “addensati” in prossimità dello zero e sono “rarefatti”
verso l’infinito.

Esempio 1.1 Il formato standard per i numeri in virgola mobile a dop-


pia precisione (Double-Precision Floating Point) è definito nello “ IEEE

2
Standard 754” (ANSI/IEEE Standard 754-1985 for Binary Floating-Point
Arithmetic). Ogni numero è rappresentato in base 2 e memorizzato in 64
bit; un bit è utilizzato per il segno del numero, 11 bit sono utilizzati per
l’esponente, 52 bit sono utilizzati per la mantissa.

1 11 52
+-+-----------+----------------------------------------------------+
|S| Esponente | Mantissa |
+-+-----------+----------------------------------------------------+
63 62 51 0

Si osservi che una mantissa di 52 bit permette di rappresentare 252 ≈


4.5 ∗ 1015 numeri, garantendo quindi una rappresentazione di numeri in ba-
se10 fino a 15 cifre. Un esponente di 11 bit permette invece di avere a dispo-
sizione in base2 circa 210 = 1024 esponenti positivi ed altrettanti negativi,
equivalenti in base10 a 21024 ≈ 308 esponenti positivi ed altrettanti nega-
tivi. In particolare, il più grande ed il più piccolo numero rappresentabile
risultano essere rispettivamente:

realmin = 2.22507 ∗ 10−308 , realmax = 1.79769 ∗ 10+308

La precisione di macchina risulta invece u = 2−51 ≈ 4.44 ∗ 10−16 .

1.2 Aritmetica finita


Il vincolo dell’utilizzo dei numeri di macchina comporta non solamente un er-
rore iniziale di rappresentazione dei dati, ma anche numerosi successivi errori
di approssimazione dovuti alla rappresentazione come numeri di macchina
dei risultati delle varie operazioni. Ad esempio, la somma di due numeri di
macchina non necessariamente è a sua volta un numero di macchina, di con-
seguenza per memorizzare il risultato di tale somma occorre approssimarne
il valore al numero di macchina più vicino. L’approssimazione del risultato
al numero di macchina più vicino deve essere effettuata al termine di ogni
singola operazione. Si capisce quindi come gli errori aumentino sempre più,
dando origine al cosiddetto fenomeno della propagazione degli errori.
Per meglio capire il problema, si osservino i seguenti esempi di errori
numerici dovuti all’utilizzo da parte dei calcolatori di una aritmetica finita:
 
• 1−3∗ 4
3 − 1 : invece che zero il computer calcola 2.2204 ∗ 10−16 ;

• (253 + 1) − 253 : invece che uno il computer calcola zero;



• 1 + 10−16 − 1: invece che un valore positivo il computer calcola zero.

L’utilizzo di una aritmetica finita comporta, in particolare, che le seguenti


ben note proprietà algebriche non valgono anche per i calcolatori:

3
• Associatività dell’addizione: (x + y) + z = x + (y + z);

• Associatività della moltiplicazione: (xy)z = x(yz);

• Legge di cancellazione dell’addizione: se x + y = y + z allora x = z;

• Legge di cancellazione della moltiplicazione: se xy = yz, y 6= 0, allora


x = z;

• Distributività: x(y + z) = xy + xz;

• Semplificazione: x(y/x) = y.

1.3 Operazioni di macchina


Il calcolatore (o meglio la Aritmetical Logical Unit del microprocessore del
computer) non è in grado di calcolare in modo diretto tutte le funzioni mate-
matiche. Esso è capace di calcolare il prodotto, la somma, la differenza ed il
rapporto tra due numeri di macchina, ma non è ad esempio in grado di cal-
colare in modo diretto il valore di funzioni trigonometriche, logaritmiche ed
esponenziali. In altre parole, le funzioni effettivamente calcolabili su un cal-
colatore sono solo le funzioni razionali, ovvero quelle ottenute con un numero
finito di operazioni di somma, prodotto, sottrazione e divisione. Le funzioni
non razionali (trigonometriche, logaritmiche ed esponenziali) vengono inve-
ce approssimate con opportune funzioni razionali, ottenute ad esempio da
polinomi di Taylor/McLaurin oppure da opportuni metodi iterativi. Fun-
zioni più complesse possono essere approssimate con metodi opportuni (ad
esempio il metodo dei trapezi o il metodo Monte Carlo per il calcolo degli
integrali definiti).

2 Calcolo del valore di una funzione


Per quanto detto nella sezione precedente, il calcolo del valore f (x) relativo
ad una generica funzione f : <n → < può essere affetto da errori indotti da
diversi fenomeni:

• Errore inerente: errore generato dalla approssimazione del vettore


x con numeri di macchina x̃. In particolare, invece che il valore
f (x) il computer calcola il valore f (x̃) commettendo il seguente errore
relativo:
f (x̃) − f (x)
in =
f (x)
L’Errore Inerente è un errore che dipende solamente dalla funzione
f (x) e non dal modo in cui essa viene calcolata, è un errore che è
intrinseco nella funzione f (x) e che è causato dalla approssimazione
di macchina di x. Tale errore è nullo solamente se x è proprio un

4
numero di macchina, ed è di fatto inevitabile ogni qual volta x non
è un numero macchina. Il problema del calcolo di f (x) è detto mal
condizionato se comporta un grande Errore Inerente.
• Errore algoritmico: errore generato dal fatto che i calcoli sono effet-
tuati in aritmetica finita, ovvero approssimando il risultato di ogni
singola operazione. In particolare, a seconda della specifica sequenza
di operazioni da compiere, il computer invece che calcolare il valore
f (x̃) calcola un valore φ(x̃) commettendo il seguente errore relativo:
φ(x̃) − f (x̃)
alg =
f (x̃)
L’Errore Algoritmico dipende strettamente dalla specifica sequenza di
operazioni con cui si calcola il valore φ(x̃); in questo caso l’utente fina-
le può intervenire in modo diretto per diminuirne l’entità, come verrà
evidenziato in una sezione successiva, scegliendo opportunamente la se-
quenza di operazioni da calcolare. L’algoritmo utilizzato per il calcolo
di f (x) è detto stabile se comporta un piccolo Errore Algoritmico.
• Errore analitico: errore generato dalla eventuale approssimazione della
funzione φ con una funzione razionale ψ. In particolare, invece che il
valore φ(x̃) il computer calcola il valore ψ(x̃) commettendo il seguente
errore relativo:
ψ(x̃) − φ(x̃)
an =
φ(x̃)
Per quanto riguarda l’Errore Analitico, è principalmente compito dei
produttori di microprocessori e di software limitarlo il più possibile,
programmando in modo opportuno il calcolo delle funzioni non ra-
zionali (trigonometriche, logaritmiche ed esponenziali). Nel caso di
funzioni più complesse (integrale definito, zero di una funzione), l’u-
tente finale può intervenire scegliendo il metodo di approssimazione
più opportuno.
Ovviamente le precedenti definizioni valgono sotto le ipotesi che sia f (x) 6= 0,
f (x̃) 6= 0 e φ(x̃) 6= 0. In conclusione, il computer invece che calcolare il
valore f (x) calcola il valore ψ(x̃), commettendo il seguente errore relativo
complessivo:
ψ(x̃) − f (x)
tot =
f (x)
La relazione esistente tra Errore Totale, Errore Inerente, Errore Analitico
ed Errore Algoritmico è evidenziata nel seguente teorema.

Teorema 2.1 Assumendo f (x) 6= 0, f (x̃) 6= 0 e φ(x̃) 6= 0, risulta:


tot = in + an + alg + in an + in alg + an alg + in an alg
≈ in + an + alg

5
Proof Si osservi preliminarmente che:
ψ(x̃) − f (x) ψ(x̃) − φ(x̃) + φ(x̃) − f (x̃) + f (x̃) − f (x)
tot = =
f (x) f (x)
ψ(x̃) − φ(x̃) φ(x̃) f (x̃) φ(x̃) − f (x̃) f (x̃) f (x̃) − f (x)
= + +
φ(x̃) f (x̃) f (x) f (x̃) f (x) f (x)
φ(x̃) f (x̃) f (x̃)
= an + alg + in
f (x̃) f (x) f (x)
f (x̃) φ(x̃)
La tesi segue quindi osservando che f (x) = 1 + in e che f (x̃) = 1 + alg .

E’ pertanto possibile dire che, con buona approssimazione, l’errore totale


computo da un calcolatore nel calcolo del valore f (x) è dato dalla somma
dell’errore inerente, di quello analitico e di quello algoritmico.

3 Stima dell’Errore Inerente


Supponiamo che la funzione f (x) sia differenziabile e si consideri il suo
polinomio di Taylor arrestato al primo ordine:
n
X ∂f
f (x̃) − f (x) ≈ (x)(x̃i − xi )
i=1
∂xi

L’Errore Inerente risulta quindi:


n
f (x̃) − f (x) X ∂f xi x̃i − xi
in = ≈ (x)
f (x) i=1
∂xi f (x) xi

da cui segue:
n
X xi ∂f x̃i − xi
in ≈ ci i con ci = (x) ed i =
i=1
f (x) ∂xi xi

I valori ci sono detti coefficienti di amplificazione, mentre i valori i sono


gli errori relativi di rappresentazione delle singole componenti del vettore x.
Si osserva banalmente che il calcolo di f (x) risulta essere mal condizionato
ogni volta che i coefficienti di amplificazione sono di modulo elevato.
Vediamo alcuni esempi.

• f (x1 , x2 ) = x1 x2 ; risulta in = c1 1 + c2 2 dove

c1 = 1 e c2 = 1

x1
• f (x1 , x2 ) = x2 ; risulta in = c1 1 + c2 2 dove

c1 = 1 e c2 = −1

6
• f (x1 , x2 ) = x1 + x2 ; risulta in = c1 1 + c2 2 dove
x1 x2
c1 = e c2 =
x1 + x2 x1 + x2

• f (x1 , x2 ) = x1 − x2 ; risulta in = c1 1 + c2 2 dove


x1 −x2
c1 = e c2 =
x1 − x2 x1 − x2

Dai precedenti esempi si evince che nel caso del prodotto e della divisione
tra due numeri l’Errore Inerente risulta essere di modesta entità.
Più delicato è invece il ragionamento nel caso delle operazioni di somma
e differenza tra numeri. Nel caso infatti in cui sia x1 ≈ −x2 i coefficienti
di amplificazione della operazione di somma tra due numeri risultano essere
enormi a causa del denominatore prossimo allo zero. Analogo problema si
ha nel caso in cui si debba calcolare la differenza tra due numeri tali che
x1 ≈ x2 . Questo comportamento prende il nome di fenomeno di cancel-
lazione numerica, ed è alla base di molti degli errori numerici del calcolo
computazionale.
Per riassumere quanto sopra descritto, si potrebbe dire che il computer
calcola bene i prodotti e le divisioni, ma è meno bravo a calcolare le somme
e le sottrazioni.
Concludiamo con i seguenti ulteriori esempi:
• f (x1 ) = xn1 ; risulta in = c1 1 dove

c1 = n

• f (x1 ) = ex1 ; risulta in = c1 1 dove

c1 = x1

• f (x1 ) = log(x1 ); risulta in = c1 1 dove


1
c1 =
log(x1 )

Nel caso della funzione potenza, della funzione esponenziale e della funzione
logaritmica il calcolo risulta essere mal condizionato rispettivamente per
valori di n molto grandi, per valori di x1 molto grandi, per valori di x1
molto vicini ad uno.

Esercizio 3.1 Calcolare l’Errore Inerente delle seguenti funzioni:

f (x1 , x2 ) = log(x1 + x2 ) , f (x1 , x2 ) = log(x1 x2 )


x1 +x2
f (x1 , x2 ) = e , f (x1 , x2 ) = ex1 x2

7
4 Stima dell’Errore Algoritmico
A differenza dell’Errore Inerente (che è indipendente dall’algoritmo usato nel
calcolo della funzione), l’Errore Algoritmico è strettamente dipendente dalla
sequenza di operazioni eseguite. Per valutarne una stima conviene quindi
utilizzare un grafo, che permette di descrivere in modo efficace la specifi-
ca sequenza delle operazioni dell’algoritmo. I nodi rappresentano i risultati
intermedi dei calcoli, ad ogni nodo si associa l’errore commesso dall’appros-
simazione del corrispondente risultato intermedio al più vicino numero di
macchina, ad ogni arco orientato si associa il coefficiente di amplificazione
corrispondente all’operazione eseguita. In modo iterativo (andando dalle
foglie verso la radice del grafo) è cosı̀ possibile calcolare l’Errore Algoritmi-
co complessivo, causato dalla propagazione degli errori di approssimazione
commessi sui risultati intermedi. Si ricordi che nel calcolo dell’Errore Al-
goritmico i dati iniziali sono considerati numeri di macchina, quindi privi
di errore di approssimazione (come è stato già ripetutamente detto, gli er-
rori dovuti alla approssimazione numerica dei dati iniziali sono considerati
nell’Errore Inerente).
Come primo esempio, si supponga di dover calcolare la funzione polino-
miale f (x1 , x2 , x3 ) = x3 (x1 + x2 ). Tale funzione può essere calcolata in uno
dei due seguenti modi (matematicamente equivalenti):

A) x3 (x1 + x2 ) , B) x1 x3 + x2 x3

Questi due diversi metodi, la cui sequenza di operazioni è descritta dai grafi
in Figura 1, daranno origine a due diversi Errori Algoritmici.

0 0
x3 x1 "1
1 x1
1 x1 x 3
x 3 ( x1 + x 2 ) x1 + x 2
! 1 "3
! 0
! 0 x1 "2!
! x1 + x 2 ! x1 x 3 + x 2 x 3
x1 1 ! x3
! 1 !
! ! "2
x1 + x 2 !
! x2 x 3
! ! "1 0 x2
! 0 ! x1 + x 2
! x2
x2 !
x1 + x 2 A) ! ! x2 1 B)
!
!
! ! !
!
Figura 1: Errori Algoritmici di x3 (x
!1 + x2 )
! ! ! !

Da semplici calcoli si ottiene:


! !
x1 x2
algA = η2 + 1 · 0 + 1 · (η1 + ·0+ · 0) =
x1 + x2 x1 + x2
= η1 + η2

8
x1 x2
algB = η3 + · (η1 + 1 · 0 + 1 · 0) + · (η2 + 1 · 0 + 1 · 0) =
x1 + x2 x1 + x2
1
= η3 + · (η1 · x1 + η2 · x2 )
x1 + x2
E’ evidente che l’algoritmo A) è stabile, mentre non lo è l’algoritmo B) che
presenta possibili grandi errori numerici nel caso in cui sia x1 ≈ −x2 , ovvero
nel caso in cui si possano presentare fenomeni di cancellazione numerica.
Come secondo esempio, sisupponga di dover calcolare la funzione poli-
nomiale f (x1 , x2 ) = x21 − x22 . Tale funzione può essere equivalentemente
calcolata in uno dei due seguenti modi descritti in Figura 2:
 
A) x21 − x22 , B) (x1 + x2 ) (x1 − x2 )

x1 "1
0 1 "1 0 x1 + x 2
x12 x1 x1 + x 2
x1 x12 x12 " x 22
1
1 x2
! ! ! !" ! ! x1 + x 2 "3
3
!
!
A)! ! x12 " x 2 2
B) !
! ( x1 + x 2 )( x1 " x 2 )
! x1
! x1 " x 2 !
0 "2 !
1 "x 22 0 1
x2 x 2!
2 x12 " x 22 x2 !x " x
1 2
"x 2
1 !x "x "2
1 2

! ! ! ! ! ! !
! ! ! ! Algoritmici di! x2 − x2
Figura 2: Errori

1 2
! ! !

Da semplici calcoli si ottiene:

x21 −x2
algA = η3 + · (η1 + 2 · 0) + 2 2 2 · (η2 + 2 · 0) =
− x22x21 x1 − x2
1
= η3 + 2 · (η1 · x21 − η2 · x22 )
x1 − x22
x1 x2
algB = η3 + 1 · (η1 + ·0+ · 0) +
x1 + x2 x1 + x2
x1 −x2
+1 · (η2 + ·0+ · 0) =
x1 − x2 x1 − x2
= η1 + η2 + η3

E’ evidente che l’algoritmo B) è stabile, mentre non lo è l’algoritmo A) che


presenta fenomeni di cancellazione numerica nel caso in cui sia x1 ≈ −x2
oppure x1 ≈ x2 .

9
Come ultimo esempio,
√ si supponga di dover calcolare la funzione irrazio-
nale f (x1 , x2 ) = x2 + 1 − x; ciò può essere fatto in uno dei due seguenti
modi: p 1
A) x2 + 1 − x , B) √
2
x +1+x
Si verifica facilmente che se x è un valore positivo molto grande allora l’algo-
ritmo A) presenta forti errori di cancellazione numerica, mentre l’algoritmo
B) risulta essere stabile. Nel caso invece in cui x è un valore negativo mol-
to grande in valore assoluto allora è l’algoritmo B) a presentare errori di
cancellazione numerica, mentre l’algoritmo A) è stabile.
Riassumendo quanto visto in questi tre esempi, occorre cercare di evitare
il più possibile i fenomeni di cancellazione numerica oppure, nel caso in cui
tali errori siano inevitabili, di anticiparli il più possibile scomponendo in
fattori le funzioni da calcolare (in modo tale da applicare i grossi coefficienti
di amplificazione ad errori numerici più piccoli).

Esercizio 4.1 Calcolare l’Errore Algoritmico delle seguenti funzioni nei due
casi A) e B):
x1 + x2 x1 x2
A) , B) +
x3 x3 x3

x1 + x2 x1
A) , B) 1 +
x2 x2

A) (x1 + x2 )2 , B) x21 + 2x1 x2 + x22

A) log(x1 x2 ) , B) log(x1 ) + log(x2 )

A) ex1 +x2 , B) ex1 ex2

p  x
A) x x2 + 1 − x , B) √
x2 +1+x

Esercizio 4.2 Calcolare l’Errore Algoritmico delle seguenti funzioni nei tre
casi A), B) e C):

A) (x1 + x2 ) + x3 , B) x1 + (x2 + x3 ) , C) (x1 + x3 ) + x2

A) (x1 x2 )x3 , B) x1 (x2 x3 ) , C) (x1 x3 )x2

10
Riferimenti bibliografici
[1] Bevilacqua R., Bini D., Capovani M. e O. Menchi (1987), Introduzione
alla matematica computazionale, Zanichelli, Bologna.

[2] Bevilacqua R., Bini D., Capovani M. e O. Menchi (1992), Metodi


numerici, Zanichelli, Bologna.

[3] Hildebrand F.B. (1987), Introduction to numerical analysis, second


edition, Dover Publications, New York.

[4] Ralston A. e P. Rabinowitz (2001), A first course in numerical analysis,


second edition, Dover Publications, New York.

11

Potrebbero piacerti anche