errorifin

Scarica in formato pdf o txt
Scarica in formato pdf o txt
Sei sulla pagina 1di 45

Errare non è solo umano!

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

• processo infinito → processo finito


• funzioni complicate → funzioni semplici (per esempio polinomi)
• matrici generali → matrici con semplice struttura.

In generale la soluzione ottenuta è solo un’approssimazione di quella originale


e pertanto diventa essenziale analizzare gli errori introdotti. Il procedimento
risolutivo richiede diverse fasi, ognuna delle quali introduce delle semplificazioni

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”.

1.2 Fonti d’incertezza


Nell’elencare le fonti di incertezza e i relativi errori da analizzare, possiamo
distinguere due momenti:
1. prima dell’implementazione:

• formulazione del modello matematico (i.e. insieme di leggi di natura


matematica che descrivono il fenomeno da analizzare) → adegua-
tezza del modello;
• formulazione del modello numerico (i.e. algoritmo per approssimare
il modello matematico) → errore analitico o di troncamento;
• misurazioni sperimentali o computazioni precedenti → errore nei
dati di input;
2. durante la computazione:
• strumento di calcolo (i.e. errori di rappresentazione sul calcolato-
re dei numeri ed errori nelle operazioni aritmetiche) → errori di
arrontondamento.
L’accuratezza del risultato finale risente della combinazione delle perturba-
zioni introdotte nei vari passi e che possono essere amplificate dalla natura del
problema trattato e/o dall’algoritmo scelto.

Esempio 1 Il calcolo della superficie della terra mediante la formula A = 4πr2


coinvolge diverse approssimazioni e quindi sorgenti d’errore:
• la terra viene modellata come una sfera, che idealizza la sua vera forma;

• il valore del raggio terrestre r si basa su misurazioni empiriche e su altre


computazioni;
• il valore di π richiede una tecnica di approssimazione ed il troncamento di
un processo infinito;

• i valori di input e i risultati delle operazioni aritmetiche sono arrotondati


sul computer;
(vedi svolgimento Esercizio 11).

Come misurare gli errori?

4
1.3 Errore assoluto e relativo
Sia x̃ un’aprossimazione del numero reale x. Si definisce errore assoluto

ex = |x̃ − x|

mentre, se x 6= 0, si definisce errore relativo la quantità


ex
x = .
|x|

Una definizione equivalente di errore relativo è la seguente

x̃ = x(1 + δ), x = |δ|.

Nelle approssimazioni scientifiche, dove le quantità in gioco possono varia-


re molto in grandezza, è più opportuno misurare l’errore relativo, perchè non
dipende dallo “scaling”. Sostituendo, infatti, x e x̃ rispettivamente con mx e
mx̃, m costante moltiplicativa, l’errore relativo non varia.
Quando x e x̃ sono vettori, i.e. x = (x1 , . . . , xn ) e x̃ = (x̃1 , . . . , x̃n ), gli errori
assoluti e relativi si definiscono usando le norme vettoriali k · k come segue

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

x = 1.00000, x̃ = 1.00345, x = 3.45 × 10−3 ;

y = 9.0000, ỹ = 8.99899, y = 1.12 × 10−4 .


Secondo qualsiasi ragionevole definizione di cifre significative esatte, tali numeri
reali x, y concordano fino a tre cifre significative con le loro rispettive appros-
simazioni x̃, ỹ. L’errore relativo è però diverso nei due casi. Possiamo cosı̀

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.

Esempio 2 Ci proponiamo di trovare un’ approssimazione del numero π. Pren-


diamo a tale scopo l’algoritmo di Archimede che approssima π mediante la lun-
ghezza del semiperimetro pi dei poligoni regolari con 2i+1 lati inscritti in una
circonfernza di raggio unitario, per i = 1, 2, . . ..
Dopo semplici computazioni, si ottengono le seguenti relazioni

l1 = 2,
q p
li+1 = 2 − 4 − li2 , i = 1, 2, . . . , (1)
pi = li × 2i , i = 1, 2, . . . .

Implementando tale algoritmo in MATLAB con eps = 2.22 × 10−16 , si otten-


gono i risultati in Tabella 1, che indicano che l’errore dopo un certo numero di
iterazioni inizia a crescere, fornendo stime di π sempre meno accurate. Pur la-
vorando con una precisione di circa 16 cifre decimali, otteniamo che la migliore
approssimazione di π ha solo 9 cifre decimali esatte (i = 14).


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 .

Esempio 4 Data una funzione f (x), si vuole costruire un’approssimazione del-


la sua derivata in un punto x fissato. Poichè vale lim f (x+h)−f
f (x)
(x)
= f 0 (x),
h→0
possiamo sperare di ottenere una buona approssimazione di f 0 (x), considerando
il rapporto incrementale r(x, h) = f (x+h)−f
f (x)
(x)
per h sufficientemente piccolo.
In Tabella 3 sono riportati i valori ottenuti per f (x) = ex e x = 1. Anche
in questo caso si verifica un aumento dell’errore quando h diminuisce sotto un
opportuno valore (vedi svolgimento Esercizi 12 e 21).

Esempio 5 Vale il seguente risultato lim (1 + x1 )x = e. Si vuole approssimare


x→∞
tale limite calcolando fk = (1 + x1k )xk per xk = 10k , k = 1, 2, . . . , 20. I risul-
tati ottenuti con un programma MATLAB sono riportati in Tabella 4. Anche
in questo caso l’errore dopo un andamento descrescente, riprende a crescere e

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

15 3.141592645321215 8.27e-09 2.63e-09


