function x=biseccion(f)
% Algoritmo para la determinacion de ceros de funciones por el 
%metodo de la biseccion.
%
% Entrada inicial:  f = funcion a la cual le buscamos un cero, 
%                  introducida como cadena de caracteres (entre comas ' ...').
%
% Entradas posteriores (a insertar por el usuario):
%
%        - a , b = extremos del intervalo en que se encuentra el cero.
%         Si f(a)*f(b)>0, el programa da un mensaje de error y se detiene.
%
%       - "error" = error absoluto requerido para la solucion.
%                  (Matlab tiene una precision maxima de 10^(-15) )
%       
%       - Establecemos en n=50 el numero maximo de iteraciones.
%              
% 
%  Salida:     - x(i) son las sucesivas aproximaciones de la raiz buscada.
%
%  Comandos de Matlab utilizados:
%
%  1.- En displays inicial y final: 
%
%  disp('...') = display de una cadena de caracteres
%  int2str(n)  = convierte el entero n en una cadena de caracteres
%  mat2str(x)  = convierte la "matriz" x en una cadena de caracteres
%  format long = escribe los resultados numericos en formato largo (15 decimales) 
%  input       = permite que el usuario introduzca datos numericos
%
%  2.- Para definir y evaluar funciones: 
%
%  eval(f)     = ejecuta la operacion de MatLab dada por la "funcion" f en el
%                valor numerico "x"
%
%

disp(' ');
disp('Calculo de ceros mediante el Metodo de la Biseccion');
disp(' ');
disp(['Funcion a la que se busca el cero:  F(x) = ' f ]); 
disp(' ');

a = input('Introduce el extremo izquierdo del intervalo: ');

b = input('Introduce el extremo derecho del intervalo: ');

error= input('Introduce el error requerido para la solucion: ');


disp(' ');
disp(['Intervalo especificado: [' mat2str(a) ',' mat2str(b) ']']);
disp(['Error especificado :' mat2str(error)]);
disp(' ');

x=a;fa=eval(f);
x=b;fb=eval(f);
if fa*fb>0
    disp('La funcion no cambia de signo en el intervalo especificado');
    return
end

for i=1:50    
    x=(a+b)/2;
    fx=eval(f);
    errabs=abs(x-a);
    
    if fx==0 
        return
    end
    
    
  format long  
  disp(['x' int2str(i) ' = ' mat2str(x) ' error abs= ' mat2str(errabs)]);
     
    if errabs<error
             return
          end
    if fx*fa<0
        b=x;
        fb=fx;
    else
        a=x;
        fa=fx;
    end
end
disp('La solucion no tiene la precision deseada tras 50 iteraciones ');



