%                     Lecture 14
%
%                  Variable Anzahl von Eingabe-, Ausgabegrößen
%


% nargin, bzw. nargout gibt die Anzahl der deklarierten Eingabegrößen bzw.
% der gewünschten Ausgabegrößen
%

% Beispiel: Newtonverfahren

function [x,X] = newton(fun,x,n,tol)
% Newton's method to calculate the root of a  differentiable function
% usage: X = newton(fun,x,n)
% input: notwendig:
%        fun ... character string with filename evaluating f and df
%        x ... initial guesss for root
%        optional:
%        n ... maximumnumber of iterations
%        tol.. terminates iteration
%output: x ... approximation to root
%        X ... iteration history (optional)
% Note: fun has to return  f and its derivative
%       [f,df] = fun(x);

n_in = nargin;
if n_in < 4, tol=1e-10;end
if n_in < 3, maxiter=n; end
if n_in < 2, error('not enough input arguments supplied'),end

n_out = nargout;
if n_out == 2
X=x;
end

term = inf;
iter = 1;

while term > tol & iter <= maxiter
   %  [y1,y2] = fun(x); 
   [y1,y2] = feval(fun,x);
   if abs(y2) < 1e-14
      disp('derivative close to zero')
      return
   end
   xold = x;
   x= x- y1/y2;
   if n_out == 2
   X=[X;x];
   end
   term = abs(x-xold);
   iter=iter+1;
end
if iter >= maxiter
    disp('keine Konvergenz')
end

return