16 3.141592607375720 4.62e-08 1.47e-08
17 3.141592910939673 2.57e-07 8.19e-08
18 3.141594125195191 1.47e-06 4.68e-07
19 3.141596553704820 3.90e-06 1.24e-06
20 3.141596553704820 3.90e-06 1.24e-06
21 3.141674265021758 8.16e-05 2.60e-05
22 3.141829681889202 2.37e-04 7.54e-05
23 3.142451272494134 8.59e-04 2.73e-04
24 3.142451272494134 8.59e-04 2.73e-04
25 3.162277660168380 2.07e-02 6.58e-03
26 3.162277660168380 2.07e-02 6.58e-03
27 3.464101615137754 3.23e-01 1.02e-01
28 4.000000000000000 8.58e-01 2.73e-01

Tabella 1: Approssimazione di π = 3.141592653589793 . . . con l’algoritmo di


Archimede (1).

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

-0.5 16 6.065306597126333e-01 1.83e-16


-1 20 3.678794411714424e-01 3.01e-16
-20 96 5.621884472130418e-09 1.72e+00
-40 138 -3.165731894063124e+00 7.45e+17
-100 246 -2.913755646891533e+25 7.83e+68

Tabella 2: Approssimazione di ex con il troncamento della serie.

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

Tabella 3: Approssimazione di f 0 (1) = e = 2.71828182845905 . . . con il rapporto


incrementale.

l’approssimazione migliore di e ha un errore relativo pari a 1.1077 × 10−8 . Nella


Tabella 5 sono riportati i risultati ottenuti scegliendo xk = 2k , k = 1, 2, . . . , 20.
In questo caso si riesce a raggiungere un’approssimazione dell’ordine della pre-
cisione di macchina, ma gli ultimi valori non sono accurati (vedi svolgimento
Esercizio 17).

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.

Per capire la causa dell’inaccuratezza dei risultati ottenuti, dobbiano ana-


lizzare meglio la rappresentazione dei numeri reali sul calcolatore e l’aritmetica
di macchina.

1.4 Numeri di macchina o floating-point


Un sistema di numeri di macchina o floating-point è un insieme F ⊂ R
caratterizzato dai seguenti parametri

• B base di rappresentazione,
• t numero cifre della mantissa,
• pmin e pmax limitazioni inferiore e superiore per l’esponente.

F contiene, oltre x = 0, tutti i numeri reali x rappresentabili come

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

Tabella 4: Approssimazione di e = 2.71828182845905 . . . valutando l’espressione


in xk = 10k , k = 1, 2, . . . , 20.

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

Tabella 5: Approssimazione di e = 2.71828182845905 . . . valutando l’espressione


in xk = 2k , k = 1, 2, . . . , 20.

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:

• l’insieme F è finito e la sua cardinalità è data da 1 + 2(B − 1)B t−1 (pmax +


pmin + 1);

• il più piccolo numero positivo normalizzato di F è realmin = B −pmin −1 ;


• il più grande numero positivo normalizzato di F è realmax = B pmax (1 −
B −t );

• i numeri di F non sono uniformemente distribuiti, sono equispaziati solo


tra due potenze successive di B.

L’insieme dei numeri di macchina F può essere esteso includendo anche i


numeri denormalizzati, che sono i numeri reali con la cifra significativa prin-
cipale d1 = 0 e con l’ esponente p = −pmin . Tali numeri sono distribuiti tra
B −pmin −1 e lo zero e sono equispaziati con spaziatura pari a B −pmin −t . Tali
numeri permettono un underflow graduale (vedi la sezione 1.5).

Esercizio 2 Descrivi l’insieme dei numeri di macchina F caratterizati da B =


2, t = 3, pmin = 2, pmax = 1, includendo anche i numeri denormalizzati.

1.5 Approssimazione dei numeri reali e precisione di mac-


china
Solitamente i calcolatori lavorano in una base B 6= 10 e pertanto anche un nu-
mero che è rappresentabile con un numero finito di cifre decimali, può richiedere
un numero infinito di cifre in una base B diversa

Esempio 6 x = (0.1)10 = (0.0001100110011...)2 .

Esercizio 3 Scrivere un programma MATLAB che determini la rappresenta-


zione di un numero decimale in una base B 6= 10.

Preso x ∈ R si cercherà un numero floating point fl(x) ∈ F che lo approssimi,


definendo cosı̀ un’applicazione fl : R → F.
Se x ∈ R è tale che |x| > max{|y|, y ∈ F}, l’applicazione fl darà errore
di overflow. Analogamente si parlerà di errore di underflow quando |x| <
min{|y|, y ∈ F, y 6= 0}. In alcuni sistemi, in questo caso, viene definito fl(x) = 0.
Se x ∈ F, allora fl(x) = x, mentre se x non è un numero di macchina, ma è tale
che min{|y|, y ∈ F, y 6= 0} < |x| < max{|y|, y ∈ F}, allora fl(x) ∈ F viene scelto
secondo una delle seguenti strategie:

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

1.6 Aritmetica di macchina


Le operazioni elementari (op = +, /, ∗, −) che operano su numeri di macchina
non è detto diano come risultato esatto un numero di macchina. Di qui la
necessità di definire delle operazioni di macchina, che indicheremo con fl(op).

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 .

1.7.1 Errore inerente


L’errore inerente (3) è legato al problema assegnato e alla sua sensibilità rispetto
alle perturbazioni introdotte nei dati di input. La scelta dell’algoritmo non ha
effetto su tale errore.
Il problema si dice ben condizionato se non amplifica gli errori nei dati,
mentre sarà mal condizionato se un errore anche piccolo nei dati di ingresso
darà origine ad un grande errore nella risposta.
Come “misurare” il condizionamento del problema? Sia

|errorerisposta | |f (x) − f (x̃)||x|


condf (x) := = ,
|erroredato | |f (x)||x − x̃|

allora se cond(x)  1 il problema sarà mal condizionato. Osserviamo subito


che il condizionamento dipende non solo da f ma anche dal dato x. Se sup-
poniamo che la funzione f sia sviluppabile con Taylor, otteniamo, in prima
approssimazione,
|x||f 0 (x)|
condf (x) = .
|f (x)|

