metodi numerici per la ricerca degli zeri
Transcript
metodi numerici per la ricerca degli zeri
DETERMINAZIONE DEGLI ZERI DI UNA FUNZIONE Prof.Daniele Attampato Il problema da affrontare e’ calcolare in modo approssimato gli zeri di una funzione, cioe’ i valori di x per cui la funzione si annulla. • I metodi per calcolare gli zeri di una funzione sono: 1.metodo di bisezione 2.metodo delle tangenti 3.metodo delle secanti 4.metoto del punto unito • Perche’ i metodi possano essere applicabili devono verificarsi le seguenti condizioni: · la funzione deve ammettere uno zero nell’intervallo [a,b] · la funzione deve essere continua nell’intervallo [a,b] · la funzione deve essere secante all’asse delle x e non tangente (questo significa che il segno della f(x) a destra dello zero deve essere opposto al segno a sinistra dello zero) • Per ottenere l’intervallo di partenza [a,b] si puo’ tracciare il grafico della funzione con Derive e prendere due valori di x che contengano lo zero (separazione delle radici). METODO DI BISEZIONE A partire dall’intervallo [a,b], si considera l’intervallo [a,c] con c punto medio tra a e b, e si calcola il valore della funzione nei due estremi: se i due valori hanno segno opposto (il loro prodotto e’ negativo) allora la funzione si annulla proprio in [a,c]; si pone allora b←c e si ripete la procedura. se i due valori hanno stesso segno (il loro prodotto e’ positivo) allora la funzione si annulla in [c,b]; si pone allora a←c e si ripete la procedura. Condizione di arresto: il programma si ferma quando l’intervallo è diventato piu’ piccolo di un valore ‘e’, detto errore assoluto (in alternativa puo’ essere considerato l’errore relativo). Alla fine del ciclo si può prendere indifferentemente a o b come approssimazione dello zero. INIZIO c=(a+b)/2 SI f(a)*f(c) > 0 ? NO a=c b=c NO b-a<e? SI FINE ESERCIZIO Graficare la funzione y=x5+x3-7x2-x+6 visivamente la separazione delle radici. con Derive ed effettuare Determinare lo zero della funzione nell'intervallo [a,b] usando il metodo numerico di BISEZIONE. CODICE IN LINGUAGGIO C #include <stdio.h> /* include le funzioni di input/output */ #include <math.h> /* include le funzioni matematiche: in tal caso pow(base,esp) */ #include <stdlib.h> /* include la funzione system(“PAUSE”) */ float f(float x){ float y; y=pow(x,5)+pow(x,3)-7*pow(x,2)-x+6; return y; } int main(){ float a,b,c,e; /* [a,b] è l'intervallo contenente lo zero c è il punto medio di [a,b] e è l'err assoluto*/ printf(" INSERIRE L'INTERVALLO [a,b] \n"); printf(" ESTREMO SINISTRO a= "); scanf("%f",&a); printf(" ESTREMO DESTRO b= "); scanf("%f",&b); printf(" INSERIRE L'ERRORE ASSOLUTO e= "); scanf("%f",&e); while ((b-a)>e){ c=(b+a)/2; if (f(a)*f(c)<0) b=c; /* se c'è un cambiamento di segno della funzione nell'intervallo [a,c] */ a=c; /* se non c'è un cambiamento di segno della funzione nell'intervallo [a,c] */ else } printf("\n\n LO ZERO SI HA IN x= %f",a); printf("\n\n\n"); system("PAUSE"); } METODO DELLE TANGENTI Partendo da un punto prossimo allo zero, l’intersezione dell’asse delle x con la tangente alla funzione in quel punto determina la successiva approssimazione dello zero cercato. Il metodo converge se la derivata seconda della funzione è costante in [a,b]. y - f(x0)=f’(x0)(x-x0) y=0 -f(x0)=f’(x0)(x-x0) x= x0 - f(x0)/f’(x0) x0=a x1 x2 Questo si traduce applicando iterativamente la formula: xn+1 = xn – f(xn)/f’(xn) dove xn rappresenta l’approssimaz. corrente ed xn+1 l’approssimazione successiva. Inizializzazione: se f(a)*f’’(a) > 0 x0=a x0=b se f(a)*f’’(a) < 0 f(xn) rappresenta il valore della funzione in xn, mentre f’(xn) il valore della derivata prima della funzione in xn. La formula converge verso lo zero a patto che la funzione sia monotona tra l’estremo scelto e lo zero: la tangente non deve mai cambiare di segno durante il processo di avvicinamento, altrimenti l’algoritmo “torna indietro” e diverge. Condizione di arresto: l’esecuzione termina quando due approssimazioni consecutive differiscono, in valore assoluto, di un valore più piccolo di ‘e’ (errore assoluto). Si considera il valore assoluto per garantire che la differenza xn+1-xn (ampiezza dell’intervallo) sia comunque sempre positiva. NB: Nel codice, prima del ciclo, alle variabili xn e xn+1 vengono assegnati i valori degli estremi dell’intervallo [a,b], in modo da poter soddisfare da subito la condizione ed entrare nel ciclo stesso per iniziare le iterazioni. Al primo passaggio nel ciclo, a partire da uno dei due estremi, si ricava l’approssimazione successiva, e così via (l’altro estremo non viene utilizzato). ESERCIZIO Graficare la funzione y=x5+x3-7x2-x+6 visivamente la separazione delle radici. con Derive ed effettuare Implementare un programma in linguaggio C per determinare lo zero della funzione nell'intervallo [a,b] usando il metodo numerico delle TANGENTI. La derivata prima della funzione data è: y’=5x4+3x2-14x-1 METODO DELLE SECANTI Questo metodo utilizza l’intersezione di una secante con l’asse x per determinare la successiva approssimazione dello zero cercato. Rispetto al metodo delle tangenti non richiede l’uso della derivata, ma necessita di un punto fisso da utilizzare come secondo punto per determinare le varie secanti. Il metodo converge se la derivata seconda della funzione è costante in [a,b]. Questo si traduce applicando (x-x0)/(a-x0) = (y-f(x0))/(f(a)-f(x0)) iterativamente la formula: eq. Retta per due punti xn+1 = xn – f(xn)*(xn-c) y=0 x = x0 – f(x0)*(x0-a) --------------f(x0)-f(a) f(a) a f(x0) x3 x2 x1 x0 = b f(xn)-f(c) dove xn rappresenta l’approssimaz. corrente ed xn+1 l’approssimazione successiva. Inizializzazione: x0=a, c=b se f(a)*f’’(a) < 0 x0=b, c=a se f(a)*f’’(a) > 0 L’algoritmo converge nella maggioranza dei casi anche se è possibile che in qualche raro “caso patologico” possa “perdere” lo zero. Ad ogni modo, la sua efficacia e’ meno legata alle particolari caratteristiche della funzione, rispetto al metodo delle tangenti, anche se un po’ piu’ lento dal punto di vista della velocita’ di convergenza (necessita in generale di un maggior numero di iterazioni per raggiungere la soluzione). Per il resto, la struttura ciclica e la condizione di uscita dei due metodi sono identiche. Condizione di arresto: l’esecuzione termina quando due approssimazioni consecutive differiscono, in valore assoluto, di un valore più piccolo di ‘e’ (errore assoluto). Si considera il valore assoluto per garantire che la differenza xn+1-xn (ampiezza dell’intervallo) sia comunque sempre positiva. NB: Nel codice, prima del ciclo, alle variabili xn+1 e xn vengono assegnati i valori degli estremi dell’intervallo [a,b], in modo da poter soddisfare da subito la condizione ed entrare nel ciclo stesso per iniziare le iterazioni. ESERCIZIO Graficare la funzione y=x5+x3-7x2-x+6 visivamente la separazione delle radici. con Derive ed effettuare Implementare un programma in linguaggio C per determinare lo zero della funzione nell'intervallo [a,b] usando il metodo numerico delle SECANTI. METODO DEL PUNTO UNITO Data una funzione f(x), il sistema per la ricerca delle radici (o zeri) è: y=f(x) f(x)=0 Sommando x ad entrambi i membri si ottiene: y=0 f(x)+x=x (in alternativa, se possibile, si può isolare x a destra direttamente nella f(x)) E’ sufficiente allora studiare le intersezioni delle funzioni g(x)=f(x)+x e t(x)=x Osservando il grafico di esempio, la intersezione delle due curve è il punto unito (Pu), la cui ascissa xPu è la radice cercata. Il metodo ricorsivo per trovare il valore approssimato dell’ascissa del punto unito xPu è il seguente: x1 x2=g(x1) x3=g(x2) x4=g(x3) …….. Se viene soddisfatta la condizione sufficiente di convergenza (vedi pagina successiva) la successione dei valori x1…xn converge a xPu. Convergenza: condizione sufficiente Se g(x) è derivabile in I = [a, b] e |g’(x)|<1, x є I esiste un unico punto unito xPu є I la successione dei valori x1..xn converge a xpu, per ogni approssimazione iniziale x1 є I. Condizione di arresto del programma: l’esecuzione termina quando due approssimazioni consecutive differiscono, in valore assoluto, di un valore più piccolo di ‘e’ (errore assoluto). Si considera il valore assoluto per garantire che la differenza xn+1-xn (ampiezza dell’intervallo) sia comunque sempre positiva. ESERCIZIO Graficare la funzione = − − con Derive. Tramite il foglio elettronico (n=10 iterazioni) determina un valore approssimato della radice presente nell’intervallo [0,1] usando il metodo numerico del punto unito. = − − −2 −1=0 g(x)= − − − t(x)= −1= (isolo la x a secondo membro) Verifica della condizione sufficiente di convergenza |g’(x)|<1, x є [0,1] La condizione sufficiente di convergenza è verificata! Posso quindi cercare l’approssimazione della radice mediante il foglio elettronico. Calcolo dell’approsimazione della radice La soluzione esatta è x = 0.5505102572