Sei sulla pagina 1di 22

Appunti di Calcolo Numerico

a cura di Annamaria Mazzia


Universita degli Studi di Padova
Corso di Calcolo Numerico per Ingegneria Meccanica - Sede di Vicenza

a.a.2005/2006
Lezioni su

Rappresentazione dei numeri nel calcolatore

Unintroduzione al calcolo numerico: la rappresentazione dei nume-


ri al calcolatore, linstabilita di un algoritmo, il malcondizionamento
di un problema.

Sommario
1 Unicita della rappresentazione in base N . . . . . . . . . . . . 1
2 Conversione di base . . . . . . . . . . . . . . . . . . . . . . . . . . 3
3 Rappresentazione IEEE dei numeri di macchina . . . . . . . 4
4 Precisione numerica . . . . . . . . . . . . . . . . . . . . . . . . . . 8
5 Propagazione degli errori . . . . . . . . . . . . . . . . . . . . . . 9
6 Instabilita e malcondizionamento . . . . . . . . . . . . . . . . . 15
6.1 Instabilita . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
6.2 Malcondizionamento . . . . . . . . . . . . . . . . . . . . . . . 18

1 Unicita della rappresentazione in base N


Un generico numero a puo essere rappresentato in base N utilizzando N simboli,
0, 1, . . . , N 1. Si scrivera dunque come:

a = am N m + am1 N m1 + . . . + a1 N + a0 + a1 N 1 + a2 N 2 + . . . an N n

dove m e n sono interi naturali e ak , k = m, m 1, . . . , n sono interi naturali


compresi tra 0 e N 1.
Esempio
In base 10, il numero 726.625, scritto in forma estesa e dato dalla forma:

7 102 + 2 101 + 6 + 6 101 + 2 102 + 5 103

1
1. Unicita della rappresentazione in base N 2


Abbiamo supposto che il numero abbia una rappresentazione finita ma anche
nel caso piu generale avremo una rappresentazione simile. Dimostriamo che tale
rappresentazione e unica.
Dimostrazione.
Proviamo, innanzitutto, che ogni numero a e tale che N m a < N m+1 .
Se si pensa ad un numero in base decimale, questo e ovvio, nel senso che (ad
esempio) un numero con due cifre intere (m = 1) puo variare da 10 fino a 99, cioe e
compreso nellintervallo 10 a < 102 .
Supponiamo, dunque, che lo stesso numero a possa rappresentarsi - nella stessa
base N - come

a = am N m + am1 N m1 + . . . = bp N p + . . . ap1 N p1 . . .
con am 6= 0, bp 6= 0.
E proviamo che necessariamente deve essere p = m e bk = ak per ogni k =
m, m 1, . . ..
Per provare cio, si consideri che il valore minimo che puo assumere a, con m
fissato, si ha ponendo am = 1 e ak = 0 per k 6= m, da cui

a Nm

Analogamente, il valore massimo che puo assumere a si ha ponendo ciascun ak =


N 1, per cui1

amax = (N 1)N m + (N 1)N m1 + . . . + (N 1)N 1 + . . . (N 1)N n


= (N 1)(N m + N m1 + . . . + N 0 + N + N 1 + . . . N n )
m
X
= (N 1) Nk =
n
n+m
X
m
= (N 1)N N k
0
m 1
< (N 1)N
1 1/N
= N m+1

Quindi, N m a < N m+1 .


Ora se fosse p 6= m, ad esempio p < m, avremmo p + 1 m e N p+1 N m .
Daltro canto, ripetendo il ragionamento fatto prima, si avrebbe a < N p+1 . Ma
allora a < N p+1 N m da pure a < N m , un assurdo, visto che N m a.
Se, invece, fosse p > m, avremmo p m + 1 e N p N m+1 . Ma a < N m+1 e
a N p N m+1 , da cui a N m+1 : avremmo di nuovo un assurdo.
1 P 1 1
si tenga conto che k=0 =
Nk 1 1/N
2. Conversione di base 3

Percio, necessariamente, deve essere p = m.


Si puo dunque scrivere:

(am bm )N m + (am1 bm1 )N m1 + . . . = 0

Proviamo che ak = bk per ogni k.


Supponendo am bm > 0 possiamo scrivere lequazione precedente come:
am1 bm1 am2 bm2
am b m = + + ...
N N2
Al primo membro abbiamo un numero intero, mentre il secondo membro e cer-
tamente una quantita minore di 1 in quanto puo essere maggiorata dalla quantita

N 1 N 1 X 1 1 N
+ +. . . (N 1) = (N 1)( 1) = (N 1)( 1) = 1
N N2 Nk 1 1/N N 1
k=1

Luguaglianza puo sussistere solo se ambo i membri sono uguali a zero, cioe per
am = b m .
Ripetendo lo stesso ragionamento si trova che ak = bk per ogni k.

2 Conversione di base
Si vuole passare da una rappresentazione in base M ad una in base N :

a = am M m + am1 M m1 + . . . + a1 M + a0 + a1 M 1 + . . . + an M n
= br N r + br1 N r1 + . . . + b1 N + b0 + b1 N 1 + . . . + as N s

