function [alpha,it,xv,fk]=bisezione(a,b,fun,toll)
% Chiamata:
%     [alpha,it,xv,fk]=bisezione(a,b,fun,toll)
% Input:
%   a,b: intervallo iniziale
%   fun: inline function per f(x)
%  toll: tolleranza
%  nmax: numero max di iterazioni 
% Output:
%   alpha: radice calcolata
%   it:    numero di iterazioni effettuate
%   xv:    elenco delle iterate
%   fk:    valori di f(xv)

it=1;        % contatore di iterazioni
I=(b-a)/2;
xv=(a+b)/2;
fk=fun(xv);
fa=fun(a);
% ciclo
while I > toll
    % se sono alla precisione macchina, esco
    % attenzione: il test (a==b) non funziona!
    if (xv(it)==a)||(xv(it)==b)
        alpha=xv(end);
        return
    end
    % se ho trovato lo zero esattamente, esco
    if(fk(it)==0)
        alpha=xv(end);
        return
    end
    % bisezione
    if(fa*fk(it)<=0)
        b = xv(it);
    else
        a = xv(it);
        fa =  fk(it);
    end
    % valori per la nuova iterata
    it=it+1;
    xv(it)=(a+b)/2;
    fk(it)=fun(xv(it));
    I=(b-a)/2;
end
% xv e` sicuramente non vuoto!
alpha=xv(end);
return