14
Esempio 12 Il condizionamento della funzione f (x) = cos x è dato da

condf (x) = |x tan x|,

il problema è dunque mal condizionato per x ≈ π2 . Infatti cos (1.57079) =


6.32679489e − 06, cos (1.57078) = 1.632679489e − 05, x = 6.36 × 10−6 →
f (x) = 1.58.

Esercizio 6 Stima il condizionamento del calcolo delle funzioni x, ex , tan x.

Consideriamo ora il problema del condizionamento del calcolo di una fun-


zione F : Rn → R. Usando anche in questo caso la formula di Taylor si trova,
in prima approssimazione,
n  
F (x̃) − F (x) X xi ∂F (x) (x̃i − xi )
= ,
F (x) i=1
F (x) ∂xi xi

dove x = (x1 , . . . , xn ), x̃ = (x̃1 , . . . , x̃n ) ∈ Rn . Passando ai moduli si ottiene


n
X
|errinerente | ≤ |ci (x)|xi , (6)
i=1

dove xi è l’errore relativo al dato i-esimo e ci (x) := ∂F (x) xi


∂xi F (x) , i = 1, . . . , n, è il
coefficiente di amplificazione ad esso relativo. I coefficienti di amplificazione
forniscono una misura del condizionamento del problema.

Esempio 13 Vogliamo valutare il condizionamento della somma di n numeri,


n
P
i.e. F (x1 , . . . , xn ) = xi . I coefficienti di amplificazione sono
i=1

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,

e pertanto il problema è sempre ben condizionato.

Esercizio 7 Calcolare il condizionamento del quoziente di due numeri, i.e.


F (x1 , x2 ) = xx12 .
√ 3
Esercizio 8 Per calcolare y = √2−1 , si possono considerare diverse espres-
2+1
√ √ √
sioni matematicamnte equivalenti:
√ y = ( 2 − 1)6 = (3 − 2 2)3 = (5 2 − 7)2 =
√ 1 1 √
= 99+70 = 99 − 70 2. Indicare quale delle formulazioni risulta essere
( 2+1)6 2
quella con il migliore e peggiore numero di condizionamento.

Esempio 15 Sistema lineare Ax = b. Consideriamo il sistema lineare defi-


nito dai dati    
0.7800 0.5630 0.2170
A= ,b = .
0.4570 0.3300 0.1270
 
1
La soluzione esatta è x = . Perturbiamo l’elemento a1,1 = 0.7800 della
−1
matrice A con ã1,1 = 0.7810. L’errore relativo nel dato perturbato
 è a1,1 =
−3 0.2483
1.2821 × 10 . La soluzione del sistema perturbato risulta x̃ = con
0.0410
un errore misurato in norma infinito pari a kx̃ − xk = 1.0410.

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).

1.7.2 Errore analitico o di troncamento


L’errore (4) misura la differenza tra il risultato esatto e quello fornito dall’algo-
ritmo che usa gli stessi dati di input e opera in aritmetica esatta. Ci fornisce
quindi un’informazione sulla bontà della tecnica di approssimazione (i.e. mo-
dello numerico) usata. Tale errore è dovuto, per esempio, all’approssimazione
di una serie infinita con una serie troncata.

Esempio 16 Vogliamo valutare l’errore di approssimazione in Esempio 3 di


∞ n
xk xk
f (x) = ex =
P P
k! con troncamento della serie gn (x) = k! . Per x = 1 si
k=0 k=0
ottiene una stima del numero di Nepero e con gn (1) con un errore |e − gn (1)| =
ea e
(n+1)! < (n+1)! dove 0 < a < 1.

16
Nasce dall’interruzione di un processo iterativo prima della convergenza dopo
un numero finito di passi.

Esempio 17 L’approssimazione del valore della derivata f 0 (x) con il rapporto


incrementale rx,h = f (x+h)−f
h
(x)
in Esempio 4 porta all’errore analitico |f 0 (x) −
00
rh (x)| ≤ |f (ξ2x )h| dove x < ξx < x + h. Per f (x) = ex e x = 1 si ottiene in
ξx 2
x = 1 |e−rh (1)| ≤ e 2 h ≤ e 2h dove 1 < ξx < 1+h, 0 < h ≤ 1. L’errore analitico
tende a zero per h che tende a zero e pertanto non può essere il responsabile
degli errori in Tabella 3 (vedi svolgimento Esercizi 12 e 21).

1.7.3 Errore algoritmico


L’errore algoritmico (5) nasce dalla differenza tra il risultato fornito da un algo-
ritmo che usa l’aritmetica esatta e il risultato prodotto dallo stesso algoritmo in
aritmetica di macchina. L’algoritmo scelto per la valutazione di g(x̃), x̃ ∈ F può

essere descritto da una sequenza finita di operazioni elementari (i.e. +, ∗, /, ·)
indicate dalle funzioni gi : Rni → R, ni ≤ 1, i = 1, 2, . . . , N , i.e.

g = gN ◦ gN −1 ◦ . . . ◦ g1 .

Se ad ogni operazione in aritmetica esatta gi , i = 1, . . . , N viene sostituita l’o-


perazione g̃i : Fni → F, i = 1, . . . , N in aritmetica di macchina, si ottiene la
descrizione dello stesso algoritmo in aritmetica di macchina, i.e.

g̃ = g̃N ◦ g̃N −1 . . . ◦ g̃1 .

Esempio 18 I passi dell’ algoritmo per la valutazione della funzione yN =


g(x̃) = x̃N , N ≥ 2 possono essere descritti da

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

A questo errore è legato il concetto di stabilità di un algoritmo. Un


algoritmo è stabile se è insensibile alle perturbazioni dovute alle approssima-
zioni introdotte dalle operazioni di macchina durante le computazioni, mentre
si parlerà di algoritmo instabile in caso contrario.
In particolare si dirà che l’algoritmo è stabile in avanti se |erralgoritmico |
sarà un piccolo multiplo della precisione di macchina u.
Osservazione: la stabilità in avanti dell’algoritmo non garantisce l’accura-
tezza del risultato finale. L’accuratezza della risposta finale dipende dall’ errore

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.

