Problema numerico
• Relazione funzionale chiara e non ambigua tra dati
iniziali e soluzione.
• Dati iniziali e soluzione sono due vettori finiti x, y.
f
x
f(x)=y
Metodo numerico
• Descrizione matematica dei calcoli che si
devono sviluppare per arrivare alla soluzione
• Attenzione: in un metodo numerico non è
detto ci sia la finitezza nel tempo!
• Quando abbiamo un metodo numerico
possiamo costruire un algoritmo
Algoritmo
• Sequenza finita e non ambigua di ordini
(istruzioni) che ai dati iniziali (input)
associano un unico risultato (output)
in un tempo finito
• Per uno stesso metodo numerico si possono
costruire più algoritmi
Bontà di un algoritmo
• Generale e robusto: applicabile ad un qualsiasi
insieme di dati di un certo dominio
• Semplicità di verifica delle ipotesi di applicazione
• Stabilità numerica
• Richiesta di risorse
- numero di operazioni
- quantità di memoria richiesta
Costo computazionale
Complessità computazionale di un algoritmo=
numero di operazioni aritmetiche floating
point richieste per la sua esecuzione
Unità di misura
FLOP (floating point operation)
1 flop = una operazione elementare (+,-,*,/)
Aritmetica floating point
Insieme dei numeri macchina F(B,s,L,U):
tutti i numeri della forma
x=±0. d1 d2 d3.....ds Bm (rappresentazione floating point)
dove
• B: base di rappresentazione
• d1≠ 0
• s: numero di cifre della mantissa
• L,U: estremi del range in cui può variare l’esponente m
(L<m<U)
I calcolatori utilizzano 32 o 64 bit per rappresentare
i numeri macchina (nella base B=2):
• Singola precisione
1
23
8
segno mantissa esponente
• Doppia precisione
1
segno
52
mantissa
11
esponente
Con l’hidden bit: 24 e 53 cifre, rispettivamente
Aritmetica di Matlab
• Matlab lavora in base 2 ma visualizza i risultati
usando la base 10
• Matlab lavora in doppia precisione:
16 cifre in base 10 (53 cifre binarie)
L=-308, U=+308 (base B=2: L=-1022, U=1024)
realmax=1.7977E+308 (21024)
(massimo numero rappresentabile in valore assoluto)
realmin=2.2251E-308
(2-1022)
(minimo numero rappresentabile in valore assoluto)
Numeri in modulo maggiori di realmax e inferiori a realmin
non possono essere rappresentati.
A un numero più grande di realmax (overflow)
Matlab associa il “valore speciale” Inf
>>2*realmax
ans=Inf
>>realmin/2
ans=1.1125E-308
(underflow)
In questo caso una parte di bit destinati alla mantissa viene
usata per l’esponente (perdita di cifre significative).
Se tale perdita supera un certo livello, Matlab restituisce 0.
>> realmin/10E+16
ans=0
ATTENZIONE: per l’underflow non viene dato un
segnale di errore
Precisione di macchina
eps=2-52=2.2E-16 precisione di macchina
• Per Matlab:
è il più grande numero macchina tale che 1+eps=1
• Per definizione:
è il più piccolo numero macchina tale che 1+eps>1
L’utilizzo di numeri macchina comporta i seguenti fatti:
• Gli errori sono sempre presenti nel calcolo
• Non tutti i numeri sono rappresentabili nell’insieme
dei numeri macchina (overflow, underflow)
• Si devono utilizzare algoritmi stabili per non
propagare troppo gli errori
Attenzione: ricordarsi che esistono problemi sensibili
alla variazione dei dati di ingresso
(problemi mal condizionati)
Errore propagato
Nel problema numerico i dati iniziali sono generalmente
affetti da un errore:
f
x
f(x)=y
δx errore inerente i dati
x + δx
f
f(x+δx)= ŷ
δy=ŷ-y è l’errore dovuto alla propagazione dell’errore
inerente δx (δy errore propagato).
La propagazione dell’errore dipende solo dal problema
numerico considerato.
NON dipende dall’algoritmo usato per fare i calcoli.
• Esempio: calcolare y=exp(ax)
iniziale affetto da un errore inerente δx
calcolo ŷ=exp(a(x+δx))=exp(ax) exp(a δx)
errore (relativo) propagato:
|(y-ŷ)|/|y|=|exp(ax)(1-exp(a δx))|/|exp(ax)|=|1-exp(a δx)|
dato
• a=100, x=10, δx=0.1
errore inerente (relativo):
δx/x= 1/100
errore (relativo) propagato:
|(y-ŷ)|/|y|=exp(10)-1=2.2025E+004
Esempio di problema mal condizionato
Problema ben/mal-condizionato
• Quando a piccole perturbazioni (relative) sui dati x
corrispondono perturbazioni (relative) sul risultato
f(x) dello stesso ordine di grandezza, il problema
y=f(x) è definito ben condizionato.
• Quando invece l’errore (relativo) sul risultato è
molto più grande dell’errore (relativo) sui dati .....
il problema considerato è detto mal condizionato.
Uno stesso problema può essere mal condizionato
per certi dati ma non per altri.
Indice di condizionamento
di un problema
x + δx →
f ( x + δx) − f ( x)
δx
≤K
f ( x)
x
K (costante) indice di condizionamento
• K grande
problema mal condizionato (errore
propagato molto più grande dell’errore sui dati)
problema ben condizionato (errore
• K piccolo
propagato dello stesso ordine dell’errore sui dati)
Nella soluzione di sistemi lineari Ax=b, K=||A|| ||A-1||
Indice di condizionamento per la
valutazione di una funzione
Problema:
valutare una funzione f (differenziabile) in un punto x
x: valore esatto
x+δx: valore perturbato
f(x+δx)-f(x)≈ f ’(x)δx
f ( x + δx) − f ( x) f ' ( x)δx
≈
f ( x)
f ( x)
f ( x + δx) − f ( x)  f ' ( x) x  δx

