function c=bisez(fn,a,b,tol)
% BISEZ: calcola lo zero di una funzione con il metodo di bisezione
% BISEZ('fn',a,b,tol) cerca uno zero in [a,b] con il metodo di bisezione
% termina quando si ha un'intervallo di dimensione < tol
% deve essere a<b e fa*fb<0

% controlla estremi
if(a>=b)
   error('estremi non validi');
end
% controlla funzione negli estremi
fa = feval(fn,a);
fb = feval(fn,b);
if(fa*fb>=0)
   error('funzione di segno non discorde negli estremi');
end
% controlla tolleranza
if(tol<=0)
   error('la tolleranza deve essere >0');
end

% disegna funzione
figure;                                %------------
hold on;

yold = fa;
xold = a;
x = linspace(a,b,1000)
y = feval(fn,x);
plot(x,y);
plot([a a],[0 fa],'r');
text(a,0,'a');
plot([b b],[0 fb],'r');
text(b,0,'b');
plot([a b],[0,0],'g');     %--- asse delle x

% inizializza
done=0;
iter=0;
c = (a+b)/2;

while b-a > 2*tol & ~done
   iter = iter + 1;
   fc = feval(fn,c);
   plot([c c], [0 fc],'r');             %-------
   text(c,0,num2str(iter));             %-------
   if(fa*fc < 0)
      b=c;
      fb=fc;
      c = (a+b)/2;
   elseif(fa*fc > 0)
      a=c;
      fa=fc;
      c=(a+b)/2;
   else
      done = 1;  % fc == 0
   end
end

