Supponiamo che sia una funzione continua nell'intervallo
tale che
cioè la funzione assume valori di segno opposto
nei due estremi.
Allora per il teorema dell'esistenza degli
zeri
.
Definiamo
allora si può avere uno dei seguenti
tre casi:
In un passo abbiamo in questo modo dimezzato l'ampiezza dell'intervallo di confidenza, quindi reiterando questo metodo è possibile trovare un intervallo di confidenza di ampiezza sempre più piccola.
Poiché
si ha
.
In generale
. Sviluppando questa
relazione si ottiene
In questo modo, fissata la accuratezza , viene fissato anche il numero
massimo di iterazioni,
. Nella nostra implementazione, epsilon
viene dato dall'utente e
viene calcolato secondo la formula
(2.1) e restituito in nu.
Un altro problema che si presenta nell'implementazione dell'algoritmo
è la condizione
che è difficilmente verificabile in
aritmetica finita e dev'essere più realisticamente sostituita con una
condizione del tipo
dove
soddisfa
![]() |
(2.2) |
Tale risulta essere
![]() |
(2.3) |
Tuttavia calcolare esplicitamente sarebbe più costoso del
metodo di bisezione stesso. Quello che possiamo fare è approssimare
con il rapporto incrementale che ha come estremi
l'intervallo corrente
:
![]() |
(2.4) |
Nell'esempio vediamo l'applicazione della procedura di bisezione alla
funzione . L'intervallo di confidenza iniziale è
(osserviamo che la funzione assume valori di segno opposto. In questo
caso il metodo converge alla soluzione
in 49 passi mentre
il limite fissato con la formula (2.1) è 51. La funzione
è molto regolare quindi si ha
.
Nel caso che la radice non sia semplice e quindi la funzione sia
molto schiacciata (nell'esempio ) ad un
piccolo corrisponde un
abbastanza grande: nell'esempio ad
corrisponde un
dell'ordine di
.
[,nu,delta,passi]=bisez(f,a,b,epsilon) -
Applica il metodo
di bisezione alla funzione
nell'intervallo [a,b] con accuratezza
epsilon; precondizioni>
continua in [a,b] e
.
Restituisce in
la radice trovata, in nu il limite superiore
al numero di passi da eseguire, in delta l'accuratezza sulle
in
il numero di passi effettuati.
%BISEZ %[x,nu,delta,i]=bisez(f,a,b,epsilon) %dove %- f e' il NOME di una funzione f %- a e b sono gli estremi di un intervallo tale che f(a)*f(b)<0 %- epsilon e' l'accuratezza desiderata % % applica il metodo di bisezione e restituisce in x una radice % di f(x) % In nu viene resttituito il limite superiore % al numero di iterazioni affinche' % il metodo sia attendibile con % accuratezza epsilon; in delta viene restituita % l'accuratezza sulle y % See also NEWTON function [x,nu,delta,i]=Bisez(f,a,b,epsilon) nu=ceil(log2(b-a)-log2(epsilon)); %si pone un limite superiore al numero %di iterazioni, dipendente dalla accuratezza %desiderata (epsilon) e dall'intervallo iniziale [a,b] fa=feval(f,a); fb=feval(f,b); for i=1:nu x=(a+b)/2; fx=feval(f,x); delta=epsilon*abs((fb-fa)/(b-a)); if abs(fx)<delta return elseif fa*fx<0 b=x; fb=fx; else a=x; fa=fx; end end return
>> sin (2) ans = 0.90929742682568 >> sin(4) ans = -0.75680249530793 >> [x,nu,delta,passi]=bisez('sin',2,4,1E-15) x = 3.14159265358979 nu = 51 delta = 1.000000000000000e-015 passi = 49 >> pi ans = 3.14159265358979 >> type fm function y=fm(x) y=(x-5)^5; >> [x,nu,delta,passi]=bisez('f_e',4,7,1E-5) x = 6.99999427795410 nu = 19 delta = 0.01096626883467 passi = 19
2004-05-29