Osserviamo che un numero puo avere una rappresentazione finita in una base ma
infinita in unaltra base e viceversa.
Uguagliamo le parti intere delle due rappresentazioni e dividiamo per N , con i
calcoli eseguiti nella base di partenza M :

(am M m + am1 M m1 + . . . + a1 M + a0 )/N = (br N r + br1 N r1 + . . . + b1 N + b0 )/N


b0
(am M m + am1 M m1 + . . . + a1 M + a0 )/N = br N r1 + br1 N r2 + . . . + b1 +
N
Deduciamo che il resto della divisione per N della parte intera di a e b0 , espresso
nella base M . Dividendo successivamente il quoziente appena trovato per N , si
ottiene come resto b1 , b2 , . . . , br1 fino allultimo quoziente indivisibile per N , che ci
da br . I calcoli si eseguono in base M , in cui e pure espressa la base N .
Uguagliando invece le parti decimali e moltiplicando ogni volta per N otteniamo,
come parti intere, i coefficienti b1 , b2 , . . ., sempre espressi nella base M :

(a1 M 1 + a2 M 2 + . . . +)N = b1 + b2 N 1 + b3 N 2 + . . .
3. Rappresentazione IEEE dei numeri di macchina 4

Esempio
Vogliamo convertire il numero 725.625 dalla base 10 nella base 2
725 362 1 b0
362 181 0 b1
181 90 1 b2
90 45 0 b3
45 22 1 b4
Per la parte intera si ha:
22 11 0 b5
11 5 1 b6
5 2 1 b7
2 1 0 b8
1 0 1 b9
.625 2 = 1.250 b1 = 1
.250 2 = 0.50 b2 = 0
Per la parte decimale:
.5 2 = 1.0 b3 = 1
.0 2 = 0.0
In base 2 il numero diventa 1011010101.101.
Questo modo di procedere diventa alquanto laborioso quando i calcoli devono es-
sere eseguiti in una base diversa da quella decimale, per cui conviene sempre passa-
re alla base decimale e poi da questa allaltra base utilizzando la rappresentazione
polinomiale del numero.
Il passaggio dalla base 2 alle basi 4, 8, 16 sono semplici considerando che 4 = 22 ,
8 = 23 , 16 = 24 . Basta allora suddividere il numero binario in gruppi di 2, 3 e 4
cifre, rispettivamente, per passare alle basi 4, 8 e 16.
Per passare dalla base 4 alle base 16, si suddivide il numero in gruppi di due
considerando che 16 = 42 . Non si puo invece passare cos facilmente dalla base 8
alla bsae 16 perche luna non e potenza dellaltra.
Il perche del passaggio da una base ad unaltra semplificato nel caso di una base
potenza dellaltra lo si vede subito vedendo il caso delle basi 2 e 4. In base 2 sono
possibili le sole cifre 0 e 1. In base 4 invece abbiamo 0, 1, 2 e 3. Ora, tutte le
possibili combinazioni delle coppie di cifre 0 e 1 sono: 00, 01, 10, 11 vale a dire 0,
1, 2 e 3 in base 4. Percio prendendo a due a due coppie di cifre in base 2 ottengo la
rappresentazione in base 4.

3 Rappresentazione IEEE dei numeri di macchina


Lo sviluppo dei calcolatori ha promosso e sviluppato luso del sistema binario, in cui
ciascun numero e rappresentato da una successione di cifre binarie (0 e 1). Ma come
avviene la rappresentazione di un numero nel calcolatore? Come rappresentare un
numero a infinite cifre in maniera accurata utilizzando solo un numero finito di
cifre?
Abbiamo la rappresentazione in virgola mobile (floating point) - che in genere
e preferibile rispetto a quella in virgola fissa - e la maggior parte dei computers
3. Rappresentazione IEEE dei numeri di macchina 5

seguono gli standard dellIEEE ( Institute of Electrical and Electronics Engineers)


nella base 2.
Un numero in floating point nella rappresentazione IEEE viene scritto come

a = (1 + f1 21 + f2 22 + . . . + fm 2m ) 2p ,

dove

1 + f1 21 + f2 22 + . . . + fm 2m e la mantissa, normalizzata, cui sono


riservati un numero m di bits,

p e la potenza della base 2 cui sono riservati un numero N e di bits ed e limitato


a variare in un determinato intervallo [L, U ].

Il primo 1 della mantissa (che corrisponde a f0 ) non viene messo in memoria ma


ce, per cui la rappresentazione del numero e data nel modo seguente:

s e e e e e e f f f f f f
|{z} | {z } | {z }
segno esponente mantissa

Abbiamo 1 bit riservato al segno (si ha 0 per il segno + e 1 per il segno ), un


