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