function x = newton(f,x0,tol)
% Newtons metod för den skalära ekvationen f(x)=0
% 
%   Syntax: 
%           x = newton(f,x0,tol)
%   Inargument: 
%           f - funktionshandtag till en funktionsfil
%               som returnerar ett reellt tal y=f(x) 
%           x0 - ett reellt tal, startapproximation
%           tol - ett positivt reellt tal, en tolerans
%   Utargument: 
%           x - ett reellt tal, en approximativ lösning
%   Beskrivning:
%           Programmet newton använder Newtons metod för att beräkna en
%           approximativ lösning till den skalära ekvationen f(x)=0.
%           Funktionsfilen som f pekar på måste returnera ett tal y=f(x).  
%           Derivatan f'(x) beräknas med subfunktionen derivata. 
%           Om startapproximationen x0 ligger tillräckligt nära en rot
%           x_exakt, beräknar programmet en approximativ lösning x
%           med felet |x-x_exakt| < tol.  
%   Exempel: 
%          x = newton(@sin, 3, 1e-7) beräknar pi med 7 decimaler
%
%          Om m-filen funk1.m innehåller
%            function y = funk1(x)
%            y=x.^2-2;
%
%          kommer kommandot
%            >> x = newton(@funk1, 3, 1e-7) 
%          att beräkna roten ur 2. 
%----------------------------------------------------------------------

x = x0;                      % startapproximation
h = tol + 1;                 % för att komma in i while-loopen
                             %   första gången

while abs(h)>tol
   a = derivata(f,x);        % beräkna derivatan a=f'(x)
   b = -f(x);                % beräkna residualen b=-f(x)
   h = b/a;                  % beräkna steget (ändringen)
   x = x + h;                % uppdatera 
end

%--subfunction--------------------------------------------------------

function y=derivata(f,x)
h=1e-5;
y=(f(x+h)-f(x-h))/(2*h);
