—————
Appunti per l’Insegnamento di
Metodi computazionali per l’economia e per la finanza
Anno Accademico 2007/2008
Riccardo Cambini
Dipartimento di Statistica e Matematica Applicata all’Economia
Facoltà di Economia, Università di Pisa,
Via Cosimo Ridolfi 10, 56124 Pisa, ITALY
E-mail: cambric@ec.unipi.it
Versione Preliminare
Gennaio 2008
± mantissa ∗ baseesponente
1
mantissa. Chiaramente, per memorizzare il segno del numero è sufficiente
un singolo bit; per memorizzare invece la mantissa e l’esponente i calcolatori
mettono a disposizione una quantità limitata di memoria la cui dimensione
è definita da una convenzione internazionale. Di conseguenza, i calcolatori
non sono in grado di rappresentare tutti i numeri reali (che sono infiniti),
ma solamente una quantità finita di essi.
Ogni numero reale non di macchina viene automaticamente approssi-
mato dal calcolatore con un numero di macchina tramite tecniche di arro-
tondamento (si cerca il numero macchina più vicino) o di troncamento (si
eliminano le cifre in eccesso, ovvero si prende il numero di macchina più
piccolo e più vicino). Questa approssimazione comporta il seguente errore:
• Errore relativo di rappresentazione: errore commesso approssimando
il numero reale x con il numero di macchina x̃:
x̃ − x
x =
x
2
Standard 754” (ANSI/IEEE Standard 754-1985 for Binary Floating-Point
Arithmetic). Ogni numero è rappresentato in base 2 e memorizzato in 64
bit; un bit è utilizzato per il segno del numero, 11 bit sono utilizzati per
l’esponente, 52 bit sono utilizzati per la mantissa.
1 11 52
+-+-----------+----------------------------------------------------+
|S| Esponente | Mantissa |
+-+-----------+----------------------------------------------------+
63 62 51 0
3
• Associatività dell’addizione: (x + y) + z = x + (y + z);
• Semplificazione: x(y/x) = y.
4
numero di macchina, ed è di fatto inevitabile ogni qual volta x non
è un numero macchina. Il problema del calcolo di f (x) è detto mal
condizionato se comporta un grande Errore Inerente.
• Errore algoritmico: errore generato dal fatto che i calcoli sono effet-
tuati in aritmetica finita, ovvero approssimando il risultato di ogni
singola operazione. In particolare, a seconda della specifica sequenza
di operazioni da compiere, il computer invece che calcolare il valore
f (x̃) calcola un valore φ(x̃) commettendo il seguente errore relativo:
φ(x̃) − f (x̃)
alg =
f (x̃)
L’Errore Algoritmico dipende strettamente dalla specifica sequenza di
operazioni con cui si calcola il valore φ(x̃); in questo caso l’utente fina-
le può intervenire in modo diretto per diminuirne l’entità, come verrà
evidenziato in una sezione successiva, scegliendo opportunamente la se-
quenza di operazioni da calcolare. L’algoritmo utilizzato per il calcolo
di f (x) è detto stabile se comporta un piccolo Errore Algoritmico.
• Errore analitico: errore generato dalla eventuale approssimazione della
funzione φ con una funzione razionale ψ. In particolare, invece che il
valore φ(x̃) il computer calcola il valore ψ(x̃) commettendo il seguente
errore relativo:
ψ(x̃) − φ(x̃)
an =
φ(x̃)
Per quanto riguarda l’Errore Analitico, è principalmente compito dei
produttori di microprocessori e di software limitarlo il più possibile,
programmando in modo opportuno il calcolo delle funzioni non ra-
zionali (trigonometriche, logaritmiche ed esponenziali). Nel caso di
funzioni più complesse (integrale definito, zero di una funzione), l’u-
tente finale può intervenire scegliendo il metodo di approssimazione
più opportuno.
Ovviamente le precedenti definizioni valgono sotto le ipotesi che sia f (x) 6= 0,
f (x̃) 6= 0 e φ(x̃) 6= 0. In conclusione, il computer invece che calcolare il
valore f (x) calcola il valore ψ(x̃), commettendo il seguente errore relativo
complessivo:
ψ(x̃) − f (x)
tot =
f (x)
La relazione esistente tra Errore Totale, Errore Inerente, Errore Analitico
ed Errore Algoritmico è evidenziata nel seguente teorema.
5
Proof Si osservi preliminarmente che:
ψ(x̃) − f (x) ψ(x̃) − φ(x̃) + φ(x̃) − f (x̃) + f (x̃) − f (x)
tot = =
f (x) f (x)
ψ(x̃) − φ(x̃) φ(x̃) f (x̃) φ(x̃) − f (x̃) f (x̃) f (x̃) − f (x)
= + +
φ(x̃) f (x̃) f (x) f (x̃) f (x) f (x)
φ(x̃) f (x̃) f (x̃)
= an + alg + in
f (x̃) f (x) f (x)
f (x̃) φ(x̃)
La tesi segue quindi osservando che f (x) = 1 + in e che f (x̃) = 1 + alg .
da cui segue:
n
X xi ∂f x̃i − xi
in ≈ ci i con ci = (x) ed i =
i=1
f (x) ∂xi xi
c1 = 1 e c2 = 1
x1
• f (x1 , x2 ) = x2 ; risulta in = c1 1 + c2 2 dove
c1 = 1 e c2 = −1
6
• f (x1 , x2 ) = x1 + x2 ; risulta in = c1 1 + c2 2 dove
x1 x2
c1 = e c2 =
x1 + x2 x1 + x2
Dai precedenti esempi si evince che nel caso del prodotto e della divisione
tra due numeri l’Errore Inerente risulta essere di modesta entità.
Più delicato è invece il ragionamento nel caso delle operazioni di somma
e differenza tra numeri. Nel caso infatti in cui sia x1 ≈ −x2 i coefficienti
di amplificazione della operazione di somma tra due numeri risultano essere
enormi a causa del denominatore prossimo allo zero. Analogo problema si
ha nel caso in cui si debba calcolare la differenza tra due numeri tali che
x1 ≈ x2 . Questo comportamento prende il nome di fenomeno di cancel-
lazione numerica, ed è alla base di molti degli errori numerici del calcolo
computazionale.
Per riassumere quanto sopra descritto, si potrebbe dire che il computer
calcola bene i prodotti e le divisioni, ma è meno bravo a calcolare le somme
e le sottrazioni.
Concludiamo con i seguenti ulteriori esempi:
• f (x1 ) = xn1 ; risulta in = c1 1 dove
c1 = n
c1 = x1
Nel caso della funzione potenza, della funzione esponenziale e della funzione
logaritmica il calcolo risulta essere mal condizionato rispettivamente per
valori di n molto grandi, per valori di x1 molto grandi, per valori di x1
molto vicini ad uno.
7
4 Stima dell’Errore Algoritmico
A differenza dell’Errore Inerente (che è indipendente dall’algoritmo usato nel
calcolo della funzione), l’Errore Algoritmico è strettamente dipendente dalla
sequenza di operazioni eseguite. Per valutarne una stima conviene quindi
utilizzare un grafo, che permette di descrivere in modo efficace la specifi-
ca sequenza delle operazioni dell’algoritmo. I nodi rappresentano i risultati
intermedi dei calcoli, ad ogni nodo si associa l’errore commesso dall’appros-
simazione del corrispondente risultato intermedio al più vicino numero di
macchina, ad ogni arco orientato si associa il coefficiente di amplificazione
corrispondente all’operazione eseguita. In modo iterativo (andando dalle
foglie verso la radice del grafo) è cosı̀ possibile calcolare l’Errore Algoritmi-
co complessivo, causato dalla propagazione degli errori di approssimazione
commessi sui risultati intermedi. Si ricordi che nel calcolo dell’Errore Al-
goritmico i dati iniziali sono considerati numeri di macchina, quindi privi
di errore di approssimazione (come è stato già ripetutamente detto, gli er-
rori dovuti alla approssimazione numerica dei dati iniziali sono considerati
nell’Errore Inerente).
Come primo esempio, si supponga di dover calcolare la funzione polino-
miale f (x1 , x2 , x3 ) = x3 (x1 + x2 ). Tale funzione può essere calcolata in uno
dei due seguenti modi (matematicamente equivalenti):
A) x3 (x1 + x2 ) , B) x1 x3 + x2 x3
Questi due diversi metodi, la cui sequenza di operazioni è descritta dai grafi
in Figura 1, daranno origine a due diversi Errori Algoritmici.
0 0
x3 x1 "1
1 x1
1 x1 x 3
x 3 ( x1 + x 2 ) x1 + x 2
! 1 "3
! 0
! 0 x1 "2!
! x1 + x 2 ! x1 x 3 + x 2 x 3
x1 1 ! x3
! 1 !
! ! "2
x1 + x 2 !
! x2 x 3
! ! "1 0 x2
! 0 ! x1 + x 2
! x2
x2 !
x1 + x 2 A) ! ! x2 1 B)
!
!
! ! !
!
Figura 1: Errori Algoritmici di x3 (x
!1 + x2 )
! ! ! !
8
x1 x2
algB = η3 + · (η1 + 1 · 0 + 1 · 0) + · (η2 + 1 · 0 + 1 · 0) =
x1 + x2 x1 + x2
1
= η3 + · (η1 · x1 + η2 · x2 )
x1 + x2
E’ evidente che l’algoritmo A) è stabile, mentre non lo è l’algoritmo B) che
presenta possibili grandi errori numerici nel caso in cui sia x1 ≈ −x2 , ovvero
nel caso in cui si possano presentare fenomeni di cancellazione numerica.
Come secondo esempio, sisupponga di dover calcolare la funzione poli-
nomiale f (x1 , x2 ) = x21 − x22 . Tale funzione può essere equivalentemente
calcolata in uno dei due seguenti modi descritti in Figura 2:
A) x21 − x22 , B) (x1 + x2 ) (x1 − x2 )
x1 "1
0 1 "1 0 x1 + x 2
x12 x1 x1 + x 2
x1 x12 x12 " x 22
1
1 x2
! ! ! !" ! ! x1 + x 2 "3
3
!
!
A)! ! x12 " x 2 2
B) !
! ( x1 + x 2 )( x1 " x 2 )
! x1
! x1 " x 2 !
0 "2 !
1 "x 22 0 1
x2 x 2!
2 x12 " x 22 x2 !x " x
1 2
"x 2
1 !x "x "2
1 2
! ! ! ! ! ! !
! ! ! ! Algoritmici di! x2 − x2
Figura 2: Errori
1 2
! ! !
x21 −x2
algA = η3 + · (η1 + 2 · 0) + 2 2 2 · (η2 + 2 · 0) =
− x22x21 x1 − x2
1
= η3 + 2 · (η1 · x21 − η2 · x22 )
x1 − x22
x1 x2
algB = η3 + 1 · (η1 + ·0+ · 0) +
x1 + x2 x1 + x2
x1 −x2
+1 · (η2 + ·0+ · 0) =
x1 − x2 x1 − x2
= η1 + η2 + η3
9
Come ultimo esempio,
√ si supponga di dover calcolare la funzione irrazio-
nale f (x1 , x2 ) = x2 + 1 − x; ciò può essere fatto in uno dei due seguenti
modi: p 1
A) x2 + 1 − x , B) √
2
x +1+x
Si verifica facilmente che se x è un valore positivo molto grande allora l’algo-
ritmo A) presenta forti errori di cancellazione numerica, mentre l’algoritmo
B) risulta essere stabile. Nel caso invece in cui x è un valore negativo mol-
to grande in valore assoluto allora è l’algoritmo B) a presentare errori di
cancellazione numerica, mentre l’algoritmo A) è stabile.
Riassumendo quanto visto in questi tre esempi, occorre cercare di evitare
il più possibile i fenomeni di cancellazione numerica oppure, nel caso in cui
tali errori siano inevitabili, di anticiparli il più possibile scomponendo in
fattori le funzioni da calcolare (in modo tale da applicare i grossi coefficienti
di amplificazione ad errori numerici più piccoli).
Esercizio 4.1 Calcolare l’Errore Algoritmico delle seguenti funzioni nei due
casi A) e B):
x1 + x2 x1 x2
A) , B) +
x3 x3 x3
x1 + x2 x1
A) , B) 1 +
x2 x2
p x
A) x x2 + 1 − x , B) √
x2 +1+x
Esercizio 4.2 Calcolare l’Errore Algoritmico delle seguenti funzioni nei tre
casi A), B) e C):
10
Riferimenti bibliografici
[1] Bevilacqua R., Bini D., Capovani M. e O. Menchi (1987), Introduzione
alla matematica computazionale, Zanichelli, Bologna.
11