Propagazione di errori
Gli errori nei dati possono essere amplificati durante i
calcoli.
Rispetto alla propagazione degli errori si può distinguere:
• comportamento del problema - condizionamento del
problema:
vedere come le perturbazioni dui dati si trasmettono sui
risultati
• comportamento dell’algoritmo - stabilità
dell’algoritmo
E’ stabile se le operazioni non amplificano gli errori
di arrotondamento
Per un problema bencondizionato esistono algoritmi stabili.
Un problema malcondizionato va riformulato, se possibile.
Buona posizione di un problema
F( x, d) = 0
Si dice che il problema è ben posto se, per un certo dato d,
la corrispondente soluzione x esiste, è unica, e dipende
con continuità dai dati.
Un esempio di problema malposto è la determinazione del
numero di radici reali di un polinomio. Ad es.,
p ( x ) = x 4 − x 2 ( 2 a − 1) + a ( a − 1)
al variare di a con continuità nell’insieme dei numeri reali,
c’è una variazione discontinua del numero di radici
reali. Infatti ce ne sono 4ase≥ 1
2 se a ∈[0, 1 )
nessuna se
a <0
1
CONDIZIONAMENTO DI SISTEMI LINEARI
 2 .1

 4 . 19
+ 3 .5 y = 8 

x + 7
y = 15 
x
ha soluzione (100, -57,714…).
Se introduco una perturbazione dell’ordine di 10-3
 2 .1 x + 3 .5 y = 8 


+
=
4
.
192
x
7
y
15