Esempio 19 La somma di due numeri x1 , x2 ∈ F con l’operazione di macchina


fl(+) può essere riscritta come segue

x1 fl(+) x2 = (x1 + x2 )(1 + e) = x1 (1 + e) + x2 (1 + e) = x̃1 + x̃2

dove |e| ≤ u. L’algoritmo di somma risulta “stabile all’indietro”.

In generale l’analisi all’indietro viene applicata al problema y = f (x)

x −→ y = f (x)
errore & errore
(10)
all0 indietro in avanti
x+ −→ ỹ = g̃(x̃) = f (x̃ + )

La soluzione ỹ = g̃(x̃) fornita dall’algoritmo in aritmetica di macchina con


dato x̃ ∈ F viene vista come la soluzione del problema su un dato perturbato
g̃(x̃) = f (x + )
Un metodo per calcolare y = f (x) si dirà stabile all’indietro se, ∀x, il
risultato ỹ sarà soluzione del problema con un dato “vicino” all’originale, i.e.
||
|x| .

18
Vale
|errorre in avanti| ≈ condf (x)|errorre all’indietro|,
dove condf (x) è il numero di condizionamento relativo alla funzione f .

Esempio 20 Per la funzione esponenziale f (x) = ex otteniamo

ỹ = ex+ ⇒ x +  = log(ỹ)

Per esempio x = 1 e n = 3 abbiamo

ex = e = 2.7182818284590..., ỹ = 2.66666666666667
x +  = log(ỹ) = 0.98082925301173
(11)
errore in avanti = ỹ − ex = −0.05161516179238
errore all’indietro =  = −0.01917074698827

1.7.4 Analisi dell’errore di tipo ”misto” : in avanti e all’indietro


Diverse routines per calcolare delle funzioni y = f (x) soddisfano una condizione
più debole (errore ”misto”)

ỹ + δ = f (x̃ + ), |δ| ≤ D|y|, || ≤ E|x|,


con D, E sufficientemente piccoli .

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.

Esempio 21 Radici di equazioni di secondo grado. Le soluzioni del-


l’equazione di secondo grado ax2 + bx + c = 0 sono fornite dalla ben nota
formula √
−b ± b2 − 4ac
x1,2 = .
2a
Ma, mentre il problema matematico è banale, dal punto di vista numerico la
formula richiede più attenzione in quanto può dare risposte inaccurate o essere
non valutatabile in corripsondenza di particolari scelte dei dati a, b e c.

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.

Esempio 24 L’instabilità dell’algoritmo per il calcolo di ex per x < 0 in Esem-


pio 3 può essere risolta riscrivendo ex = 1/e−x per x < 0. I risultati in Tabella
7 confermano la stabilità della nuova versione dell’algoritmo.
Esempio 25 Cancellazione errori di arrotondamento La valutazione della
funzione f (x) = (ex − 1)/x presenta il fenomeno della cancellazione per valori
di |x|  1. Nella Tabella 8 si possono confrontare i risultati calcolati con i due
algoritmi seguenti
• Algoritmo 1:

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

Tabella 6: Approssimazione di π con l’algoritmo di Archimede stabile.

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

Tabella 7: Approssimazione di ex con il troncamento della serie stabile per


x < 0.

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.

Per l’approssimazione della derivata si devono determinare degli approcci


alternativi e c’è un capitolo dell’analisi numerica chiamato “derivazione nume-
rica” che si occupa di tale problema. Tra i vari approcci possibili ricordiamo la
tecnica di Estrapolazione di Richardson.

Esercizio 10 Il computer sa contare fino a sei? Commenta i seguenti


risultati forniti dal MATLAB.
>>2-1
ans =
1
>>(1/cos(100*pi+pi/4))^2
ans =
2.00000000000011
>>3*cos(acos(10000))/10000
ans =
2.99999997414701
>>s=4;
for i=1:53
s=sqrt(s);
end
for i=1:53
s=s^2;
end
>>s
s =
1

23
>>5*((1+exp(-100))-1)/((1+exp(-100))-1)
ans =
NaN
>>log(exp(6000))/1000
ans =
Inf

1.7.6 Somma di n numeri


Vogliamo analizzare diversi approcci algoritmici per calcolare la somma sn di n
numeri xi ∈ F, i = 1, . . . , n. Poichè sappiamo che non vale la proprietà associa-
tiva per la somma in aritmetica di macchina e che l’errore di arrotondamento di
un singolo passo dipende dagli addendi da sommare, il valore finale effettivemen-
te calcolato dall’algoritmo della somma ricorsiva dipenderà dall’ordinamento
dei dati. Analizzando l’errore nell’algoritmo
s(1)=x(1)
for i=2:n
s(i)=s(i-1)+x(i);
end
si ottiene in prima approssimazione
n
1 X
erralgoritmo = si δi−1
sn i=2

dove δi è l’errore nell’i-esima operazione di somma. Da |δi | ≤ u, i = 1, . . . , n − 1,


si ottiene
n
u X
|erralgoritmo | ≤ |si |, (13)
|sn | i=2
n
P
e, dalla maggiorazione |si | ≤ |xi |, i = 2, . . . , n, si ottiene
i=1
n
P
|xi |
|erralgoritmo | ≤ (n − 1)u i=1 (14)
|sn |
In particolare, se i dati xi , i = 1, . . . , n, hanno lo stesso segno, (14) fornisce la
limitazione
|erralgoritmo | ≤ (n − 1)u.
Da (13) possimo dedurre che l’accuratezza migliore si otterrà scegliendo l’or-
dinamento che minimizza |si |, i = 2, . . . , n. Questo problema di ottimizzazione
combinatoria è troppo costoso da risolvere in generale. Nel caso particolare di
xi , i = 1, . . . , n, non negativi, la soluzione ottimale è data dall’ordinamento
crescente che fornisce la stima
(n + 1)u
|erralgoritmo | ≤ .
2

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.