numero N e di bits per lesponente 2e , e un numero m di bits per la mantissa.
La scelta del numero di bits da riservare allesponente e alla mantissa si basa
su un compromesso tra la dimensione dellesponente (e quindi il piu piccolo e il
piu grande numero rappresentabile) e la dimensione della mantissa (e quindi la
precisione del numero rappresantibile, piu o meno cifre decimali).
Nel sistema IEEE, la rappresentazione in singola precisione e a 32 bits mentre
quella in doppia precisione e a 64 bits. La suddivisione dei bits tra esponente e
mantissa viene ripartita nel modo seguente:
Singola precisione Doppia precisione
s 1 s 1
Ne 8 Ne 11
m 23 m 52
bits 32 bits 64
Lesponente viene rappresentato in forma biased (parziale, influenzata da un
altro numero), nel senso che se p e lesponente, noi consideriamo il valore b + p dove
N e1
b e il numero b = 0111 . . . 1 , quindi b = 1+2+2 2 +. . .+2N e2 +02N e1 = 1 2 =
| {z } 12
N e bits
2N e1 1.
Per trovare il limite superiore e inferiore entro cui puo variare p, dobbiamo tener
conto del fatto che, nella rappresentazione IEEE, due patterns di bits sono riservati
per rappresentare numeri speciali quali lo zero, infinito e il Not-a-Number: sono
0000 . . . 0 e 1111 . . . 1.
3. Rappresentazione IEEE dei numeri di macchina 6

Quindi, per rappresentare un numero reale b+p non puo essere uguale a 1111 . . . 1:
cio significa che il massimo esponente che si puo rappresentare e dato sottraendo a
1111 . . . 1 il valore 1 in base 2, cioe da 1111 . . . 1 0000 . . . 01 = 1111 . . . 10.
Si ha b + p 1111 . . . 10, o equivalentemente, 0111 . . . 1 + p 1111 . . . 10, da cui
ricaviamo
p 1111 . . . 10 0111 . . . 1 = 0111 . . . 1 = b
.
Il limite superiore U e proprio uguale a b.
Per il limite inferiore abbiamo: 0000 . . . 0 < b + p cioe, equivalentemente,

b < p b + 0000 . . . 01 p.

Quindi il limite inferiore e L = (b 1).


In singola precisone, il valore b e dato da b = 0111
| {z. . . 1}: in base 10 b = 12710 , da
8 bits
cui lintervallo [L, U ] = [126, 127].
In doppia precisione, invece, b = 102310 da cui [L, U ] = [1022, 1023].
Per quanto riguarda la mantissa, sono ad essa riservati m bits. Considerando
anche l1 della normalizzazione, la precisione e di m + 1 bits.
Il piu grande numero che si puo rappresentare e, quindi:

