% Implementacion de Newton-Raphson
% poniendo los puntos sucesivos
% Input:
% f, fp (la derivada), x0, epsilon, N
function [z n] = newtonraphsonP(f, fp, x0, epsilon, N)
  n = 0;
  xn = x0;
  hold on;
  plot(x0,0,'*');
  yline(0);
  line([x0 x0],[0,f(x0)],'Color','b','LineStyle','--');
  % hay algo dibujado seguro
  % inicializamos z a NaN (i.e. por defecto, error)
  z = NaN; 
  % f y fp son funciones anonimas 
  fn = f(xn);
  while(abs(fn) >= epsilon && n <= N)
    n = n + 1;
    xp = xn;
    fn = f(xn); % lo memorizamos para no calcularlo otra vez
    % siguiente iteracion
    xn = xn - fn/fp(xn); % podria haber malos denominadores
    plot(xn,0,'*');
    line([xp xn xn],[f(xp) 0 f(xn)], 'Color','b','LineStyle','--');
  end
  z = xn;
  if(n == N)
    warning('No se ha alcanzado la tolerancia.');
    z = NaN;
  end
end
