function x=newton2(f)

% Algoritmo de Newton para la determinacion de ceros de funciones.
%
% 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):
%
%        - x0 = punto inicial de la iteracion.
%              
%        - M = sup |f''|, m = inf |f'|, 
%          E= estimacion inicial del error (debe ser M*E/(2m) < 1).
%
%       - "error"= error absoluto requerido para la solucion. 
%                Establecemos como precision maxima 10^(-15),
%                y un numero maximo de iteraciones igual a 50.
% 
%  Salida:  x = raiz aproximada de f, segun los criterios 
%               de terminacion del programa.
%
%   Comandos de Matlab utilizados
%
%  1.- Para el display 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, evaluar y derivar funciones: 
%
%  eval(f)     = ejecuta la operacion de MatLab dada por la "funcion" f
%  sym('x')    = define 'x' como simbolo (comando necesario para definir
%                posteriormente funciones de x; por ejemplo, f=x^2-sin(x) ).    
%  diff(f)     = comando para derivar una funcion f
%  diff(f,2)     = comando para derivar una funcion f



disp(' ');
disp('Calculo de ceros mediante el Metodo de Newton');
disp(' ');

x0 = input('Introduce el punto inicial x0: ');

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



M= input('Introduce una cota para sup |f´´| : ' );
m= input('Introduce una cota para inf |f´|: ' );
E= input('Introduce una cota para el error inicial E: ');

disp(' ');

format long

x=x0;
for i=1:50  
 x=x-eval(f)/eval(df(f,x));
 E=E^2*M/(2*m);
 disp(['x' int2str(i) ' = ' mat2str(x) '     error abs= ' mat2str(E)]);
        if abs(x-x0)< 10^(-15)
            disp('Se ha alcanzado una precision de 15 digitos')
            return
        end
        if E<error
            disp('Se ha alcanzado la precision requerida')
            return
        end
    x0=x;
end
disp('Tras 50 iteraciones no podemos garantizar la precision deseada ');

% Comando para derivada simbolica.
function der=df(f,x)
x=sym('x');
der=diff(f);
