% biparticion(funcion, a, b, tol, niter)
function [solucion, iter] = biparticion(f_name, a, b, tol, niter)

%       funcion: función empleada
%       a: extremo inferior del intervalo
%       b: extremo superior del intervalo
%       tol : error 
%       niter: Máximo número de iteraciones permitido
fprintf( 'Esquema Bipartición\n\n' );

fprintf( ' Iteracion  a           c           bs            f(a)   ');
fprintf( '     f(c)        f(b)\n' );
it = 0;
fa = f_name(a); fb = f_name(b);
if ( fa*fb > 0 )  
     fprintf( '\n\n No se cumplen las condiciones del Teorema de Bolzano porque   f(a)f(b) > 0 \n' );
     fprintf( '\n Cambia a o b y comienza de nuevo.\n' );
else   
   while 1
      it = it + 1;
      c = (a + b)/2;  fc = f_name(c);
      fprintf('%3.0f %10.6f, %10.6f', it, a, c );
      fprintf('%10.6f,  %10.6f, %10.6f, %10.6f\n', b, fa, fc, fb);
      if ( abs(b-a)<=tol )
         fprintf( '  Precisión alcanzada. \n' );break
      end
      if ( it>niter )
        fprintf( 'Número de iteraciones superado.\n' ); break
      end  
      if( fa*fc <= 0 )       b = c;    fb = fc;
      else                   a = c;    fa = fc;
      end
   end
   fprintf('Final result: Root = %12.6f \n', c );
   solucion=c;
   iter = it;
end
endfunction