1.8 Complessità computazionale e parametri di qualità del


software matematico
Nella valutazione teorica di un algoritmo un parametro importante è la sua com-
plessità computazionale. Esso misura il numero delle operazioni aritmetiche
necessarie alla sua esecuzione e ci fornisce una stima del tempo di esecuzione.
In generale il costo computazionale viene espresso in funzione alla dimensione
n del problema da risolvere. L’agoritmo avrà complessità costante, indicata
con O(1), se il numero di operazioni è indipendente dalla dimensione n. La
complessità sarà lineare o polinomiale se richiede un numero di operazioni
pari a rispettivamente O(n) e O(nk ), con k intero positivo. Alcuni algoritmi
possono avere complessità esponenziale, i.e. O(cn ) operazioni, o fattoriale,
i.e. O(n!) operazioni.
Il numero di operazioni floating-point eseguite in un secondo dall’elabora-
tore, flops, rappresenta un indicatore della velocità di un calcolatore. Esso ci
permette di stimare il tempo di esecuzione di un algoritmo di cui conosciamo il
costo computazionale.
Esempio 27 Il calcolo della soluzione di un sistema lineare di dimensione n
mediante la regola di Cramer ([BBCM92, pag.13]) ha una complessità fattoriale
O(n!). Su un calcolatore in grado di eseguire 1 mega-flops (106 ) servirebbero
1, 6 ∗ 106 anni per risolvere un sistema di dimensione n = 20! Anche con un
calcolatore più avanzato con velocità pari a 1015 flops, sarebbero necessari 20
anni per risolvere un sistema di dimensione n = 24. Anche aumentando la
potenza di calcolo l’algoritmo di Cramer è inadeguato alla risoluzione di un
sistema lineare e pertanto tale problema matematico va affrontato sviluppando
altri algoritmi.
Quando l’agoritmo viene codificato in un programma altri parametri in-
tervengono nella sua valutazione. Per esempio è importante la gestione della
memoria che, assieme al tempo di esecuzione, ne definisce l’efficienza. Sia che
si utilizzi o che si sviluppi del software matematico, è bene ricordare alcune delle
caratteristiche che ne determinano la qualità ([Hea02]):
• affidabilità il codice svolge in maniera soddisfacente le funzioni richieste;
• accuratezza il codice produce risultati accurati in relazione al problema
ed ai dati di ingresso e fornisce una stima dell’accuratezza;
• efficienza il codice gestisce al meglio e senza sprechi le risorse di memoria
e minimizza il tempo di esecuzione;
• flessibilità-applicabilità il codice permette la risoluzione di un’ampia
classe di problemi;

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.

1.9 Osservazioni conclusive


L’analisi degli errori di arrotondamento e dell’aritmetica di macchina è sta-
ta un importante argomento dell’analisi numerica agli inizi, perchè ha posto
l’attenzione e definito importanti concetti quali la stabilità di algoritmi e il
condizionamento del problema.
Tuttavia, pur rimanendo fondamentale (visita il sito
http://www.ima.umn.edu/~arnold/disasters/
dove sono elencati dei disastri dovuti a computazioni numeriche non eseguite in
maniera attenta), riguarda solo una piccola parte dell’analisi numerica perchè
la sua anima sta nello sviluppo ed analisi di algoritmi veloci.

2 Esercizi svolti
Esercizio 11 Utilizzando la formula per la superficie di una sfera

A(r) = 4πr2 (15)

e lavorando in aritmetica finita a 4 cifre significative, si calcoli la superficie della


terra assumendo r = 6370 km e la variazione di superficie ∆A1 = A(r + h) −
A(r) corrispondente ad un aumento di raggio h = 1 km. In alternativa, tale
variazione si può ottenere con un’approssimazione di primo grado troncando lo
sviluppo in serie di Taylor di (15), ovvero
dA(r)
∆A2 = · h. (16)
dr
Si confrontino i due valori ottenuti e si ripetano i calcoli lavorando in aritmetica
finita a 6 cifre significative. Si commentino i risultati analizzando i diversi tipi
di errore commessi nel procedimento.

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.

La seguente function MATLAB realizza l’analisi dell’errore di approssima-


zione della derivata prima per la tangente.
function F=findiffor(x,h) F(:,1)=(sec(x))^2*ones(length(h),1);
F(:,2)=(tan(x+h)-tan(x))./h;
F(:,3)=abs(F(:,2)-F(:,1))./abs(F(:,1));
M=max(4*sin(x:.001:x+.1)./(cos(x:.001:x+.1)).^2);
F(:,4)=abs(M*h/2)./abs(F(:,1));
F(:,5)=eps+eps/2*(abs(tan(x+h))+abs(tan(x)))./(h.*abs(F(:,1)));
F(:,6)=F(:,4)+F(:,5); loglog(h,F(:,3),’-b’) hold on grid on
loglog(h,F(:,4),’--g’) loglog(h,F(:,5),’--c’)
loglog(h,F(:,6),’-.r’)

Esercizio 13 Si vuole studiare come variano gli zeri del polinomio

p(x) = (x − 1)(x − 2) · · · (x − 20) = x20 − 210x19 + · · ·

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

Figura 1: Errore totale nell’approssimazione della derivata con il rapporto


incrementale al variare del passo h.

quando si perturbano i suoi coefficienti. Si analizzi il condizionamento del pro-


blema del calcolo delle radici di p quando il coefficiente a = −210 di x19 viene
perturbato diventando a0 = −210 + 2−23 commettendo un errore relativo pari a
εa = 5.677 × 10−10 .

Soluzione. Il condizionamento dell’i-esima radice è misurato da


fi0 (a)
Ci = a
fi (a)

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

