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