%
% function [x0,niter]=newton(fun,fder,x0,nmax,tolx)
%
% Esta rutina calcula por medio del metodo de Newton
% el cero de una funcion
%
% * Input 
%    fun    -  Nombre del m-file donde define la funcion
%              STRING
%    fder   -  Nombre del m-file donde define la derivada de la funcion
%              STRING
%    x0     -  Punto inicial
%              REAL
%    nmax   -  Numero maximo de iteraciones permitidas
%              INTEGER
%               DEFAULT (nmax=100)
%    tolx   -  Toleracia en x a satisfacer
%              REAL
%              DEFAULT (tolx = 0.0001);
%
% * Output
%
%     x0    - Aproximacion lograda con el metodo, bajo el criterio de paro.
%             REAL
%     niter - Numero de iteraciones logradas para alcanzar esa aproximacion
%             INTEGER
%
% Copyright(C) Geometria Analitica II-2006
%               Facultad de Ciencias - UNAM
%
function [x0,niter,iflag]=newton(fun,fder,x0,nmax,tolx)

%
% Asignamos valores predeterminados para nmax y tolx
% cuando estos no son introducidos por el usuario
%
  if (nargin<5),
     tolx = 0.0001;
  end
  if (nargin<4),
     nmax=100;
  end
%
% * Inicializamos variables
%
niter=1; errorx = 1;
while (niter<nmax & errorx > tolx)
    
    x1 = x0 - feval(fun,x0)/feval(fder,x0);  % paso de Newton
    niter = niter + 1;                       % siguiente iteracion
    errorx = abs(x1 - x0)/abs(x0+eps);       % calculamos criterio de paro
    x0 = x1;
 end
 iflag=9;
 if (errorx < tolx), iflag=5; end

niter = niter-1;                             % numero de pasos realizados

%
% * Last Card
%