function [x, its, delta] = bisezione (f, a, b, tol, maxits)
%
% function [x, its, delta] = bisezione (f, a, b, tol, maxits)
%
% Metodo di bisezione per f nell'intervallo [a, b]. tol e` un vettore
% [tol_r, tol_a] di tolleranze relativa ed assoluta. maxits il numero
% massimo di iterazioni. In uscita, x e` il vettore delle
% approssimazioni, its il numero di iterazioni e delta il vettore
% delle stime dell'errore.
fa = f(a);
fb = f(b);
if (fa * fb > 0)
   error('bisezione: Nessuno zero nell''intervallo.')
end
its = 1;
delta(its) = (b - a) / 2;
x(its) = a + delta(its);
while ((delta(its) > tol(1) * abs(x(its)) + tol(2)) && (its < maxits))
  fx = f(x(its));
  if (fa * fx <= 0)
    b = x(its);
    fb = fx;
  else
    a = x(its);
    fa = fx;
  end
  its = its + 1;
  delta(its) = delta(its - 1) / 2;
  x(its) = a + delta(its);
end
if (delta(its) > tol(1) * abs(x(its)) + tol(2))
   warning('bisezione: Raggiunto il numero massimo di iterazioni.')
end
%!demo
%! bisezione (@sin,1,2,[0, 0], 10)
%!demo
%! bisezione (@(x) sin(x)+cos(x),2,3,[1e-6, 1e-6], 20);
%!demo
%! bisezione (@sin,1,3*pi/2,[1e-6, 1e-6], 10)
%!demo
%! [x, its, delta] = bisezione (@sin,1,3*pi/2,[1e-6, 1e-6], 20);
%! errore = abs (pi - x);
%! semilogy(1:its,errore,'o',1:its,delta,'*')
%! legend('errore','delta')
%! xlabel('iterazioni')
%! ylabel('valori assoluti')
%!demo
%! [x, its, delta] = bisezione (@sin,-pi/2,pi/2,[1e-6, 1e-6], 30);
%! errore = abs (x);
%! semilogy(1:its,errore,'o',1:its,delta,'*')
%! axis([0,25,1e-13,10])
%! title('bisezione')
%! legend('errore','delta')
%! xlabel('iterazioni')
%! ylabel('valori assoluti')
%!demo
%! [x, its, delta] = bisezione (@sin,-pi/2,pi/2,[1e-6, 0], 30);
%! errore = abs (x);
%! semilogy(1:its,errore,'o',1:its,delta,'*')
%! legend('errore','delta')
%! xlabel('iterazioni')
%! ylabel('valori assoluti')
%!demo
%! [x, its, delta] = bisezione (@sin,-pi/2+1000*pi,pi/2+1000*pi,[1e-6, 0], 20);
%! errore = abs (1000*pi - x);
%! semilogy(1:its,errore,'o',1:its,delta,'*')
%! legend('errore','delta')
%! xlabel('iterazioni')
%! ylabel('valori assoluti')
%!demo
%! [x, its, delta] = bisezione (@sin,-pi/2+1000*pi,pi/2+1000*pi,[0, 1e-6], 20);
%! errore = abs (1000*pi - x);
%! semilogy(1:its,errore,'o',1:its,delta,'*')
%! legend('errore','delta')
%! xlabel('iterazioni')
%! ylabel('valori assoluti')