Tramite le seguenti istruzioni MATLAB che implementano i calcoli prece-


denti
function [r,rr,err,dfa]=polycond(N,n,ea)
r=[1:N]’; %radici
cp=poly(r); %coefficienti polinomio
era=abs(ea)/abs(cp(N-n+1)); %errore relativo di a
cp(N-n+1)=cp(N-n+1)+ea;
rr=flipud(roots(cp)); %radici perturbate

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.

radice radice perturbata errore relativo fi0 (a)


1 1.0000e+00 1.8252e-13 -8.2206e-18
2 2.0000e+00 3.6771e-12 8.1890e-11
3 3.0000e+00 2.2747e-10 -1.6338e-06
4 4.0000e+00 2.3822e-09 2.1896e-03
5 5.0000e+00 7.3107e-09 -6.0774e-01
6 6.0000e+00 7.7604e-07 5.8248e+01
7 7.0003e+00 3.8578e-05 -2.5424e+03
8 7.9933e+00 8.3844e-04 5.9696e+04
9 9.1442e+00 1.6025e-02 -8.3933e+05
10 9.5058e+00 4.9416e-02 7.5941e+06
11 1.0893e+01 -1.1488i 1.0489e-01 -4.6445e+07
12 1.0893e+01 +1.1488i 1.3297e-01 1.9850e+08
13 1.2822e+01 -2.1236i 1.6393e-01 -6.0556e+08
14 1.2822e+01 +2.1236i 1.7347e-01 1.3330e+09
15 1.5306e+01 -2.7755i 1.8615e-01 -2.1191e+09
16 1.5306e+01 +2.7755i 1.7881e-01 2.4075e+09
17 1.8181e+01 -2.5490i 1.6526e-01 -1.9044e+09
18 1.8181e+01 +2.5490i 1.4197e-01 9.9559e+08
19 2.0477e+01 -1.0390i 9.5036e-02 -3.0901e+08
20 2.0477e+01 +1.0390i 5.7160e-02 4.3100e+07

Tabella 10: Condizionamento del calcolo degli zeri di polinomio.

NOTA. Difficile può risultare anche la valutazione di un polinomio in pros-


simità delle sue radici. Si consideri infatti il polinomio p(x) = (x − x1 )(x −
x2 ) · · · (x − xn ) che ha n-radici x1 , x2 , . . . , xn . Il numero di condizionamento
risulta infatti
n
X x
C=
i=1
x − xi

per cui il problema della valutazione di p(x) è malcondizionato per x ' xi .


Infine può intervenire anche il fenomeno della cancellazione: si consideri in-
fatti il polinomio p(x) = (x−1)6 che ha radice x = 1 con molteplicità ν = 6 e che
può essere espresso anche come p(x) = x6 −6x5 +15x4 −20x3 +15x2 −6x+1. Se
si rappresenta con MATLAB p(x) per x = [0.995 : 0.0001 : 1.005] in entrambe
le forme si ottengono risultati diversi (Figura 2): la seconda rappresentazione
è infatti accompagnata da cancellazione tra i termini di grado più elevato. En-
trambi gli algoritmi di calcolo sono instabili in prossimità della radice (vedi grafi
dell’errore computazionale), ma il secondo lo è molto più del primo.

Esercizio 14 (vedi anche 24/03/03 − ]1) Calcolando in aritmetica di macchi-


na standard IEEE doppia precisione le seguenti espressioni matematicamente

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

Figura 2: Rappresentazione di p(x) = (x − 1)6 e di p(x) = x6 − 6x5 + 15x4 −


20x3 + 15x2 − 6x + 1.

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

Tabella 11: Valori delle espressioni al variare di x.

Soluzione. Tenendo conto che


1 − cos(x) 1
lim 2
=
x→0 x 2

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.

Esercizio 15 Si vuole implementare l’algoritmo

y1 = x2

yi+1 = yi , i = 1, . . . , m
z1 = ym+1
zi+1 = zi2 , i = 1, . . . , m − 1

in una function MATLAB del tipo


[z,err]=mroot(x,m)
dove z = zm ed err = |zm|x|−x| è l’errore relativo tra l’input x e l’output z che
analiticamente coincidono. Eseguendo la function per x = 0.25 : 0.25 : 1.5 con
m = 50 si ottengono i valori

>>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.

Soluzione. Una possibile implementazione è la seguente:


function [z,err]=mroot(x,m) y=x.^2; for i=1:m
y=sqrt(y);
end z=y; for i=1:m-1
z=z.^2;
end err=abs(z-x)./abs(x);
Per spiegare i risultati numerici analizziamo l’errore algoritmico mediante l’uso
dei grafi computazionali in maniera ricorsiva. Ricordando che l’errore in ogni
operazione è maggiorato dalla precisione di macchina u e considerando che l’e-
strazione della radice quadrata presenta un coefficiente di amplificazione pari a
1/2 mentre per l’elevamento al quadrato tale coefficiente è pari a 2, otteniamo

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

dove si è utilizzata la formula


m−1
X xm − 1
xi = .
i=0
x−1

Si osservi dunque come l’instabilità dell’algoritmo aumenta con m in conse-


guenza al ripetuto elevamento al quadrato con coefficiente di amplificazione
totale dell’ordine di 2m . Essendo infine nello standard IEEE doppia preci-
sione u = 2−53 , con m = 50 l’errore algoritmico totale risulta dell’ordine di
3/16 = 0.1875.

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.

Soluzione. Un esempio è il seguente:


