function [x,err,xx] = newton(f,x0,TolX,MaxIter)

%function [x,err,xx] = bisct(f,a,b,TolX,MaxIter)
% resolve  f(x) = 0 usando o metodo de newton
% input : f, x0 = funcao e chute inicial
%          TolX = tolerancia, ou seja, TolX >|x(k) - x(k-1)|
%       MaxIter = numero maximo de iteracoes
%output :     x = solucao
%           err = ultimo de |x(k) - x(k-1)|
%            xx = historico de x


if nargin < 4, MaxIter = 100; end   %Nao usar na primeira vez
if nargin < 3, TolX = 1.0e-6; end   %Nao usar na primeira vez

dx     = 1e-4;
flag   = 0;
TolFun = eps;
k      = 1;
xx(k) = x0;

%metodo de newton
while (flag == 0)
    k = k+1;
    fun   = feval(f,x0);
    dfun  = (feval(f,x0+dx)-fun)/dx;
    xx(k) = x0 - fun/dfun;
    fx    = feval(f,xx(k));
    err   = abs(xx(k)-x0); 
    x0    = xx(k);
    if (err < TolX | abs(fx) < TolFun | k == MaxIter)
        flag = 1;
        if k == MaxIter
            disp('Numero maximo de iteracoes foi excedido!!!!')
        end
    end
end
x = xx(k);

% bloco para plotar o resultado (pode ser omitido)%
hold on                                           %
xe = min(xx):(max(xx)-min(xx))/100:max(xx)   ;     %
ye = feval(f,xe)  ;                                % 
yy = feval(f,xx)   ;                               %
plot(xx, yy,'r-.o',xe, ye,'b-')                   %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
