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)