function [erass,errel]=stirling(n)
% Calcola gli errori assoluto e relativo
% nell’approssimazione di Stirling per
% un vettore di interi ’n’.
for i=1:length(n)
fatt(i)=prod(1:n(i));
end stir=sqrt(2*pi*n).*(n/exp(1)).^n; erass=abs(stir-fatt);
errel=erass./fatt; subplot(2,1,1) semilogy(n,erass,’-b’)
subplot(2,1,2) semilogy(n,errel,’-r’)
Eseguendo la function per n = 1, 2, . . . , 171 si ottengono i risultati riportati
in Figura 3. Si osservi dunque che l’errore assoluto cresce seguendo l’ordine
del fattoriale stesso mentre quello relativo dimiuisce al crescere di n. L’ap-
prossimazione di Stirling è dunque tanto migliore quanto maggiore è l’intero n
considerato. Un esame più accurato dimostra inoltre che il fattoriale esatto è
sempre una maggiorazione di quello approssimato con la formula di Stirling.

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

Figura 3: Errori assoluto e relativo nell’approssimazione di n! con la formula di


Stirling.

Infine si osservi che per n = 171 si ottiene erass = Inf ed errel = N aN ,


cioè il risultato di un’operazione matematicamente indeterminata. Ciò è dovuto
alla computazione di f att(171) che risulta maggiore di realmax e dunque per
MATLAB è f att(171) = Inf . Di conseguenza si ha erass = |3.7842 × 10307 −
Inf | = Inf ed errel = Inf /Inf = N aN .

Esercizio 17 (vedi anche 10/07/03 − ]1) Si vuole approssimare il valore del-


la costante e = 2.7182818284590 . . . (numero di Nepero) utilizzando la sua
definizione
1
lim (1 + )n . (17)
n→∞ n
Calcolando en = (1+ n1 )n per n = 10k , k = 1, 2, . . . , 18, in aritmetica di macchina
secondo lo standard IEEE doppia precisione si ottengono i risultati in Tabella
12, dove err rappresenta l’errore relativo. Spiega i risultati.

Soluzione. Approssimando (17) con en si commette un errore composto da due


contributi. Il primo contributo è costituito dal troncamento nell’approssimare
il passaggio al limite. Tale errore analitico diminuisce ovviamente al crescere
di n. Il secondo contributo è dovuto alla cancellazione nella somma n + n1
e cresce al crescere di n. L’errore totale raggiunge dunque un minimo (per
k = 8) che rappresenta il compromesso tra l’errore analitico e la cancellazione,
poi aumenta per effetto di quest’ultima fino a stabilizzarsi. Per k ≥ 16 infatti,
1
n scende sotto la precisione di macchina dello standard IEEE doppia precisione,
per cui sommandolo ad n (=1) quest’ultimo rimane invariato.

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

Tabella 12: Approssimazione del numero di Nepero.

1
NOTA. Il fatto che n non influisca su n non è dovuto al fenomeno di
underflow!

Esercizio 18 (vedi anche 10/07/03 − ]2) Dovendo valutare log(x) − log(y) =


log( xy ) per x ≈ y, quale delle due espressioni useresti e perchè?

Soluzione. La scelta è ininfluente poichè entrambe le espressioni forniscono ri-


sultati non accurati, la prima per il fenomeno della cancellazione nella differenza
tra i logaritmi, la seconda per il malcondizionamento nel calcolo del logaritmo.
Utilizzando i grafi computazionali, supponendo che gli errori di valutazione siano
tutti uguali ad η e che tale quantità sia limitata in valore assoluto dalla preci-
sione di macchina u (|η| ≤ u), si ottengono le seguenti limitazioni per l’errore
algoritmico:
 
log x log y
|εalg1 | ≤ u 1 + +
log x − log y log x − log y
!
1
|εalg2 | ≤ u 1 + .
log xy
Entrambe divergono per x ≈ y.

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?

Soluzione. Se x è un numero macchina tale che x + 10 = x, allora si ottiene:

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.

Esercizio 20 (vedi anche HW01 2002/03−]1) Si considerino le due espressioni


matematicamente equivalenti

ay + b a + b/y
r1 = , r2 =
ay + c a + c/y

e si calcolino i loro valori per

a = b = β −pmin −t , c = 2(β − 1)β −pmin −t , y = (β − 1)β −1

utilizzando MATLAB ovvero secondo lo standard IEEE doppia precisione basa-


to sul sistema floating point F (B, t, pmin , pmax ) = F (2, 53, 1021, 1024) a cui si
aggiungono i numeri denormalizzati, cioè con esponente p = −pmin − 1 e prima
cifra nulla. Si dica quale delle due formule fornisce il risultato esatto confron-
tando i valori calcolati con MATLAB con il risultato teorico ottenuto analitica-
mente in aritmetica esatta. Si spieghi la differenza tra i valori computati dando
una giustificazione analitica per il risultato errato.

Soluzione. Le istruzioni MATLAB sono le seguenti:


>>beta=2;t=53;pmin=1021;
>>a=beta^(-pmin-t),b=a,c=2*(beta-1)*beta^(-pmin-t),...
y=(beta-1)*beta^(-1) a=
4.9407e-324
b=
4.9407e-324

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

Esercizio 21 (vedi anche HW01 2002/03−]2) Si scriva una function MATLAB


per il calcolo del valore approssimato della derivata prima di una funzione in un
punto usando le differenze finite centrate
f (x + h) − f (x − h)
f 0 (x) ≈ , h > 0.
2h
Si testi la function per la funzione esponenziale f (x) = ex per x = 1, valutando
l’errore relativo totale (assumendo che x, h, x + h e x − h sono numeri di mac-
china e che valutando f si commette un’errore di arrotondamento maggiorato
dalla precisione di macchina) commesso rispetto al valore esatto di f 0 (x) per
un passo variabile h = 10−1 , 10−2 , . . . , 10−16 . Si rappresentino su scala biloga-
ritmica l’andamento dell’errore relativo totale e delle maggiorazioni dell’errore
analitico e algoritmico in funzione del passo h. La function deve essere del tipo

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)|

e nello scegliere il passo h bisogna ‘bilanciare’ i due contributi. Il passo hm che