la nuova soluzione è (125,-72.714….).
Il punto d’intersezione delle due rette si è spostato di
molto, perché la seconda retta e la sua perturbata sono
“quasi” parallele, e quindi una lieve perturbazione del
coefficiente angolare provoca un notevole spostamento del
punto d’intersezione.
Calcolo delle radici di un polinomio
( x−2) 4 = 0
Questo polinomio ha 4 radici coincidenti x=2.
Introduciamo una perturbazione:
( x − 2 ) 4 = 10 −8
Le nuove soluzioni sono 1.99, 2.01, 2-i, 2+i .
Due soluzioni sono complesse coniugate.
La perturbazione ha modificato il campo di appartenenza
delle soluzioni, ed ha introdotto nelle radici reali una
perturbazione di un ordine di grandezza 4 volte superiore.
E’ un problema malcondizionato.
2
Calcolo delle radici di un polinomio
in Matlab
( x − 2 ) 3 = x 3 − 6 x 2 + 12 x − 8 = 0
Questo polinomio ha 3 radici coincidenti x=2.
( x − 3 ) 4 = x 4 −12 x 3 + 54 x 2 −108 x + 81= 0
Questo polinomio ha 4 radici coincidenti x=3.
Calcoliamo le radici col comando roots di Matlab.
Sono problemi malcondizionati.
Dov’è la perturbazione che ha modificato il campo di
appartenenza delle radici?
Differenza tra due numeri
x= 12345678.0
y= 12345677.0
z=x-y=1.00000000
Perturbiamo:
z’=x’- y’
x’=12345678.1
y’=12345676.9
z’=1.20000000
Una perturbazione sulla nona cifra significativa dei dati ha
portato una perturbazione nella seconda cifra significativa
della soluzione.
3
Errore relativo sui dati
| x − x' |
= 0.81 *10 −8
x
| y − y' |
= 0.81 *10 −8
y
Errore relativo sui risultati
| z − z' |
= 0.2
z
Si passa da 8 cifre significative in x’ e y’ ad una cifra in z’,
cioè si sono cancellate 7 cifre significative (cancellazione
numerica)
Studio del condizionamento di A
(rispetto alla soluzione del sistema lineare)
Ax=b
Se si effettua una perturbazione su A e b, qual è l’effetto
su x?
( A+δ A)( x +δ x ) =(b +δ b)
Studiare il condizionamento di questo problema,
significa valutare l’errore relativo
||δ x ||
|| x ||
e confrontarlo con l’errore relativo sui dati
4
Per semplicità, perturbiamo solo il termine noto b.
A( x +δ x) =(b+δ b)
A x = b ⇒ A δ x = δ b ⇒ δ x = A −1 δ b
Supponiamo di utilizzare una
compatibile con la norma di vettore
norma
• || δ x || = || A − 1 δ b || ≤ || A
−1
di
matrice
|| || δ b ||
• || b || = || A x || ≤ || A || || x ||
•
1
1
≥
|| b ||
|| A || || x ||
•
|| δ x ||
≤ || A
|| A || || x ||
−1
||
|| δ b ||
|| b ||
E infine
||δ x ||
||δ b ||
≤ || A |||| A −1 ||
4
3 || b ||
|| x || 142
K( A)
K(A) è il fattore di amplificazione della perturbazione,
ed è l’indice di condizionamento del problema
5
CONDIZIONAMENTO DI SISTEMI
LINEARI
•Considera i seguenti comandi MATLAB:
>>a=[3.021 2.714 6.913
1.031 -4.273 1.121
5.084 -5.832 9.155]
>>b=[12.648; -2.121; 8.407]
>>a\b
•Modifica poi a(2,2) da -4.2730 a -4.2750 e risolvi nuovamente il
sistema:
>>a(2,2)=-4.2750
>>a\b
•Commenta.
Matrice di Hilbert
Matrice di Hilbert di ordine n
<< hilb(n)
Risolviamo esattamente il sistema 5*5 (ad es. con
Mathematica), e poi risolviamolo con il comando in linea
di Matlab
h = Table[1/(i+j-1),{i, 5},{j, 5}]
h .{{x1},{x2},{x3},{x4},{x5}}=={{1},{1},.













1
1
2
1
3
1
4
1
5
1
2
1
3
1
4
1
5
1
6
1
3
1
4
1
5
1
6
1
7
1
4
1
5
1
6
1
7
1
8
1
5
1
6
1
7
1
8
1
9





















x1
x2
x3
x4
x5

1 

 

1 
 = 1 

 

1 

1 
 









x1
x2
x3
x4
x5



 =




5


 − 120

630

 − 1120

630









6
Calcoliamo l’indice di condizionamento della matrice
di Hilbert, n=2,….,15
(comando cond di Matlab)
H i j =(hi j ), hi j =(i + j −1)−1, i, j =1, 2,K, n
La matrice di Hilbert è nota perché malcondizionata.
Verifichiamo sperimentalmente il “malcondizionamento”,
risolvendo col comando in linea di Matlab il seguente sistema
lineare H x = b, con
1
, b (i ) = H (i , 1) / π
H (i , j ) =
i , j = 1, 2, K , n
i + j −1
per n=2,…..,15.
La soluzione esatta del sistema è b=[1/pi, 0, 0, …., 0]
<< H=hilb(n)
<< b=H(:,1)/pi
<< x=H\b
Matrici di Vandermonde
1

x1
x 2
 1
L
x n−1
 1
1
1
x2
x 22
L
x 2n−1
x3
x 32
L
x 3n−1
L1 

L xn 
L x 2n 

LL 
L x nn−1
xi ≠xj per i ≠ j
I sistemi con queste matrici risultano
malcondizionati
7
Teorema
Per ogni matrice non singolare A ∈ ℜ
e per ogni norma di matrice compatibile con una
di vettore, la quantità 1/K(A) rappresenta la
distanza relativa di A dall’insieme di tutte le
matrici singolari di ordine n, cioè
nxn
 || A − B ||
1
: B ∈ℜ n x n singolare
= min 
K ( A)
 || A ||
}
Studiare il condizionamento del sistema lineare avente la
seguente matrice dei coefficienti
1

A=2
1

1 2.E + 9 

− 1 1. E + 9 
2
0 
Equilibrare poi la matrice per righe, e studiarne
nuovamente il condizionamento
8
Esempio di algoritmo instabile
Consideriamo i primi N termini dello sviluppo in serie di
Mac Laurin di punto iniziale 0 della funzione
esponenziale.
N
N
( − 1) n | x | n
xn
x
=∑
e ≈ SN (x) = ∑
n!
n = 0 n!
n=0
Supponiamo t=5, e valutiamo SN (x) in x=-5.5, con N=25.
Il risultato è 0.26363*10 -2;il valore esatto (arrotondato a
5 cifre significative è 0.40868*10-2.
L’errore relativo è 0.35.
E’ un cattivo risultato. Perché?
N
e ≈ SN ( x) = ∑
x
n =0
N
xn
( − 1) n | x | n
=∑
n! n = 0
n!
lim S N = e x
N −> ∞
Valutando e -5.5, nella serie ci sono segni alterni, e si
sottraggono numeri vicini. Si perdono progressivamente
cifre significative e quindi aumenta l’errore relativo.
Come ottenere un algoritmo stabile?
Osservazione:
e x = 1/e -x
Calcolando e x per x > 0, si evita la cancellazione numerica e si
ottiene un algoritmo stabile.
Non si determina N a priori; l’algoritmo termina quando
|x| n /n! si comporta come zero nella somma con S n-1.
9