errorifin
errorifin
errorifin
1
prof.ssa Rossana Vermiglio, dott. Dimitri Breda
Dipartimento di Matematica e Informatica
Università degli Studi di Udine
rossana.vermiglio,dimitri.breda@dimi.uniud.it
http://www.dimi.uniud.it/rossana,dbreda
Indice
1 Appunti sulla teoria degli errori 3
1.1 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.2 Fonti d’incertezza . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.3 Errore assoluto e relativo . . . . . . . . . . . . . . . . . . . . . . 5
1.4 Numeri di macchina o floating-point . . . . . . . . . . . . . . . . 8
1.5 Approssimazione dei numeri reali e precisione di macchina . . . . 10
1.6 Aritmetica di macchina . . . . . . . . . . . . . . . . . . . . . . . 12
1.7 Analisi dell’errore . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
1.7.1 Errore inerente . . . . . . . . . . . . . . . . . . . . . . . . 14
1.7.2 Errore analitico o di troncamento . . . . . . . . . . . . . . 16
1.7.3 Errore algoritmico . . . . . . . . . . . . . . . . . . . . . . 17
1.7.4 Analisi dell’errore di tipo ”misto” : in avanti e all’indietro 19
1.7.5 Cancellazione . . . . . . . . . . . . . . . . . . . . . . . . . 19
1.7.6 Somma di n numeri . . . . . . . . . . . . . . . . . . . . . 24
1.8 Complessità computazionale e parametri di qualità del software
matematico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
1.9 Osservazioni conclusive . . . . . . . . . . . . . . . . . . . . . . . . 27
2 Esercizi svolti 27
3 Esercizi da svolgere 43
4 Domande di verifica 45
2
1 Appunti sulla teoria degli errori
1.1 Introduzione
L’analisi numerica si occupa dello sviluppo e dell’analisi di algoritmi per la
risoluzione di problemi matematici che sono suggeriti dalle scienze computazio-
nali e dall’ingegneria. Per questo motivo più recentemente è stata anche indicata
con il nome calcolo scientifico.
In particolare tratta problemi matematici che coinvolgono variabili reali e
complesse (problemi di matematica del continuo), ricerca delle tecniche di
approssimazione che convergano rapidamente e ne studia l’accuratezza. Gli algo-
ritmi sviluppati sono implementati su un calcolatore. Pertanto anche l’architet-
tura dello strumento di calcolo gioca un ruolo non trascurabile nella risoluzione
del problema e nell’accuratezza della risposta finale.
In molti problemi della matematica del continuo, l’approssimazione è inevita-
bile, perchè le quantità coinvolte non sono calcolabili dal punto di vista analitico.
L’obiettivo del calcolo scientifico è pertanto quello di sviluppare ed analizzare
degli algoritmi efficienti, che forniscano una soluzione ad alcuni problemi del-
la matematica del continuo nel minimo tempo e con la massima accuratezza
mediante il calcolatore.
Sono diversi gli “ingredienti” importanti nell’analisi numerica, ma il suo
cuore sta negli algoritmi.
L’analisi teorica di uno schema di approssimazione richiede non solo lo studio
della sua convergenza, ma anche della sua complessità computazionale. Tale
parametro misura il numero delle operazioni aritmetiche richieste in funzione
della dimensione del problema considerato e ci fornisce una stima del tempo di
esecuzione dell’algoritmo.
Per essere eseguito l’algoritmo deve essere codificato in un programma e altri
fattori devono essere considerati per misurare la qualità del software sviluppato:
affidabilità, efficienza, flessibilità e altri (ulteriori dettagli nella sezione 1.8).
La strategia generale per affrontare il problema da approssimare consiste nel
sostituire il problema difficile con uno più semplice, che ha la stessa soluzione
del problema originale o almeno ha una soluzione “vicina” secondo lo schema:
• complicato → semplice
• nonlineare → lineare
3
e quindi degli errori. Pertanto per valutare la bontà della risposta finale (at-
tendibilità del risultato), bisogna analizzare e controllare tutte le “sorgenti
d’errore” o “fonti d’incertezza”.
4
1.3 Errore assoluto e relativo
Sia x̃ un’aprossimazione del numero reale x. Si definisce errore assoluto
ex = |x̃ − x|
ex = kx̃ − xk
e, se x 6= 0,
ex
x = .
kxk
In alcuni contesti può essere utile considerare l’errore relativo “componentwise”,
valutando max xi .
i=1,...,n
Solitamente il valore esatto x è sconosciuto, allora si cerca una stima o una
limitazione superiore dell’errore. Per la stessa ragione, l’errore relativo è spesso
valutato rispetto al valore approssimato x̃ invece di quello esatto x.
Spesso nella valutazione di accuratezza di un risultato, si parla di cifre
significative esatte. Vediamo attraverso alcune semplici considerazioni, come
sia problematico fornire una definizione rigorosa di tale concetto abbastanza
intuitivo. Le cifre significative di un numero x sono le prime cifre diverse
da zero e tutte le successive (es. 0.012302, 121.000567). La nozione di cifre
significative esatte è legata all’errore relativo.
Consideriamo, per esempio, le seguenti coppie di numeri reali e l’errore
relativo corrispondente
5
concludere che l’errore relativo fornisce una stima più attendibile e fine dell’ac-
curatezza dell’approssimazione rispetto all’informazione sul numero delle cifre
significative esatte.
Vediamo ora alcuni esempi che hanno lo scopo di sottolineare il ruolo non
trascurabile dello strumento di calcolo nell’accuratezza della risposta numerica
finale.
∞
xk
Esempio 3 Per calcolare la funzione esponenziale ex =
P
k! , si può consi-
k=0
n
xk
P
derare il troncamento della serie gn (x) = k! con n determinato in modo che
k=0
l’ulteriore addendo non migliora l’approssimazione ottenuta. Implementando
tale algoritmo in MATLAB con eps = 2.22 × 10−16 , si ottengono i risultati in
Tabella 2. È evidente l’inaccuratezza della risposta per valori x < 0 .
6
i pi errass errrel
1 2.828427124746190 3.13e-01 9.97e-02
2 3.061467458920719 8.01e-02 2.55e-02
3 3.121445152258053 2.01e-02 6.41e-03
4 3.136548490545941 5.04e-03 1.60e-03
5 3.140331156954739 1.26e-03 4.01e-04
6 3.141277250932757 3.15e-04 1.00e-04
7 3.141513801144145 7.88e-05 2.51e-05
8 3.141572940367883 1.97e-05 6.27e-06
9 3.141587725279961 4.92e-06 1.57e-06
10 3.141591421504635 1.23e-06 3.92e-07
11 3.141592345611077 3.07e-07 9.80e-08
12 3.141592576545004 7.70e-08 2.45e-08
13 3.141592633463248 2.01e-08 6.40e-09
14 3.141592654807589 1.22e-09 3.88e-10
x n gn (x) errrel
0.5 16 1.648721270700128 2.69e-16
1 19 2.718281828459046 1.63e-16
20 68 4.851651954097902e+08 1.22e-16
40 103 2.353852668370200e+17 1.35e-16
100 192 2.688117141816133e+43 9.21e-16
7
h errrel
1.e-01 5.1709e-02
1.e-02 5.0167e-03
1.e-03 5.0017e-04
1.e-04 5.0002e-05
1.e-05 5.0000e-06
1.e-06 4.9994e-07
1.e-07 5.1484e-08
1.e-08 2.4290e-09
1.e-09 7.9257e-08
1.e-10 5.6937e-07
1.e-11 1.2005e-05
1.e-12 1.5904e-04
1.e-13 1.6770e-04
1.e-14 3.4351e-03
1.e-15 1.4360e-01
1.e-16 1.0000e+00
ex −1
Esercizio 1 Scrivere un programma MATLAB che approssima lim x =1
x→0
ex −1 −k
valutando x in xk = 10 , k = 1, 2, . . . , 20, stampa i valori apprrossimati e
l’errore con eventuale grafico.
• B base di rappresentazione,
• t numero cifre della mantissa,
• pmin e pmax limitazioni inferiore e superiore per l’esponente.
x = ±(d1 B −1 + d2 B −2 + . . . + dt B −t )B p ,
8
k fk errrel
1 2.593742460100002 4.5815e-02
2 2.704813829421528 4.9546e-03
3 2.716923932235594 4.9954e-04
4 2.718145926824926 4.9995e-05
5 2.718268237192297 4.9999e-06
6 2.718280469095753 5.0008e-07
7 2.718281694132082 4.9416e-08
8 2.718281798347358 1.1077e-08
9 2.718282052011560 8.2240e-08
10 2.718282053234788 8.2690e-08
11 2.718282053357110 8.2735e-08
12 2.718523496037238 8.8905e-05
13 2.716110034086901 7.9896e-04
14 2.716110034087023 7.9896e-04
15 3.035035206549262 1.1653e-01
16 1.000000000000000 6.3212e-01
17 1.000000000000000 6.3212e-01
18 1.000000000000000 6.3212e-01
19 1.000000000000000 6.3212e-01
20 1.000000000000000 0 6.3212e-01
k fk errrel
1 2.565784513950348 5.6101e-02
2 2.697344952565099 7.7022e-03
3 2.715632000168991 9.7482e-04
4 2.717950081189666 1.2204e-04
5 2.718240351930294 1.5258e-05
6 2.718276643766046 1.9073e-06
7 2.718281180370437 2.3842e-07
8 2.718281747447938 2.9802e-08
9 2.718281818332656 3.7253e-09
10 2.718281827193247 4.6566e-10
11 2.718281828300821 5.8208e-11
12 2.718281828439267 7.2759e-12
13 2.718281828456573 9.0949e-13
14 2.718281828458736 1.1371e-13
15 2.718281828459006 1.4213e-14
16 2.718281828459040 1.7971e-15
17 2.718281828459045 1.6337e-16
18 1.000000000000000 6.3212e-01
19 1.000000000000000 6.3212e-01
20 1.000000000000000 6.3212e-01
9
dove 0 ≤ di ≤ (B − 1), i = 1, ..., t, d1 6= 0, −pmin ≤ p ≤ pmax .
Ricordiamo che (d1 d2 ...dt ) è la mantissa, p è l’esponente del numero,
mentre c = p + pmin è la caratteristica. Tale rappresentazione si dice norma-
lizzata, perchè la cifra più significativa d1 6= 0, per x 6= 0. Nei sistemi binari,
i.e. B = 2, risulta d1 = 1 e pertanto non è necessario memorizzarla.
Le proprietà dell’insieme F sono:
10
• Troncamento: la mantissa di x viene troncata alla t-esima cifra.
Esempio: B = 10, t = 3: fl(0.1234567) = 0.123; fl(0.9876543) = 0.987,
fl(0.1235) = 0.123.
• Arrotondamento (“rounding”): il numero fl(x) è il numero di mac-
china più vicino a x.
Esempio: B = 10, t = 3: fl(0.1234567) = 0.123 e fl(0.9876543) = 0.988.
Quando x è equidistante da due numeri di macchina, fl(x) può essere
scelto in modi diversi. In particolare ricordiamo “round away from
zero” dove fl(x) è il numero più grande; “round to even” dove fl(x) è
il numero di macchina con la cifra dt pari.
Esempio: B = 10, t = 3: fl(0.1245) = 0.125 (away from zero); fl(0.1245) =
0.124 (to even).
Ogni numero reale x nel range di F sarà approssimato da fl(x) con un errore
relativo (errore di rappresentazione di x) maggiorato dalla precisione di
macchina u
|fl(x) − x|
x = ≤ u.
|x|
Per la precisione di macchina vale u := B 1−t nel caso di troncamento e
1−t
u := B 2 nel caso dell’arrotondamento.
Esempio 7 Consideriamo lo standard IEEE doppia precisione. Esso è definito
dai parametri B = 2, t = 53, pmin = 1021, pmax = 1024. L’esponente può
assumere anche i valori p = −pmin − 1 = −1022 e p = pmax + 1 = 1025 per usi
speciali (rappresentazione dello zero, numeri denormalizzati, overflow e NaN).
La caratteristica c soddisfa alle limitazioni 0 ≤ c ≤ 2047 = 211 −1. Lavorando in
base B = 2, solo le 52 cifre di , i = 2, . . . , 53, indicate in seguito con (d2 . . . dt ),
devono essere memorizzate. Tale standard usa l’arrotondamento alla cifra pari.
Il MATLAB esegue tutti i suoi calcoli secondo tale standard. La funzione logica
‘isieee’ ritorna il valore 1 ‘vero’ se sta usando l’aritmetica IEEE e 0 ‘falso’ in
caso contrario. La funzione ‘computer’ ci segnala su quale tipo di macchima il
MATLAB sta lavorando.
>> isieee
ans = 1
>> computer
ans = MAC2
La funzione ‘eps’ ci fornisce la distanza tra x = 1.0 e il successivo numero
floating point ed è uguale al doppio della precisione di macchina u = 2−53 ≈
1.11 × 10−16 .
>>eps
eps = 2.2204e-16
Le funzioni MATLAB ‘realmax’ e ‘realmin’ forniscono rispettivamente i numeri
(normalizzati) realmax e realmin:
11
>>realmax
ans =1.7977e+308
>>realmin
ans=2.2251e-308
Se il risultato di una computazione è più grande di realmax, si ha overflow
segnalato dall’ infinito (p = pmax + 1 e mantissa (d2 . . . dt ) nulla)
>>realmax*2
ans = Inf
Se il risultato di una computazione è più piccolo di realmin si ottiene in risposta
un numero denormalizzato o il valore zero se è più piccolo di eps∗realmin (i.e. il
più piccolo numero denormalizzato). Un numero denormalizzato è rappresentato
con la mantissa (d2 . . . dt ) diversa da zero e p = −pmin − 1.
>>realmin*eps
ans =4.9407e-324
>>realmin*eps/2
ans = 0
I risultati di operazioni non matematicamente definite producono un N aN (p =
pmax + 1, mantissa (d2 . . . dt ) non nulla):
>>0/0
Warning: Divide by zero ans = NaN
>>Inf/Inf
ans = NaN
>>Inf-Inf
ans = NaN
>>0*NaN
ans = NaN
Con il comando ‘format hex ’, i numeri binari floating point sono rappresentati
nel formato esadecimale:
>>format hex
>>eps
eps = 3cb0000000000000
>>realmax
ans =7fefffffffffffff
>>realmin
ans = 0010000000000000
>>2*realmax
ans =7ff0000000000000
12
Esempio 8 Sia B = 10, t = 3. Presi x1 = 0.123 × 101 , x2 = 0.123 × 10−1 =
0.00123×101 , in aritmetica esatta si ottiene x1 +x2 = 0.12423×101 . Il risultato
non è un numero di macchina e deve essere pertanto approssimato: rimane cosı̀
definita un’operazione approssimata, fl(+), tale che x1 fl(+)x2 = 0.124 × 101 .
Osserva che, in questo caso, le ultime due cifre di x2 non hanno effetto sul
risultato.
Per analizzare gli errori di arrotondamento in un algoritmo, dobbiamo fa-
re delle assunzioni sull’accuratezza nelle operazioni di base. Prendiamo come
modello di aritmetica di macchina il seguente: tutte le operazioni aritmeti-
che elementari (op = +, /, ∗, −) sono calcolate in modo da soddisfare per ogni
x1 , x2 ∈ F
|(x1 fl(op)x2 ) − (x1 op x2 )|
errop = ≤ u, op = +, /, ∗, − (2)
|x1 op x2 |
√
È normale considerare (2) valida anche per op = ·. Il modello asserisce che
il valore calcolato è “buono” come il valore ottenuto dall’arrotondamento del
valore esatto, cioè idealmente si assume
x1 fl(op) x2 = fl(x1 op x2 ).
Per lo standard IEEE il modello è valido.
L’aritmetica di macchina non soddisfa tutte le proprietà dell’aritmetica esat-
ta. NON sono valide, per esempio, la proprietà associativa della somma e del
prodotto, la proprietà distributiva della somma rispetto al prodotto, la legge di
cancellazione.
Esempio 9 Sia B = 10, t = 3. Presi x1 = 0.123 × 102 , x2 = 0.123 × 10−1 =
0.000123 × 102 , vale x1 + x2 = 0.123123 × 102 , ma x1 fl(+) x2 = 0.123 × 102 .
Osserva che x2 > 0 non ha effetto sul risultato in aritmetica approssimata.
Esempio 10 Sia B = 10, t = 3. Presi x1 = 0.559, x2 = 0.555, x3 = 0.4 × 10−2 ,
si ottiene (x1 fl(+)x2 )fl(+)x3 = 0.111 × 101 fl(+) 0.0004 × 101 = 0.111 × 101 ,
mentre x1 fl(+)(x2 fl(+)x3 ) = 0.559fl(+)0.559 = 0.112 × 101 che è il risultato
esatto arrotondato.
L’uso dell’aritmetica di macchina comporta che algoritmi matematica-
mente equivalenti non lo siano numericamente.
Esempio 11 Vale (1fl(+)x) fl(+)x = 1 ma 1fl(+) (xfl(+)x) > 1, dove x è un
numero di macchina positivo leggermente più piccolo della precisione u.
Esercizio 4 Verificare che non vale la proprietà associativa del prodotto nel
seguente caso: B = 10, t = 5, x1 = 0.80001 × 101 , x2 = 0.12508 × 101 ,
x3 = .80008 × 101 .
Esercizio 5 Verificare che non vale la proprietà distributiva del prodotto ri-
spetto alla somma nel seguente caso: B = 10, t = 5, x1 = −0.6 × 101 ,
x2 = 0.60003 × 101 , x3 = 0.2 × 102 .
13
1.7 Analisi dell’errore
Per analizzare ed introdurre i principali concetti, prendiamo in esame il proble-
ma del calcolo del valore y = f (x) dove f : R → R è una funzione assegnata
non razionale. Osserviamo che x ∈ R rappresenta il dato di input e y ∈ R
rappresenta il dato di output.
Osservazione: tutte le definizioni di errore possono essere estese al caso
più generale di y = F (x) con F : Rn → Rm , n, m, ≥ 1 usando le norme.
Sia g la funzione che rappresenta l’algoritmo scelto per approssimare la fun-
zione f in aritmetica esatta e sia infine g̃ la funzione effettivamente calcolata in
aritmetica di macchina. A causa degli errori di misurazione e di rappresentazio-
ne del numero reale x sul calcolatore, sarà usato in input un valore approssimato
x̃. In prima approssimazione risulta
f (x) − g̃(x̃)
errtotale = = errinerente + erranalitico + erralgoritmico
f (x)
dove
f (x) − f (x̃)
errinerente = , (3)
f (x)
f (x̃) − g(x̃)
erranalitico = , (4)
f (x̃)
g(x̃) − g̃(x̃)
erralgoritmico = . (5)
g(x̃)
L’accuratezza del risultato finale viene misurata dall’errore totale errtotale e
dipende da tutte le componenti d’errore errinerente , erranalitico , erralgoritmico .
14
Esempio 12 Il condizionamento della funzione f (x) = cos x è dato da
xi
ci (x) = , i = 1, 2, . . . , n,
x1 + . . . + xn
e, applicando la formula (6), si ottiene
n
P
|xi |
i=1
|errinerente | ≤ max (xi ) n . (7)
i=1,...,n P
| xi |
i=1
n
P
|xi |
i=1
Pertanto se Pn >> 1 il problema sarà fortemente mal condizionato (can-
| xi |
i=1
cellazione). Nel caso di somma di numeri xi di segno concorde invece risulta
n
P
|xi |
i=1
Pn = 1 ed il problema è ben condizionato.
| xi |
i=1
15
Esempio 14 Vogliamo valutare il condizionamento nel prodotto di n numeri,
n
Q
i.e. F (x1 , . . . , xn ) = xi . I coefficienti di amplificazione sono
i=1
ci (x) = 1, i = 1, 2, . . . , n,
Esercizio 9 Zeri di polinomio. Vogliamo studiare come variano gli zeri del
polinomio p(x) = (x − 1)(x − 2) · · · (x − 20) = x20 − 210x19 + . . . perturbando il
coefficiente a = 210 del monomio x19 come segue: ã = 210 + 2−23 con un errore
relativo pari a = 5.677 × 10−10 (vedi svolgimento Esercizio 13).
16
Nasce dall’interruzione di un processo iterativo prima della convergenza dopo
un numero finito di passi.
g = gN ◦ gN −1 ◦ . . . ◦ g1 .
y2 = g1 (x̃, x̃)
(8)
yi = gi−1 (x̃, yi−1 ), i = 3, . . . , N
dove gi = ∗, i = 1, ..., N − 1.
Il risultato ỹN = g̃(x̃) dell’algoritmo eseguito sul calcolatore sarà descritto
da
ỹ2 = g̃1 (x̃, x̃)
(9)
ỹi = g̃i−1 (x̃, ỹi−1 ), i = 3, . . . , N
dove g̃i = fl(∗), i = 1, ..., N − 1
17
totale e pertanto sia dal condizionamento del problema sia dalla stabilità del-
l’algoritmo. Un risultato non accurato può risultare sia dall’applicazione di un
algoritmo instabile ad un problema ben condizionato sia dall’applicazione di un
algoritmo stabile ad un problema mal condizionato. Le ricette per migliora-
re sono diverse: scegliere un algoritmo più stabile nel primo caso, riformulare
matematicamente il problema nel secondo caso.
Per analizzare l’errore algoritmico abbiamo a disposizione i grafi computa-
zionali nei casi semplici. Un altro approccio consiste nell’analisi all’ indietro
introdotta da J.H. Wilkinson (1919-1986). L’idea di tale tecnica sta nell’ in-
terpretare la soluzione g̃(x̃) fornita dall’algoritmo in aritmetica di macchina
con dato x̃ ∈ F come la soluzione ottenuta in aritmetica esatta con un dato
perturbato, i.e.
g̃(x̃) = g(x̃ + ).
L’algoritmo si dirà stabile all’indietro se, ∀x̃ il risultato sarà la soluzione in
||
aritmetica esatta su un dato “vicino” all’originale, i.e. |x̃| è un piccolo multiplo
della precisione di macchina u.
x̃ → g(x̃)
errore errore
all0 indietro in avanti
x̃ + → g̃(x̃) = g(x̃ + )
Osserva che
||
|erralgoritmico | ≈ condg (x̃) ,
|x̃|
dove cond(x̃) è il numero di condizionamento relativo alla funzione g.
x −→ y = f (x)
errore & errore
(10)
all0 indietro in avanti
x+ −→ ỹ = g̃(x̃) = f (x̃ + )
18
Vale
|errorre in avanti| ≈ condf (x)|errorre all’indietro|,
dove condf (x) è il numero di condizionamento relativo alla funzione f .
ỹ = ex+ ⇒ x + = log(ỹ)
ex = e = 2.7182818284590..., ỹ = 2.66666666666667
x + = log(ỹ) = 0.98082925301173
(11)
errore in avanti = ỹ − ex = −0.05161516179238
errore all’indietro = = −0.01917074698827
x̃ −→ y = f (x)
&
ỹ = g̃(x̃) (12)
l
x+ −→ ỹ + δ = f (x + )
In generale un algoritmo viene detto numericamente stabile se è stabile
rispetto ad un analisi dell’errore di tipo ”misto”.
1.7.5 Cancellazione
In base alla formula (7), la sottrazione di due numeri approssimati (a causa di
errori di arrotondamento o di altri errori attribuibili a computazioni precedenti)
aventi lo stesso segno e modulo quasi uguale può essere causa di inaccuratezza
nel risultato. Tale fenomeno è indicato come cancellazione.
19
• Una prima situazione numericamente √ “delicata” si potrà presentare quan-
do b2 |4ac| da cui segue che b2 − 4ac ≈ |b| ed il fenomeno del-
la cancellazione √
si può presentare nel calcolo di una delle due soluzio-
ni. Il termine b2 − 4ac sarà affetto da errori di approssimazione e
pertanto secondo la formula (7), la sottrazione amplificherà tale errore.
La cancellazione√ in questo caso può essere evitata facilmente calcolando
b2 −4ac)
x1 = −(b+sign(b)
2a e, successivamente, x2 = axc 1 .
• Una cancellazione ben più pericolosa numericamente si può presentare nel-
la valutazione dell’espressione b2 − 4ac. Nel caso di radici quasi coinci-
denti (i.e. b2 ≈ 4ac), ci può essere una significativa perdita di accuratezza
nel risultato, che non può essere risolta con una trasformazione algebrica.
L’unica possibilità consiste nel valutare tale espressione con una precisione
maggiore.
• Un’altra difficoltà numerica può essere dovuta all’overflow, che, per esem-
pio, si può incontrare nel calcolo di b2 e 4ac con a, b e c con esponen-
te p = (pmax + 1)/2. In alcuni casi l’overflow si può risovere con uno
“scaling” dei dati.
Esempio 22 Deviazione standard La media mn di n numeri x1 , . . . , xn , è
data da
Pn
xi
i=1
mn =
n
e la deviazione standard σn è data da
n
(xi − m)2
P
i=1
σn =
n−1
Per calcolare la deviazione σn , spesso, onde evitare due passaggi di dati,
viene proposta la seguente formula matematicamente equivalente
n
n 2
2 1
P P
xi − n xi
σn = i=1 i=1
.
n−1
In presenza di errori di arrotondamento, questa seconda formulazione che calco-
la la deviazione come differenza di due numeri positivi, può fornire una risposta
non accurata per il fenomeno della cancellazione. Un algoritmo numericamente
stabile per calcolare la devizione standard è il seguente: definite le quantità
k
P
xi
i=1
mk = , k = 1, . . . , n,
k
e
k
X
qk = (xi − mk )2 , k = 1, . . . , n,
i=1
20
valgono le relazioni ricorsive
xk − mk−1
m1 = x1 , mk = mk−1 + , k = 2, . . . , n,
k
(xk − mk−1 )2 (k − 1)
q1 = 0, qk = qk−1 + , k = 2, . . . , n,
k
che mi permettono di ricavare la deviazione standard da σn = qn /(n − 1).
L’inacuratezza dei risultati ottenuti dall’algoritmo di Archimede in Esempio
2, dall’ approssimazione dell’esponenziale per x < 0 in Esempio 3, dall’appros-
simazione della derivata con il rapporto incrementale in Esempio 4 sono tutti
imputabili alla cancellazione.
Esempio 23 L’algoritmo di Archimede può essere riscritto, per evitare la can-
cellazione, nel seguente modo
√
l1 = 2,
li
li+1 = q √ , i = 1, 2, . . . ,
2+ 4−li2
pi = li × 2i , i = 1, 2, . . . .
I risultati ottenuti in MATLAB con eps = 2.22 × 10−16 sono riportati in Tabella
6 e confermano che tale algoritmo è numericamente stabile.
if x=0 then
f=1
else
f=(exp(x)-1)/x
end
• Algoritmo 2:
y=log(x)
if y=1 then
g=1
else
g=(y-1)/log(y)
end
21
i pi errass errrel
1 2.828427124746190 3.13e-01 9.97e-02
2 3.061467458920718 8.01e-02 2.55e-02
4 3.136548490545939 5.04e-03 1.60e-03
5 3.140331156954753 1.26e-03 4.02e-04
6 3.141277250932773 3.15e-04 1.01e-04
7 3.141513801144301 7.89e-05 2.51e-05
8 3.141572940367092 1.97e-05 6.27e-06
9 3.141587725277160 4.93e-06 1.57e-06
10 3.141591421511200 1.23e-06 3.92e-07
11 3.141592345570118 3.08e-07 9.80e-08
12 3.141592576584873 7.70e-08 2.45e-08
13 3.141592634338564 1.92e-08 6.13e-09
14 3.141592648776986 4.81e-09 1.53e-09
15 3.141592652386592 1.20e-09 3.83e-10
16 3.141592653288993 3.01e-10 9.57e-11
17 3.141592653514594 7.52e-11 2.39e-11
18 3.141592653570994 1.88e-11 5.98e-12
19 3.141592653585094 4.70e-12 1.49e-12
20 3.141592653588619 1.17e-12 3.73e-13
21 3.141592653589501 2.92e-13 9.30e-14
22 3.141592653589721 7.19e-14 2.29e-14
23 3.141592653589776 1.69e-14 5.37e-15
24 3.141592653589790 3.11e-15 9.89e-16
25 3.141592653589794 4.44e-16 1.41e-16
x n gn (x) errrel
-0.5 16 6.065306597126335e-01 1.83e-16
-1 20 3.678794411714423e-01 1.50e-16
-20 68 2.061153622438558e-09 2.01e-16
-40 103 -4.248354255291590e-18 1.81e-16
-100 192 3.720075976020839e-44 8.03e-16
22
L’algoritmo 1 fornisce risultati inaccurati causa la cancellazione.
L’algoritmo 2 fornisce risultati accurati anche per x ≈ 0 perchè la divi-
sione cancella gli errori di arrotondamento del numeratore e denominatore.
Conclusione gli errori si cancellano nella divisione!!
x f g
1.e-05 1.000005000006965e+00 1.000005000016667e+00
1.e-06 1.000000499962183e+00 1.000000500000167e+00
1.e-07 1.000000049433680e+00 1.000000050000002e+00
1.e-08 9.999999939225288e-01 1.000000005000000e+00
1.e-09 1.000000082740371e+00 1.000000000500000e+00
1.e-10 1.000000082740371e+00 1.000000000050000e+00
1.e-11 1.000000082740371e+00 1.000000000005000e+00
1.e-12 1.000088900582341e+00 1.000000000000500e+00
1.e-13 9.992007221626408e-01 1.000000000000050e+00
1.e-14 9.992007221626408e-01 1.000000000000005e+00
1.e-15 1.110223024625157e+00 1.000000000000000e+00
1.e-16 0 1
Tabella 8: Confronto tra gli algoritmi 1 e 2 per il calcolo di f (x) = (ex − 1)/x.
23
>>5*((1+exp(-100))-1)/((1+exp(-100))-1)
ans =
NaN
>>log(exp(6000))/1000
ans =
Inf
24
In generale si possono proporre soluzioni di compromesso quali l’ordinamento
per modulo crescente oppure l’ordinamento determinato sequenzialmente mini-
mizzando passo dopo passo |s1 | = |x1 |, |s2 |, . . . (algoritmo PSUM). In genera-
le, l’ordinamento decrescente non è consigliabile nella somma di numeri positivi,
perchè la limitazione in (13) è potenzialmente più grande e perchè in una somma
con termini che variano molto in ordine di grandezza non permette ai termini
più piccoli di contribuire al risultato. Ciò nonostante l’ordine decrescente può
fornire una risposta più accurata sia di Psum che dell’ordinamento crescente
n
P
in presenza di forte cancellazione, i.e. |sn | |xi |, come questo esempio
i=1
dimostra.
Esempio 26 Sia M ∈ F tale che fl(1 + M ) = M e supponiamo di dover
sommare 1, M , 2M e −3M . I risultati che si ottengono sono
• ordinamento crescente: fl(1 + M + 2M − 3M ) = 0;
• ordinamento PSUM: fl(1 + M − 3M + 2M ) = 0;
• ordinamento decrescente: fl(−3M + 2M + M + 1) = 1.
Ricordiamo infine l’algoritmo dell’inserzione: i dati xi vengono ordinati se-
condo il modulo crescente ed ogni somma parziale si calcolata per i = 2, . . . , n
viene inserita nella lista xi+1 , . . . , xn mantenendo l’ordinamento crescente. L’al-
goritmo della somma binaria per n = 2k , somma al primo passo gli addendi a
coppie yi = x2∗i−1 +x2∗i , i = 1, . . . , n/2, e ripete il procedimento ricorsivamente
a partire da yi . Il risultato si raggiunge in log2 n passi.
Particolarmente interessante è l’algoritmo di somma compensata stu-
diato da Kahan (1972) per la somma di n numeri. Si basa sulla seguente osser-
vazione: dati due numeri a, b ∈ F, |a| > |b|, una stima dell’errore commesso, i.e.
(a + b) − s̃, dove s̃ = (afl(+) b), viene fornita da
e = −[((afl(+) b)fl(−) a)fl(−) b] = (afl(−) s̃)fl(+) b
L’algoritmo di Kahan applica la correzione fornita da e ad ogni passo della
somma ricorsiva, i.e.
s=0
e=0
for i=1:n
t=s
y=x(i)+e
s=t+y
e=(t-s)+y
end
s=s+e
E’ stato dimostrato inoltre che vale la maggiorazione
Pn
|x |
2
i=1 i
|erralgoritmo | ≤ 2u + O(nu ) .
|sn |
25
Finchè nu ≤ 1 la costante di questa limitazione è indipendente da n e rappre-
senta un miglioramento rispetto (14). In caso di forte cancellazione anche l’al-
goritmo di somma compensata non è in grado di garantire un errore algoritmico
piccolo.
26
• mantenibilità il codice e’ facilmente modificabile;
• portabilità il codice si addatta facilmente a diversi ambienti di calcolo.
• robustezza il codice tratta problemi di difficile soluzione, verificando se i
dati in ingresso sono consistenti con le specifiche, analizzando e segnalando
gli errori in caso di fallimento;
• testabilità La correttezza e l’efficienza del codice sono verificabili su
esempi test;
• usabilità il codice ha un’interfaccia utente di facile comprensione e ben
documentata.
Il peso da assegnare ai vari fattori di qualità dipende anche dall’uso del
software: i programmi che sono stati sviluppati per essere diffusi e durare come
le librerie devono soddisfare ai più alti livelli qualitativi.
2 Esercizi svolti
Esercizio 11 Utilizzando la formula per la superficie di una sfera
27
Soluzione. Utilizzando (15) si commette innanzitutto un errore di modelliz-
zazione dato che la terra non è sferica. Per r = 6370 km e π = 3.142 si
ottiene
A(r) = 4πr2 = 5.100 × 108 km2
dove un ulteriore errore consiste nell’utilizzo di π = 3.142 come troncamento
di una serie infinita. Se il valore del raggio aumenta di h = 1 km, la nuova
superficie risulta pari a
A(r + h) = 4π(r + h)2 = 5.101 × 108 km2
e dunque lavorando con 4 cifre significative la variazione di superficie risulta
∆A1 = A(r + h) − A(r) = 1.000 × 105 km2 .
Poichè
dA
= 8πr,
dr
la variazione di superficie conseguente alla variazione h di raggio è approssimata
da
∆A2 = 8πrh = 1.601 × 105 km2 .
Ripetendo il calcolo con un’aritmetica finita a 6 cifre significative si ottengono
i seguenti valori (π = 3.14159):
∆A1 = 5.10064 × 108 − 5.09904 × 108 = 1.60000 × 105 km2
∆A2 = 1.60095 × 105 km2
per cui si conclude che il secondo algoritmo, seppur accompagnato da un errore
analitico (di troncamento della serie di Taylor), risulta più corretto del pri-
mo. Ciò è imputabile al fenomeno della cancellazione che interviene nel primo
algoritmo, mentre per il secondo si commette un errore analitico pari a
d2 A h2
· = 4πh2 = 1.257 × 101 .
dr2 2
Svolgendo i calcoli con MATLAB che opera in standard IEEE doppia preci-
sione si ottengono i valori
∆A1 = 1.601081279975176 × 105 km2
∆A2 = 1.600955616269358 × 105 km2
che confermano la migliore accuratezza del secondo algoritmo.
Esercizio 12 Si analizzi l’errore relativo commesso approssimando la derivata
prima di una funzione in un punto usando le differenze finite in avanti
f (x + h) − f (x)
f 0 (x) ≈ , h > 0.
h
In particolare si fornisca una maggiorazione dell’ errore totale in funzione del
passo h, assumendo che l’errore nella valutazione di f sia maggiorato dalla
precisione di macchina u. Con l’ausilio di MATLAB, si eseguano i calcoli per
f (x) = tan(x) con x = 1 e h = 10−1 , 10−2 , . . . , 10−16 .
28
Soluzione. Si consideri una funzione differenziabile f : R → R. La derivata
prima in un punto x ∈ R fissato è approssimata con le differenze finite (in
avanti), ovvero con il rapporto incrementale della funzione:
f (x + h) − f (x)
f 0 (x) ≈ = g(x), h > 0.
h
Supponendo f ∈ C 2 in un intorno di x, arrestando lo sviluppo di Taylor di f al
secondo ordine si ottiene
h2
f (x + h) = f (x) + f 0 (x)h + f 00 (ξx )
2
per qualche ξx ∈ (x, x + h), ovvero
h
f 0 (x) − g(x) = −f 00 (ξx ) .
2
L’errore (relativo) analitico, definito
f 0 (x) − g(x)
εanalitico =
f 0 (x)
è dunque limitato superiormente da
Mh
|εanalitico | ≤
2|f 0 (x)|
dove M è una maggiorazione di |f 00 (t)| per t ∈ [a, b],dove x, x + h ∈ [a, b], per
ogni h ≤ h0 . Risulta pertanto che l’errore analitico tende lineramente a zero
per h → 0.
Il rimanente contributo εarrotondamento all’errore totale può essere stimato
con l’ausilio dei grafi computazionali assumendo un errore relativo nei dati di
input f (x), f (x + h), h maggiorato dalla precisione di macchina u. Si ottiene
cosı̀
u |f (x + h)| + |f (x)| 2u |f (x)|
|εarrotondamento | ≤ 3u + ≈ 3u + .
· |f (x + h) − f (x)| · h|f 0 (x)|
L’andamento dell’errore di arrotondamento rispetto al parametro h è diverso
dall’errore analitico: riducendo h tale errore diventa arbitrariamente grande
causa la cancellazione. L’errore totale εtotale = εanalitico +εarrotondamento risulta
dunque limitato da
Mh 2|f (x)|u
|εtotale | ≤ 0
+ 3u + ·
2|f (x)| h|f 0 (x)|
e nello scegliere il passo h bisogna ‘bilanciare’ i due contributi. Il passo hm che
fornisce la scelta migliore si può stimare ponendo 2|fM0 (x)|
h
= · 2|f (x)|u
h|f 0 (x)| da cui si
ottiene r
u|f (x)|
hm ' 2 .
M
29
In corrispondenza di tale valore hm si ottiene la seguente maggiorazione dell’
errore totale p
2 M |f (x)|u
|εtotale | ≤ +3u + ·
|f 0 (x)|
Si consideri ora f (x) = tan(x) per x = 1. La derivata prima è f 0 (x) = sec2 (x),
per cui risulta f 0 (1) = 3.425518820814759, mentre la derivata seconda è f 00 (x) =
4 tan(x)/ cos(x) per cui si prenda M ' 17.33 come maggiorazione nell’intervallo
[1, 1.1]. Considerando la precisione di macchina di MATLAB, pari a u ' 1.11 ×
10−16 , si ottiene hm ' 6.32 × 10−9 . I risultati sono riportati in Tabella 9 e
in Figura 9. L’ultimo valore del rapporto incrementale risulta zero dato che il
passo h è inferiore alla precisione di macchina e dunque fl(f (x + h)) = fl(f (x)).
f (x+h)−f (x)
h h
errore
10−01 4.073519325937500 6.48e-01
10−02 3.479829956466807 5.43e-02
10−03 3.430863217312341 5.34e-03
10−04 3.426052408281866 5.33e-04
10−05 3.425572171056324 5.34e-05
10−06 3.425524155442616 5.33e-06
10−07 3.425519354838258 5.34e-07
10−08 3.425518846356113 2.55e-08
10−09 3.425518979582876 1.59e-07
10−10 3.425517647315246 1.17e-06
10−11 3.425504324638950 1.45e-05
10−12 3.425704164783383 1.85e-04
10−13 3.421707361894733 3.81e-03
10−14 3.419486915845482 6.03e-03
10−15 3.774758283725532 3.49e-01
10−16 0 3.43e+00
Tabella 9: Errore nell’uso delle differenze finite nel calcolo della derivata prima.
30
0
10
−2
10 errore totale
magg. errore analitico
magg. errore algoritmitico
−4 magg. errore totale
10
−6
10
errore
−8
10
−10
10
−12
10
−14
10
−16
10
−16 −14 −12 −10 −8 −6 −4 −2 0
10 10 10 10 10 10 10 10 10
h
dove fi (a) = xi (a) è la funzione che fornisce l’i-esima radice del polinomio in
corrispondenza del valore a del coefficiente. Dal teorema delle funzioni implicite
si ha
∂p . ∂p i19
fi0 (a) = − |x=i = 20
.
∂a ∂x Q
(i − k)
k=1, k6=i
31
err=abs(rr-r)./r; %errore relativo radici
C=ones(N,1)*r’-r*ones(1,N); P=prod(reshape(C(find(C)),N-1,N));
dfa=(r.^(n))./P’; %f’(a)
si ottengono i risultati in Tabella 10 per N = 20.
32
−15
x 10
20
p(x)=(x−1)6
p(x)=x6−6x5+15x4−20x3+15x2−6x+1
15
10
−5
0.995 0.996 0.997 0.998 0.999 1 1.001 1.002 1.003 1.004 1.005
equivalenti
1 − cos(x) sin2 (x)
=
x x(1 + cos(x))
per valori di x positivi, |x| << 1, si ottengono i risultati in Tabella 11. Spiega
i risultati.
1−cos(x) sin2 (x)
x x x(1+cos(x))
0 NaN NaN
1.2000e-08 9.2519e-09 6.0000e-09
1.6000e-08 6.9389e-09 8.0000e-09
2.0000e-08 1.1102e-08 1.0000e-08
2.4000e-08 1.3878e-08 1.2000e-08
2.8000e-08 1.5860e-08 1.4000e-08
3.2000e-08 1.7347e-08 1.6000e-08
3.6000e-08 1.8504e-08 1.8000e-08
4.0000e-08 1.9429e-08 2.0000e-08
4.4000e-08 2.2709e-08 2.2000e-08
4.8000e-08 2.3130e-08 2.4000e-08
5.0000e-08 2.4425e-08 2.5000e-08
33
e che
sin(x)
lim = 1,
x→0 x
entrambe le espressioni dovrebbero approssimare x/2. La prima espressione è
però accompagnata dal fenomeno della cancellazione, per cui la seconda risulta
più accurata come verificabile dalla Tabella 11.
y1 = x2
√
yi+1 = yi , i = 1, . . . , m
z1 = ym+1
zi+1 = zi2 , i = 1, . . . , m − 1
>>x=.25:.25:1.5
x=
0.2500 0.5000 0.7500 1.0000 1.2500 1.5000
>>[z,err]=mroot(x,50)
z=
0.2375 0.4724 0.7316 1.0000 1.1331 1.4550
err=
0.0499 0.0553 0.0245 0 0.0935 0.0300
Si commentino i risultati.
34
perl’errore algoritmico la seguente maggiorazione
m−2 m
!
X X
|alg | ≤ u 2i + 2m−1 2−i =
i=0 i=0
m m−1 3
= u 2 +2 −
2
3 m
= u (2 − 1) ,
2
Esercizio 16 Si vuole scrivere una function MATLAB per valutare gli errori
assoluto e relativo nell’approssimazione di Stirling per il fattoriale
√ n n
n! ≈ 2πn
e
Si costruisca la function in modo che calcoli gli errori per un input n generico
vettore di valori interi e si commentino i risultati.
35
300
10
200
10
erass
100
10
0
10
0 20 40 60 80 100 120 140 160 180
N
−1
10
−2
10
errel
−3
10
−4
10
0 20 40 60 80 100 120 140 160 180
N
36
k en err
1 2.593742460 4.5815e-02
2 2.704813829 4.9546e-03
3 2.716923932 4.9954e-04
4 2.718145926 4.9995e-05
5 2.718268237 4.9999e-06
6 2.718280469 5.0008e-07
7 2.718281694 4.9416e-08
8 2.718281798 1.1077e-08
9 2.718282052 8.2240e-08
10 2.718282053 8.2690e-08
11 2.718282053 8.2735e-08
12 2.718523496 8.8905e-05
13 2.716110034 7.9896e-04
14 2.716110034 7.9896e-04
15 3.035035206 1.1653e-01
16 1 6.3212e-01
17 1 6.3212e-01
18 1 6.3212e-01
1
NOTA. Il fatto che n non influisca su n non è dovuto al fenomeno di
underflow!
Esercizio 19 (vedi anche 24/07/03 − ]1) Sia x ∈ F(B, t, pmin , pmax ) un nume-
ro di macchina sufficientemente grande da verificare x + 10 = x. Sommando
in aritmetica di macchina i seguenti numeri 1, 2, 3, 4, x, −x con diversi ordina-
menti (per esempio: 1+2+3+4+x-x, 1+2+x-x+3+4, 2+3+x+1-x+4, . . . ) che
risulati ottieni? Commenta e giustifica la risposta. Nello standard IEEE doppia
precisione i parametri che definiscono l’insieme dei numeri floating-point sono
37
B = 2, t = 53, pmin = 1021, pmax = 1024. Sai dare una limitazione inferiore
per l’esponente p tale che x = B p soddisfi alle condizioni sopra?
1 + 2 + 3 + 4 + x − x = 0,
1+2+x−x+3+4=7
e
2 + 3 + x + 1 − x + 4 = 4,
ovvero se y1 , y2 ≤ 10, allora il risultato finale della somma y1 + x + y2 − x + z è
z poichè le cifre significative degli addendi y1 e y2 non influiscono su quelle di
x.
Per dare una limitazione inferiore all’esponente p di x = B p che soddisfi
la condizione x + 10 = x si considera la rappresentazione secondo lo standard
IEEE del numero 10, ovvero 10 = (.101)2 · 24 . Si osserva che la prima cifra
significativa ha esponente 3, per cui per non influire sulle cifre significative di
x = B p dev’essere p ≥ 53 + 3 + 1 = 57. Se infatti p = 57, allora l’ultima cifra
significativa di x ha esponente 4 > 3 e non viene influenzata dalla prima cifra
significativa del numero 10.
ay + b a + b/y
r1 = , r2 =
ay + c a + c/y
38
c=
9.8813e-324
y=
0.5000
>>r1=(a*y+b)/(a*y+c)
r1=
0.5000
>>r2=(a+b/y)/(a+c/y)
r2=
0.6000
In aritmetica esatta si ha:
ay + b
r2 = r1 = =
ay + c
β −pmin −t (β − 1)β −1 + β −pmin −t
= =
β −pmin −t (β − 1)β −1 + 2(β − 1)β −pmin −t
2 − β1
= =
2β − 1 − β1
2β − 1 3
= |β=2 = = 0.6
2β 2−β−1 5
per cui il valore esatto con MATLAB lo si ottiene usando la formula r2 . L’uso
della formula r1 con i dati assegnati non fornisce il valore esatto, ma un valore
approssimato con un errore di ' 17%. Tale risultato è dovuto all’underflow:
il valore a = b = β −pmin −t = 2−1074 ' 4.9407 × 10−324 (che corrisponde a
realmin ∗ eps) è infatti il numero minimo rappresentabile con MATLAB per cui
la moltiplicazione per y = 1/2 fornisce il valore ay = by = 0. Risulta perciò in
aritmetica di macchina
ay ⊕ b b 1 1
r1 = = = |β=2 = = 0.5.
ay ⊕ c c 2(β − 1) 2
39
[erass,erana,erarr]=nome_function(x,h)
e deve provvedere alla rappresentazione grafica dei risultati. (Sugg.: per de-
terminare una maggiorazione dell’errore analitico si utilizzi lo sviluppo di Tay-
lor per f (x + h) e per f (x − h) arrestandosi al terz’ordine e si faccia la dif-
ferenza dei due sviluppi ricordando che esiste ξx ∈ [x − h, x + h] tale che
f 000 (ξx+ ) + f 000 (ξx− ) = 2f 000 (ξx ) per qualche ξx+ ∈ (x, x + h) e ξx− ∈ (x − h, x))
Soluzione.
Supponendo che f ∈ C 3 [a, b], a, b tali che x+h, x−h ∈ [a, b], si può applicare
lo sviluppo di Taylor arrestato al terz’ordine ad f (x+h) e ad f (x−h) ottenendo
h2 h3
f (x + h) = f (x) + f 0 (x)h + f 00 (x) + f 000 (ξx+ )
2 6
h2 h3
f (x − h) = f (x) − f 0 (x)h + f 00 (x)
− f 000 (ξx− )
2 6
per qualche ξx+ ∈ (x, x + h) e ξx− ∈ (x − h, x). Sottraendo la seconda dalla prima
si ottiene
h3
f (x + h) − f (x − h) = 2f 0 (x)h + f 000 (ξx+ ) + f 000 (ξx− )
6
per cui dividendo per 2h e considerando che esiste ξx ∈ [x − h, x + h] tale che
f 000 (ξx+ ) + f 000 (ξx− ) = 2f 000 (ξx ), posto
f (x + h) − f (x − h)
g(x) = ,
2h
si ottiene
h2
f 0 (x) − g(x) = −f 000 (ξx ) .
6
L’errore (relativo) analitico, definito
f 0 (x) − g(x)
εanalitico =
f 0 (x)
è dunque limitato superiormente da
M h2
|εanalitico | ≤
6|f 0 (x)|
dove M = max |f 000 (t)|. L’ errore analitico tende a zero per h che tende a zero
t∈[a,b]
in maniera quadratica. La parte rimanente dell’ errore totale che chiamiamo
errore di arrotondamento può essere stimata con l’ausilio dei grafi computazio-
nali associando ai dati in ingresso f (x − h), f (x + h), h un errore maggiorato
dalla precisione di macchina u. L’errore di arrotondamento risulta limitato
superiormente da
u(|f (x + h)| + |f (x − h)|)
|εarrotondamento | ≤ 3u · .
2h|f 0 (x)|
40
e quindi aumenta per h che tende a zero. L’errore totale εtotale risulta dunque
limitato da
M h2 u(|f (x + h)| + |f (x − h)|)
|εtotale | ≤ + 3u +
6|f 0 (x)| 2h|f 0 (x)|
Tabella 13: Errore nell’uso delle differenze finite centrate nel calcolo della
derivata prima.
d1f=exp(x)*ones(length(h),1); d1fc=(exp(x+h)-exp(x-h))./(2*h);
erass=abs(d1fc-d1f)./abs(d1f); M=max(exp(x-max(h):.001:x+max(h)));
erana=abs(M*h.^2/6)./abs(d1f);
41
erarr=eps+eps/4*(abs(exp(x+h))+abs(exp(x-h)))./(h.*d1f);
ertot=erana+erarr; loglog(h,erass,’-b’) hold on grid on
loglog(h,erana,’--g’) loglog(h,erarr,’--c’) loglog(h,ertot,’-.r’)
0
10
errore totale
magg. errore analitico
magg. errore algoritmico
−5
10 magg. errore totale
−10
10
−15
10
errore
−20
10
−25
10
−30
10
−35
10
−16 −14 −12 −10 −8 −6 −4 −2 0
10 10 10 10 10 10 10 10 10
h
42
√ √ 1 √
n n+1− n √
n+1+ n
1001 1.543471301870203e-01 1.543471301870205e-01
1002 4.987562112088995e-02 4.987562112089027e-02
1003 1.580743742895763e-02 1.580743742895582e-02
1004 4.999875006248544e-03 4.999875006249609e-03
1005 1.581134877255863e-03 1.581134877256878e-03
1006 4.999998750463419e-04 4.999998750000625e-04
1007 1.581138790243131e-04 1.581138790555721e-04
1008 5.000000055588316e-05 4.999999987500000e-05
1009 1.581139076733962e-05 1.581138829688905e-05
1010 4.999994416721165e-06 4.999999999875000e-06
1011 1.581152901053429e-06 1.581138830080237e-06
1012 5.000038072466850e-07 4.999999999998749e-07
1013 1.578591763973236e-07 1.581138830084150e-07
1014 5.029141902923584e-08 4.999999999999987e-08
1015 1.862645149230957e-08 1.581138830084189e-08
1016 0 5.000000000000000e-09
√ √ 1 √
Tabella 14: Valori di n+1− n e di √
n+1+ n
ottenuti con MATLAB per
n = 10, 102 , . . . , 1016 .
3 Esercizi da svolgere
Esercizio 23 Considera la seguente espressione:
1 1
− ,
1−x 1+x
43
con x 6= ±1.
• Definisci in generale l’errore inerente. Per quali valori di x, la valutazione
dell’espressione risulta un problema malcondizionato?
• Definisci in generale l’errore algoritmico. Per quali valori di x numero di
macchina, la valutazione dell’espressione in artimetica di macchina può
fornire risultati non accurati?
• Proponi un’espressione equivalente che possa fornire risultati accurati nel
caso in cui x numero di macchina assuma i valori trovati al punto prece-
dente.
Esercizio 24 Considera l’insieme F dei numeri floating-point con B = 2, t =
4, pmin = 2, pmax = 3, che contiene anche i numeri denormalizzati per un
underflow graduale. Calcola
• il più piccolo numero floating point positivo in F normalizzato;
• il più grande numero floating point positivo in F normalizzato;
• il più piccolo numero floating point positivo in F denormalizzato;
• la precisione di macchina u per l’arrotondamento.
Dati x1 , x2 ∈ F positivi, quali sono la minima e la massima distanza possibile
tra x1 e x2 ?
Esercizio 25 Definisci l’errore inerente ed algoritmico nel calcolo di una fun-
zione razionale y = f (x), x, y ∈ R, spiegando il significato di condizionamento
di un problema e di stabilità in avanti di un algoritmo. Calcola tali errori nel
caso della somma di due numeri, i.e. y = f (x1 , x2 ) = x1 + x2 , parlando del
fenomeno della cancellazione. Definisci la precisione di macchina u e spiega
perchè risulta 1 + u = 1 in aritmetica di macchina. Per a = B k , dove B è
la base di rappresentazione dei numeri floating-point e k è un intero positivo,
determina una maggiorazione β di b > 0 per cui vale a + b = a, 0 < b < β,
in aritmetica di macchina. Sulla base delle considerazioni sopra esposte, spiega
perchè la serie armonica divergente
∞
X 1
n=1
n
44
4 Domande di verifica
1. Il condizionamento del problema dipende dall’algoritmo scelto per la sua
risoluzione: vero o falso?
2. Il mal condizionamento di un problema può essere migliorato passando
dalla singola alla doppia precisione: vero o falso?
3. Spiega le differenza tra errore relativo e assoluto.
Riferimenti bibliografici
[QS02] testo consigliato: Quarteroni, A., Saleri, F. (2002) Introduzione al
Calcolo Scientifico, Springer, Milano.
[BBCM92] Bevilacqua, R., Bini, D., Capovani, M. e Menchi, O. (1992) Metodi
Numerici, Zanichelli, pagg. 1-5, 8-13, 30-34, 36-45, 50-56, 60-61 (senza
dimostrazioni).
[Mon98] Monegato, G. (1998) Fondamenti di Calcolo Numerico, Clut, pagg.
1-17.
[NPR01] Naldi, G., Pareschi, L. e Russo, G. (2001) Introduzione al Calcolo
Scientifico, Mc Graw Hill Ed., pagg. 40-60.
[Hea02] Heath, M.T. (2002) Scientific Computing, Mc Graw Hill Ed., pagg. 1-33
(senza dimostrazioni).
[Hi93] Higham, N. J. (1993) The accuracy of floating point summation, SIAM
J. Sci. Comput. 14, 783-799.
45