M h2 u(|f (x+h)|+|f (x−h)|)
fornisce la scelta migliore si può stimare ponendo 6|f 0 (x)| = · 2h|f 0 (x)|
da cui si ottiene r
3 6u|f (x)|
hm ≈ .
M
In corrispondenza di tale valore hm si ottiene la seguente maggiorazione dell’
errore totale p
2 3 M |f (x)|2 u2
|εtotale | ≤ 3u + ·
|f 0 (x)|
Si consideri ora f (x) = ex per x = 1. La derivata prima è f 0 (x) = ex ,
per cui risulta f 0 (1) ' 2.718281828459046; la derivata terza è f 000 (x) = ex per
cui si prenda M = 3.0042 ≥ e1.1 come maggiorazione nell’intervallo [0.9, 1.1]. I
risultati sono riportati in Tabella 13 e in Figura 4 e confermano quanto previsto.

h erass erana erarr


10−01 4.53e-03 5.00e-03 2.22e-15
10−02 4.53e-05 5.006e-05 2.22e-14
10−03 4.53e-07 5.01e-07 2.22e-13
10−04 4.53e-09 5.01e-09 2.22e-12
10−05 5.85e-11 5.01e-11 2.22e-11
10−06 1.634e-10 5.01e-13 2.22e-10
10−07 5.86e-11 5.01e-15 2.22e-09
10−08 6.60e-09 5.01e-17 2.22e-08
10−09 6.60e-09 5.01e-19 2.22e-07
10−10 6.73e-07 5.01e-21 2.22e-06
10−11 1.04e-05 5.01e-23 2.22e-05
10−12 2.10e-04 5.01e-25 2.22e-04
10−13 4.56e-04 5.01e-27 2.22e-03
10−14 9.34e-03 5.01e-29 2.22e-02
10−15 1.68e-01 5.01e-31 2.22e-01
10−16 4.98e-01 5.001e-33 2.22e+00

Tabella 13: Errore nell’uso delle differenze finite centrate nel calcolo della
derivata prima.

La seguente function di MATLAB realizza l’analisi dell’errore di approssi-


mazione della derivata prima per f (x) = ex :
function [erass,erana,erarr]=diffincen(x,h)

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

Figura 4: Errori nell’approssimazione della derivata con le differenze finite


centrate al variare del passo h.

Esercizio 22 (vedi anche HW01 2002/03 − ]3) Si calcolino le seguenti espres-


sioni matematicamente equivalenti
√ √ 1
n+1− n= √ √
n+1+ n
per n = 10, 102 , . . . , 1016 con MATLAB ovvero secondo lo standard IEEE doppia
precisione. Si spieghino i risultati ottenuti e si analizzi l’errore algoritmico di
entrambe le espressioni.
Soluzione. Le istruzioni MATLAB sono le seguenti
>>format long e
>>n=10.^([1:16]’);
>>alg1=sqrt(n+1)-sqrt(n);
>>alg2=1./(sqrt(n+1)+sqrt(n));
e i risultati sono riportati in Tabella 14.
I risultati attesi non dovrebbero scostarsi di molto dai seguenti valori:
 √
−k
10
2 × 10 ' 1.5811388 × 10−k per n = 102k−1 e k = 1, 2, . . . , 8
−k−1
5 × 10 per n = 102k e k = 1, 2, . . . , 8

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 .

ottenuti con la seconda formula approssimata da 2√1 n , per cui confrontando i


valori in Tabella proprio la seconda formula è quella che fornisce i valori più
accurati. In particolare, per n = 1016 la prima formula ritorna il valore zero
poichè, lavorando con precisione di macchina u ' 1.11 × 10−16 , risulta n + 1 = n
dato che l’aggiunta di 1 non influisce sulle cifre significative di n.
Per l’analisi dell’errore algoritmico si trascuri l’errore sul dato iniziale n sup-
ponendo (com’è il caso) che sia esattamente rappresentabile secondo lo standard
IEEE doppia precisione. Indicati con ε(i) e η (i) gli errori locali generati dalle
i-esime operazioni rispettivamente nel primo e nel secondo algoritmo si ha:
√ √ √
n
( n+1√ 1 √ n+1√
εalg1 = ε(1) + √n+1− n
ε(2)
+ 2 n+1− n ε (3)
− √
n+1− n
√ ε(4)
√ √ √
n+1√ 1 √ n+1√ n
εalg2 = η (1) − η (2) − √
n+1+ n
η (3) − 2 n+1+ n η
(4)
− √ √ η (5)
n+1+ n

Ipotizzando poi |ε(i) | ≤ u e |η (i) | ≤ u per ogni i si ottengono le maggiorazioni


  3
√ √ 
 |εalg1 | ≤ u 1 + 2√ n+1+√ n
| √n+1− √n| 
3

 |εalg2 | ≤ u 2 + 2√ n+1+√ n
n+1+ n
√ √
per cui il primo algoritmo risulta instabile per n + 1 ' n ovvero per n → ∞.

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

può avere un limite finito in aritmetica di macchina.


Esercizio 26 Considera un sistema di numeri di macchina con B = 10, t = 6
e x1 = 1.23456 e x2 = 1.23459.
• Quante cifre significative contiene x2 − x1 ?
• In un sistema normalizzato, indica il minimo valore degli esponenti pmin
e pmax per cui x1 , x2 , x2 − x1 sono rappresentati esattamente.
• Per tale sistema calcola realmax, realmin e la precisione di macchina u.

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.

4. Definisci la precisione di macchina.


5. Cosa si intende per “cancellazione”?
6. L’operazione di somma in aritmetica di macchina è associativa ma non
commutativa: vero o falso?

7. Elenca tre fonti d’incertezza nel calcolo scientifico.


8. Definisci la stabilità in avanti di un algoritmo.

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.

[Ste96] Stewart, G.W. (1996) Afternotes on Numerical Analysis, SIAM Ed.,


pagg. 43-66.

45

Potrebbero piacerti anche

pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy