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