≈ 
f ( x)
 f ( x)  x
f ( x + δx) − f ( x)
f ' ( x) x δx
≈
f ( x)
f ( x) x
f ' ( x) x
K=
f ( x)
Esempio di mal condizionamento:
fa(x)=exp(ax2) con a>0
fa’(x)=2ax exp(ax2)
K=|(2ax2 exp(ax2))/exp(ax2)|=2ax2
Valutare fa(x) con a=5, in x=5
K=250
problema mal condizionato
Infatti, se perturbiamo a di 0.3 (δa=0.3): a1=5.3
Errore relativo sul dato di ingresso: |a1-a|/a=0.06
y=fa=5(5)=1.9356E +054
y1=fa1=5.3 (5)=3.4996E +057
Errore relativo sul risultato: |y1-y|/y=1.8070E+003
Esempio di ben condizionamento:
f ( x) = x
f ' ( x) =
con x>0
1
2 x
K=1/2
Calcolo
yˆ = x + δx
δx
 1 δx 

yˆ = x 1 + ≈ x 1 +
x
 2 x
L’errore propagato è
(Esercizio 3)
y − yˆ 1 δx
≈
y
2 x
Errori nella risoluzione di un
problema numerico
Problema y=f(x)
x1=x+δx
e1=|f(x)-f(x1)|
errore dovuto
al condizionamento
f
e2=|f(x1)-f1(x1)|
errore di
discretizzazione
f1
Applichiamo l’algorimo e otteniamo un valore
f2(x1)
e3=|f1(x1)-f2(x1)|
errore di calcolo
Stabilità numerica
Riguarda gli algoritmi e precisamente gli errori
di calcolo commessi nella sequenza di istruzioni
dell’algoritmo stesso.
Quando lavoriamo su un calcolatore usiamo un
insieme di numeri macchina e le operazioni
macchina
si introducono degli errori di calcolo dovuti agli
errori di arrotondamento
Per giudicare la bontà di un algoritmo per il calcolo di
f(x), dobbiamo confrontare l’output dell’algoritmo f2(x1)
con f(x1), dove x1=fl(x)
(i.e. x1=rappresentazione di x come numero macchina)
Un algoritmo si dice numericamente stabile se
|f(x1)- f2(x1)|/|f(x1)|
è dell’ordine della precisione di macchina, ossia se non
amplifica gli errori di arrotondamento dovuti ai calcoli.
La stabilità di un algoritmo valuta quindi la reazione
fornita dall’algoritmo all’introduzione di perturbazioni
nei dati iniziali. Tiene conto della sola propagazione
degli errori di arrotondamento provocati dall’aritmetica
di macchina.
Condizionamento di un problema,
algoritmo e stabilità
• La stabilità dell’algoritmo non garantisce che il
risultato calcolato sia accurato.
• Per un problema mal condizionato la distinzione
tra algoritmo stabile e instabile non è molto
significativa in quanto l’errore totale risulta
dominato dall’errore inerente.
• Quindi per un problema mal condizionato è
opportuna, in generale, una sua riformulazione.
La bassa accuratezza dei risultati prodotti da un
processo numerico può essere imputabile all’elevato
condizionamento intrinseco del problema
oppure
all’instabilità dell’algoritmo utilizzato per produrlo.
Amplificazione errori di calcolo
(instabilità numerica)
Cancellazione numerica:
perdita di cifre significative nella sottrazione
quando i due operandi sono vicini tra loro.
Infatti, sappiamo che se nella somma i dati
sono affetti da errore
(a+δa) ±(b+δb)
l’errore relativo sul risultato è
(δa±δb)/(a±b)
La differenza macchina non introduce alcuna
perdita di precisione ma può amplificare gli
errori di arrotondamento presenti negli operandi
a
b
a-b
fl(a),
fl(b)
fl(fl(a)-fl(b))
(Operazioni macchina: Esercizi 1,2)
Esempio: a=0.147554326 b=0.147251742
Calcolare a-b nell’aritmetica a s=6 cifre
>> a=0.147554326; b=0.147251742
>> digits(6)
[sintassi generale: digits(s)]
>> a1=sym(a,'d')
a1 =.147554
>> b1=sym(b,'d')
b1 =.147252
>> a1-b1
ans =.302 E-3
La vera differenza è a-b=.3202584 E-3
Le ultime cifre della mantissa sono alterate in quanto
abbiamo fatto fl(a)-fl(b)
Adesso prendiamo due numeri più vicini:
a=0.147554326 b=0.147551742
Calcoliamo a-b nella stessa aritmetica di prima…
a1-b1=fl(a)-fl(b)=.2000E-5
mentre
a-b=.2584E-5
(Cancellazione numerica: Esercizi 4,5)
Sommare tanti addendi
a1+ a2+ a3 +…… an
Algoritmo più stabile:
ordinare gli addendi in modo che:
|a1 |≤|a2|≤| a3 |≤……≤ |an |
e poi sommare
(Esercizio 8)
Valutazione di un polinomio
p(x)= a1xn+ a2 xn-1 +…+ an x + an+1, a1≠0
a: vettore dei coefficienti
x: vettore di punti in cui effettuare la valutazione
>>y=polyval(a,x)
Il comando polyval usa l’algoritmo di Horner
Costo computazionale:
n moltiplicazioni e n addizioni
Algoritmo “standard”
p=1;
s=an+1;
for i=n:-1:1
p=p*x;
s=p*ai+s;
end
disp(s);
Costo computazionale:
2n moltiplicazioni e n addizioni
Algoritmo di Horner
Si basa sulla seguente riscrittura di p(x):
p(x)= (((a1x+a2)x+a3)x+…+an)x+an+1
s=a1;
for i=2:n+1
s=s*x+ai;
end
disp(s);
Costo computazionale:
n moltiplicazioni e n addizioni
Esercizio:
Scrivere un file di comandi che valuti e disegni il
polnomio p(x)= x6- 6 x5 + 15x4 - 20x3 +15 x2 - 6x+1
nell’intervallo [0.998, 1.002] con diversi algoritmi:
1. “valutazione brutale”
2. schema di Horner (polyval)
3. p(x)=(x-1)6
Altri esempi di instabilità numerica (Esercizi 6,7)