m
X 1 2(m+1) U
1. 111 . . . 1} 2U = 2k 2U = 2 = (2 2m )2U 2U +1
| {z 1 21
m bits k=0

Il piu piccolo numero positivo rappresentabile e dato, invece, da:

1. 000
| {z. . . 0} 2L = 2L
bits m

Se si vuole rappresentare un numero al di fuori di questo intervallo si ha over-


flow o underflow.
In singola e doppia precisione abbiamo, per il piu grande e il piu piccolo numero
positivo rappresentabile, il seguente prospetto:

Singola precisione Doppia precisione


Massimo 3.4 1038 10308
Minimo 1.2 1038 2.2 10308

Esempio
Vogliamo scrivere il numero 5.7510 in formato IEEE in singola precisione.
Effettuiamo prima la conversione in base 2:
5 2 1 b0
Per la parte intera: 2 1 0 b1
1 0 1 b2
3. Rappresentazione IEEE dei numeri di macchina 7

.75 2 = 1.50 b1 = 1
Per la parte decimale: .5 2 = 1.0 b2 = 1
.0 2 = 0.0
Quindi 5.7510 = 101.112 = 1.0111 22 .
Memorizziamo ora il numero in singola precisione:
Per lesponente:

(b + p)10 = (127 + 2)10 = 12910 = 100000012

Per la mantissa, m = 23 e si deve trascurare l1 della normalizzazione

0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

Il segno e positivo, quindi s = 0


Percio la memorizzazione, considerati i bits per il segno, lesponente e la mantissa
e:

0 1 0 0 0 0 0 0 1 0 1 1 1 0 0 ... 0 0 0 0 0 0 0
|{z} | {z } | {z }
s esponente mantissa


Consideriamo, ora, la rappresentazione dei numeri speciali.
Per convenzione si pone uguale a 0 la rappresentazione che vede tutti zero sia
nel segno, sia nellesponente che nella mantissa (non dimentichiamo che il valore 1
della normalizzazione non e messo in memoria ma ce e quindi non potremmo mai
avere il valore 0 - percio lo si pone per convenzione).
Per i valori si considerano tutti 1 nello spazio dedicato allesponente e tutti
0 nello spazio dedicato alla mantissa:

0/1 1 1 1 ... 1 1 0 0 0 ... 0 0


|{z} | {z } | {z }
s esponente mantissa

I valori si hanno se si fa una divisione per zero o si fa un calcolo che comporta


overflow.
Si ha invece il Not-a-Number quando si ottiene il risultato di un calcolo non e
definito, come 0/0 o log 0.
A seconda della macchina si ha:

Il NaNS: si ha un segnale di errore


0 1 1 1 ... 1 1 0 1 1 ... 1 1
|{z} | {z } | {z }
s esponente mantissa
4. Precisione numerica 8

Il NaNQ: il calcolo continua comunque...


0 1 1 1 ... 1 1 1 0 0 ... 0 0
|{z} | {z } | {z }
s esponente mantissa

4 Precisione numerica
Un numero puo avere una rappresentazione finita o infinita. Basti pensare al valore
di o a 2 in base 10.
Abbiamo anche visto che un numero puo avere rappresentazione finita in una
base ma infinita in unaltra.
Esempio
Scriviamo il numero 1.110 in base 2.
Per la parte intera: 1 0 1 b0
.1 2 = 0.2 b1 = 0
.2 2 = 0.4 b2 = 0
.4 2 = 0.8 b3 = 0
.8 2 = 1.6 b3 = 1
.6 2 = 1.2 b4 = 1
Per la parte decimale:
.2 2 = 0.4 b5 = 0
.4 2 = 0.8 b6 = 0
.8 2 = 1.6 b7 = 1
.6 2 = 1.2 b8 = 1
.2 2 = 0.4 b9 = 0
Osserviamo che nella parte decimale si ripetono allinfinito le cifre 0011.
Il numero in base 2 si scrive infatti come: 1.0 0011
| {z } 0011
| {z } . . .

Quando rappresentiamo un numero al calcolatore sara possibile memorizzare
solo un certo numero di cifre: come esprimerlo?
Per lasciare
Pmaggiore generalita al discorso, consideriamo una base N .
Sia a = ( k=0 bk N )N p il numero esatto.
k
P
In floating-point esso sara espresso come a = ( t1 k=0 bk N
k )N p , esso, cioe,

sara arrotondato.
Ci sono due modi per arrotondare un numero

troncamento a = tronc(a), dove p = p e bk = bk per k = 0, . . . , t 1. Le


altre cifre, bt , bt1 , . . . sono ignorate.
1
arrotondamento simmetrico a = arr(a) = tronc(a + N t+1 N p ), aggiungiamo
2
ununita a bt+1 se bt N/2.

Lerrore assoluto che si commette approssimando il numero a con a sara, dun-


que,
5. Propagazione degli errori 9


N 1t N p nel troncamento
errore assoluto |a a | 1 1t p
N N nellarrotondamento
2
Per lerrore relativo, invece, si ha:

|a a | N
1t nel troncamento
errore relativo 1 1t
|a| N nellarrotondamento
2
1
Il valore N 1t e il numero conosciuto come precisione di macchina.
2
Esempio
Nel caso della rappresentazione IEEE di un numero, con t 1 = m, lerrore di
arrotondamento che si commette e:

|a a | 2(m+1)
In singola precisione avremo

|a a | 224 5.96 108


cio significa che avremo 8 cifre decimali corrette.
In doppia precisione avremo

|a a | 253 1.11 1016


cio significa che avremo 16 cifre decimali corrette.

5 Propagazione degli errori


Prima di vedere come si propagano gli errori nelle operazioni elementari di moltipli-
cazione, divisione, addizione e sottrazione, vediamo il concetto di cifre significative.
Le cifre significative sono quelle che danno uninformazione effettiva sul valore
del numero, indipendentemente dalla parte esponenziale. E chiaro che il contenuto
delle informazioni sulle cifre va diminuendo via via che ci si sposti da sinistra verso
destra. Quando un numero e arrotondato e rappresentato in modo da includere solo
cifre significative, la prima cifra a destra del punto decimale e sempre diversa da
zero.
Vediamo ora come si propagano gli errori nelle operazioni elementari. Suppo-
niamo che i numeri su cui lavoriamo siano affetti da errore (di arrotondamento),
mentre le operazioni siano eseguite in modo esatto. Indichiamo con o una qua-
lunque delle operazioni elementari {, /, +, } e indichiamo con f l(x) il numero x
rappresentato in floating point e arrotondato, quindi f l(x) = x(1 + ex ) dove ex e
lerrore di arrotondamento.
5. Propagazione degli errori 10

Allora f l(x o y) = f l(x) o f l(y) = x(1 + ex ) o y(1 + ey ).

Moltiplicazione2

x(1 + ex ) y(1 + ey ) = x y(1 + ex )(1 + ey ) x y(1 + ex + ey )

Quindi lerrore nel prodotto e dato da exy = ex + ey

Divisione (con y 6= 0)

x(1 + ex ) x x
= (1 + ex )(1 ey + e2y + . . .) (1 + ex ey )
y(1 + ey ) y y

Si ha ex/y = ex ey : gli errori si accumulano additivamente

Addizione (e, analogamente, Sottrazione)

x y
x(1 + ex ) + y(1 + ey ) = x + y + xex + yey = (x + y)(1 + ex + ey )
x+y x+y

x y
Lerrore e ex+y = ex + ey , una combinazione lineare che dipende da
x+y x+y
x e y.

xy > 0 = |ex+y |ex | + |ey |


|x| |y|
xy < 0 = e possono essere molto grandi e, in tal caso, ci
|x + y| |x + y|
sara unamplificazione notevole dellerrore. Si ha il fenomeno di cancel-
lazione se non si fa attenzione al numero di cifre significative dei numeri
che vengono sommati.

Esempio [Sulluso delle cifre significative]


Sia x = 0.1103 e y = 0.009963. Se consideriamo un sistema decimale a 4 cifre, y,
normalizzato, viene scritto e memorizzato come 0.9963 102 .
Facendo la sottrazione di questi due numeri, abbiamo 0.1103 100 0.9963 102 =
0.1103 0.009963 = 0.100337. Facendo larrotondamento a 4 cifre abbiamo il valore
0.1003.
|0.100337 0.1003|
Lerrore relativo che commettiamo e: .37 103 . Questo
0.100337
errore e minore della precisione di macchina (considerata la base 10 e le 4 cifre)
1
103 .
2
Tuttavia, se non teniamo conto delle cifre significative ma tronchiamo i numeri
alle prime 4 cifre, abbiamo la sottrazione di 0.1103 0.0099 = 0.1004.
2
nei conti si trascurano le potenze maggiori o uguali a due per e x e ey
5. Propagazione degli errori 11

|0.100337 0.1004|
Questa volta lerrore relativo e .63 103 . Lerrore e mag-
0.100337
giore della precisione di macchina.

Esempio [Il disastro del missile Patriot ]
Nel 1991 un missile Patriot fall loperazione di inseguire e fermare uno Scud, in
Arabia Saudita, a causa di un problema di precisione numerica. Come conseguenza,
lo Scud uccise 28 americani.
Il computer usato per controllare il missile Patriot era basato su unaritmetica
a 24 bit. Per i calcoli, il tempo veniva registrato dallorologio interno del sistema
in decine di secondi e successivamente moltiplicato per 1/10 per ottenere i secondi,
utilizzando 24 bit in virgola fissa. Il numero 1/10 in base 2 ha infinite cifre decimali:
la sua espansione binaria e infatti 0.0001100110011001100110011001100 . . .. In 24
bit esso veniva registrato come 0.00011001100110011001100 introducento un errore di
0.0000000000000000000000011001100 . . ., circa 0.000000095 in base 10.
Gli errori di arrotondamento nella conversione del tempo causarono un errore
nel calcolo della traiettoria. Difatti, il tempo di 100 ore calcolato in secondi diede il
valore 359999.6567 invece di 360000, un errore di 0.3433 secondi che porto il Patriot
687 metri fuori della traiettoria del missile Scud!

Esempio [Sul fenomeno di cancellazione]
Consideriamo il problema di approssimare la derivata della funzione f (x) =
sin x nel punto x = 1.2.
Supponiamo di non poter valutare direttamente la derivata della f e di volerla
approssimare facendo uno sviluppo in serie di Taylor:

h2 00 h3 h4
f (x0 + h) = f (x0 ) + hf 0 (x0 ) + f (x0 ) + f 000 (x0 ) + f IV (x0 ) + . . .
2 6 24
Allora
f (x0 + h) f (x0 ) h h2 h3
f 0 (x0 ) = ( f 00 (x0 ) + f 000 (x0 ) + f IV (x0 ) + . . .)
h 2 6 24
f (x0 + h) f (x0 )
Approssimiamo, quindi, la f 0 (x0 ) calcolando .
h
Lerrore di discretizzazione che si commette e
f (x0 + h) f (x0 ) h h2 h3
|f 0 (x0 ) | = | f 00 (x0 ) + f 000 (x0 ) + f IV (x0 ) + . . . |
h 2 6 24
Supponendo di conoscere il valore della derivata seconda in x0 , per piccoli valori
di h possiamo dare una stima dellerrore di discretizzazione,

f (x0 + h) f (x0 ) h
|f 0 (x0 ) | |f 00 (x0 )|
h 2
5. Propagazione degli errori 12

Ci aspettiamo, anche senza conoscere il valore di f 00 (x0 ) (purche diverso da 0) che


lerrore di discretizzazione diminuisca proporzionalmente con il passo h, al decre-
scere di h.
Nel nostro caso, in cui f (x) = sin (x), noi conosciamo il valore esatto della deri-
vata in 1.2, vale a dire cos (1.2) = 0.362357754476674...
Il valore che otteniamo approssimando la derivata con la formula che abbiamo
ricavato, per h = 0.1 non e molto accurato. Ci aspettiamo che diminuendo il passo h
lerrore che commettiamo diminuisca.
Riportiamo gli errori della formula (in valore assoluto) e confrontiamoli con
h
lerrore di discretizzazione |f 00 (x0 )| (i conti sono fatti in singola precisione):
2
h 00
h errore |f (x0 )|
2
1.e-1 4.7167e-2 4.6602e-2
1.e-2 4.6662e-3 4.6602e-3
1.e-3 4.6608e-4 4.6602e-4
1.e-4 4.6603e-5 4.6602e-5
1.e-5 4.6602e-6 4.6602e-6
1.e-6 4.6597e-7 4.6602e-7
h
Lerrore commesso dallalgoritmo decresce come h e, in particolare, come |f 00 (1.2)| =
2
0.46602h.
Possiamo pensare di ottenere unaccuratezza grande quanto vogliamo a condizio-
ne di prendere valori di h sempre piu piccoli. In realta, per valori di h molto piccoli,
gli errori iniziano ad aumentare!
h 00
h errore |f (x0 )|
2
1.e-8 4.3611e-10 4.6602e-9
1.e-9 5.5947e-8 4.6602e-10
1.e-10 1.6697e-7 4.6602e-11
1.e-11 4.6603e-5 4.6602e-12
1.e-12 1.3006e-4 4.6602e-13
1.e-13 4.2505e-4 4.6602e-14
1.e-16 3.6236e-1 4.6602e-16
1.e-18 3.6236e-1 4.6602e-19

In figura 1 vediamo come la curva dellerrore inizialmente segue la retta descritta


dallerrore di discretizzazione ma poi si allontana da essa. Perche questo diverso
comportamento per valori di h molto piccoli? Lerrore che noi valutiamo e dato dalla
somma dellerrore di discretizzazione e dellerrore di arrotondamento. Per valori di
h grandi, lerrore di discretizzazione descresce al diminuire di h e domina lerrore
di arrotondamento. Ma quando lerrore di discretizzazione diventa molto piccolo,
per valori di h minori di 108 , allora lerrore di arrotondamento inizia a dominare
5. Propagazione degli errori 13

Figura 1: La curva tratteggiata -. rappresenta lerrore di discretizzazione, la


curva rappresentata come -o e la curva dellerrore computazionale che si ha
f (x0 + h) f (x0 )
approssimando f 0 (x0 ) con il rapporto incrementale .
h
0
10

5
10

10
10
Errore assoluto

15
10

20
10

25
10
20 15 10 5 0
10 10 10 10 10
passo h

e ad aumentare sempre piu al diminuire di h. Questo e un motivo per cui si deve


richiedere ad un algoritmo che lerrore di discretizzazione sia quello che debba pre-
valere. Nellerrore di arrotondamento, per h via via piu piccoli, si verifica un errore
di cancellazione: f (x0 + h) e praticamente uguale a f (x0 ) per h molto piccoli! per cui
lerrore che calcoliamo e |f 0 (x0 ) 0| = f 0 (x0 ) = 0.3623577544....
Una strategia per evitare la cancellazione e di scrivere diversamente la differenza
f (x0 + h) f (x0 ). Nel caso di f (x) = sin (x) ricorriamo alla formula trigonometrica
+
per cui sin () sin () = 2 cos ( ) sin ( ).
2 2
Vediamo come migliorano le cose inserendo nel grafico di prima la curva deller-
rore che otteniamo utilizzando questa espressione trigonometrica. Lerrore continua
a diminuire anche quando la formula precedente inizia a dare un errore crescente.
Nel grafico 2 abbiamo anche considerato la curva dellerrore di arrotondamento
in modo da confrontare landamento effettivo con un limite superiore teorico del-
lerrore computazionale totale dato dalla somme degli errori di discretizzazione e di
arrotondamento.
La rappresentazione di f (x) e affetta da errore per cui avremo: f (x) = f (x) + ex .
f (x0 + h) f (x0 ) f (x0 + h) f (x0 ) ex0 +h ex0
Lerrore di arrotondamento e = + .
h h h
Maggiorando ex con la precisione di macchina , lerrore di arrotondamento e dato
da 2/h.
Esempio [Sempre sul fenomeno di cancellazione]
5. Propagazione degli errori 14

Figura 2: La curva tratteggiata -. rappresenta lerrore di discretizzazione, la


curva continua - lerrore dovuto allarrotondamento, la curva rappresentata co-
me -o e la curva dellerrore computazionale che si ha approssimando f 0 (x0 ) con
f (x0 + h) f (x0 )
il rapporto incrementale , mentre la curva rappresetata da -
h
+ e la curva dellerrore che si commette applicando al rapporto incrementale
la formula trigonometrica per cui f (x0 + h) f (x0 ) = sin (x0 + h) sin (x0 ) =
2 cos (2x0 + h/2) sin (h/2).
5
10

0
10

5
10
Errore assoluto

10
10

15
10

20
10

25
10
20 15 10 5 0
10 10 10 10 10
passo h

Sia da risolvere lequazione x2 56x +1 = 0 in una macchina a 5 cifre decimali.


b b2 4ac
Applicando la formula x1/2 = allequazione ax2 + bx + c = 0,
2a (
0.01786284073
abbiamo x1/2 = 28 783 = 28 27.98213716 = .
55.98213716
Consideriamo la macchina a 5 cifre decimali.

x1 = 28 783 = .28 102 .27982 102 = 0.00018 102 = 0.018

x2 = 28 783 = .28 102 + .27982 102 = 0.55982 102 = 55.982
La radice x2 e arrotondata correttamente, mentre la variabile x1 no, per effetto
della cancellazione.
Possiamo pero scrivere x1 x2 = 1 da cui x1 = 1/x2 = 1/0.55982 102 = 1.7862

In aritmetica di macchina non valgono piu la proprieta distributiva o associativa
del prodotto.
6. Instabilita e malcondizionamento 15

Esempio [Sulla proprieta distributiva e associativa]


Vediamo come non valga piu la relazione (a b)2 = a2 2ab + b2 .
Sia a = 15.6 e b = 15.7 e la macchina sia a 3 cifre decimali.
(a b) = (a b) + eab . Abbiamo (a b) = 15.6 15.7 = 0.1.
Quindi (a b)2 = +0.01 = 0.1 101 .
Consideriamo ora a2 2ab + b2 = 243.36 489.84 + 246.49 = .24336 103 .48984
103 + .24649 103
Considerando la macchina a 3 cifre decimali, abbiamo: .243 103 .490 103 +
.246 103 = 0.1 101
I risultati sono completamente diversi!

6 Instabilita e malcondizionamento
6.1 Instabilita
In generale e impossibile evitare un accumulo lineare degli errori di arrotondamen-
to durante un calcolo, ed e accettabile che ci sia una crescita lineare moderata, del
tipo
En c0 nE0
dove En misura lerrore relativo delln-sima operazione dellagoritmo e c0 sia una
costante non molto grande.
Se invece avviene una crescita di tipo esponenziale

En cn1 E0

allora lalgoritmo e instabile.


Algoritmi del genere devono essere evitati!
Definiamo, quindi, un procedimento numerico instabile se gli errori che vi sono
associati non rimangono limitati ma crescono fino a distruggere completamente la
soluzione.
Esempio
Consideriamo lintegrale Z 1
xn
yn = dx
0 x + 10
per valori di n = 1, 2, . . . , 30. Osserviamo che, poiche x [0, 1], la funzione integran-
da varia pure essa nellintervallo [0, 1] per cui 0 < yn < 1.
Analiticamente, si ha:
Z 1 n Z 1 n1 Z 1
x + 10xn1 x (x + 10) 1
yn + 10yn1 = dx = dx = xn1 dx =
0 x + 10 0 x + 10 0 n
Vale anche la relazione
Z 1
1
y0 = dx = ln 11 ln 10.
0 x + 10
6. Instabilita e malcondizionamento 16

Possiamo pensare, quindi, di calcolare numericamente il valore di yn attraverso


il seguente algoritmo:

1. valutare y0 = ln 11 ln 10
1
2. per n = 1, 2, . . . , 30 valutare yn = 10yn1
n
Questa formula ricorsiva dovrebbe dare lesatto valore se non fossero presenti
errori di arrotondamento. I numeri che generiamo, infatti, tendono a zero mentre
lerrore si moltiplica.
Infatti

y1 = 1 10y0
1 1
y2 = 10(1 10y0 ) = 10 102 y0
2 2
1 1
y3 = 10( 10 10 y0 ) = 103 y0 + costante
2
3 2
......
yn = 10n y0 + costanten

Lalgoritmo quindi, considerati gli errori di arrotondamento, presenta un errore


En con crescita di tipo esponenziale. Difatti otteniamo valori che via via si allon-
tanano dallintervallo di ammissibilita [0, 1]. Abbiamo infatti (in doppia precisione
con un codice Matlab):
n yn
0 9.5310e-2
1 4.6898e-2
2 3.1018e-2
3 2.3154e-2
4 1.8465e-2
... ....
7 1.1481-2
8 1.0194e-2
9 9.1673e-3
10 8.3270e-3
18 -9.1694e+1
27 -9.1699e+9
30 -9.1699e+13

Se facciamo un programma in Fortran che descrive lo stesso algoritmo abbiamo


invece i risultati (con valori crescenti ma diversi):
6. Instabilita e malcondizionamento 17

n yn
0 9.5310e-2
1 4.6898e-2
2 3.1021e-2
3 2.3122e-2
4 1.8778e-2
... ....
7 -3.0229e-1
8 3.1479e+0
9 -3.1368e+1
10 3.1378e+2
18 3.1377e+10
27 -3.1377e+19
30 3.1377e+22
1 1
Se invece, considero yn1 = ( yn ), partendo da un valore di n molto grande
10 n
e andando a ritroso, lerrore diminuisce. Percio, dato un valore di accuratezza  > 0 e
fissato un intero n0 e possibile determinare lintero n1 tale che, partendo da yn1 = 0 e
andando a ritroso, gli integrali yn saranno valutati con un errore in valore assoluto
minore di  per 0 < n n0 .
Infatti:

y n0 = 0
1 1
yn0 1 =
10 n0
1 1 1 1 1
yn0 2 = ( ) = 2 costante2
10 n0 1 10 n0 10
1
yn = n0 n costanten0 n
10

1
Lerrore al passo n dipende, quindi, da .
10n0 n
Se richiediamo una tolleranza  = 106 , per calcolare yn1 allora dovra essere
1
<  = 10n1 n0 < 
10n0 n1
Passando al logaritmo in base 10:

n1 n0 < log  = n0 > n1 log 

Per n1 = 20 si ricava n0 = 26.


Questa volta i calcoli danno gli stessi risultati sia in Matlab sia in Fortran:
6. Instabilita e malcondizionamento 18

n yn
26 0.000000
25 3.84615e-3
24 3.61538e-3
23 3.80513e-3
22 3.96731e-3
21 4.14872e-3
20 4.34703e-3
19 4.56530e-3
18 4.80663e-3
17 5.07489e-3
16 5.37486e-3
15 5.71251e-3
14 6.09542e-3
13 6.53332e-3
12 7.03898e-3
11 7.62944e-3
10 8.32797e-3
9 9.16720e-3
8 1.01944e-2
7 1.14806e-2
6 1.31377e-2
5 1.53529e-2
4 1.84647e-2
3 2.31535e-2
2 3.10180e-2
1 4.68982e-2
0 9.53102e-2

Osserviamo come il valore y0 coincida con il valore teorico noto.



Lesempio appena visto ci porta a dare alcune considerazioni sui criteri su cui
si deve basare un algoritmo: un algoritmo deve essere accurato, efficiente e ro-
busto, accurato nel senso che bisogna essere in grado di sapere la grandezza del-
lerrore che si commette nellalgoritmo stesso; efficiente in termini di velocita di
esecuzione e di richiesta di spazio di memoria per le variabili utilizzate; robusto nel
dare il risultato corretto entro un livello di tolleranza dellerrore che sia accettabile.

6.2 Malcondizionamento
Un problema si dice malcondizionato se a piccole variazioni nei dati di input del
problema corrispondono forti variazioni nei dati di output. Quando il problema e,
dunque, molto sensibile alle variazioni dei dati di input, producendo risultati molto
6. Instabilita e malcondizionamento 19

diversi tra loro, allora nessun algoritmo, per quanto robusto e stabile, potra dare
una soluzione robusta al problema stesso.
Esempio [Sui polinomi]
Sia p(x) il polinomio di grado n, p(x) = xn + an1 xn1 + . . . + a1 x + a0 , con a0 6= 0.
Si vogliono trovare le radici del polinomio p(x).
I dati di input sono dunque i coefficienti ai , i = 0, n 1 del polinomio mentre i
dati di output sono le radici del polinomio. Sia una radice del polinomio. Essa
sara funzione dei coefficienti ai , quindi scriveremo = f (a0 , a1 , . . . , an1 ).
Perturbiamo, ora, uno dei coefficienti, ad esempio ak con ak +ak e vediamo come
variano le radici del polinomio perturbato rispetto a quello di partenza, consideran-
do il rapporto

f
f
dove f = f (a0 , a1 , . . . , ak + ak , . . . , an1 ) f (a0 , a1 , . . . , ak , . . . , an1 )
Supponendo ak sufficientemente piccolo, si puo approssimare f con lo svilup-
f
po in serie di Taylor troncato al primo termine, cioe f = ak .
ak
Percio
f f
ak ak
f ak ak ak
= =
f f f ak
f
La variazione sulle radici e dunque proporzionale alla variazione sui dati di
f
f
ak
ak ak
ingresso mediante il coefficiente .
ak f
Calcoliamo questa quantita. Scriviamo il polinomio come:

n + an1 n1 + . . . + ak xk + . . . + a0 = 0

vale a dire

f (a0 , a1 , . . . , an1 )n + an1 f (a0 , a1 , . . . , an1 )n1 + . . . + ak f (a0 , a1 , . . . , an1 )k + . . . + a0 = 0

Ho unidentita nelle variabili a0 , a1 , . . . , an1 . Anche la derivata parziale rispetto


ad ak sara, percio, unidentita a zero:
f f
n f (a0 , a1 , . . . , an1 )n1 + an1 (n 1) f (a0 , a1 , . . . , an1 )n2 + . . .+
ak ak
f f
ak k f (a0 , a1 , . . . , an1 )k1 + f (a0 , a1 , . . . , an1 )k + . . . + a1 =0
ak ak
la derivata del termine ak f (...)k
6. Instabilita e malcondizionamento 20

Da questa relazione ricaviamo:


f
(n n1 + an1 (n 1) n2 + . . . + ak k k1 + . . . + a1 ) = k
ak
f 0
p () = k
ak
f k
= 0
ak p ()

Andando a sostituire otteniamo:


f
ak
f ak ak ak k ak
= = 0
f f ak p () ak

ak k
Se il coefficiente e grande in valore assoluto, allora a piccole variazioni
p0 ()
sul coefficiente ak si avranno grandi variazioni nella radice . Cio, si verifica, ad
esempio, quando le radici sono in modulo molto vicine tra loro.
Supponiamo di avere il polinomio p(x) = (x 1)(x 2) (x 10). Chiaramente,
tale polinomio ha radici 1, 2, . . . , 10. Se perturbiamo il polinomio variando il coeffi-
ciente a9 del valore 0.0001, considerando cioe il polinomio p(x) + 0.0001x9 allora le
radici corrispondenti a 7, 8, 9, 10 non saranno piu reali ma avranno anche una parte
immaginaria.
Quindi un piccolo cambiamento nel coefficiente a9 , da -55 a -54.9999 porta a
grandi cambiamenti in alcune delle radici del polinomio.