function x = Newton(jmf,a,b,x0,nmax,epsx,epsf)
% Newton - obecne reseni rovnice f(x)=0 Newtonovou metodou
%          (derivace se pocita numericky)
% [x]=Newton(jmf,a,b,x0,nmax,epsx,epsf);
% jmf ... funkce f(x) jako handle
% a ... dolni mez definicniho oboru f(x)
% b ... horni mez definicniho oboru f(x)
% x0 ... pocatecni odhad reseni
% nmax ... maximalni pocet vycisleni funkce f(x)
% epsx ... postacujici sirka intervalu [a;b]
% epsy ... postacujici hodnota funkce f(x)
% x ... nalezene reseni rovnice f(x)=0

if a>=b 	% zakladni kontrola
   error('Chybne zadany interval!')
end
if x0>b || x0<a
    error('Chybne zadany poc. odhad! (Nelezi v danem intervalu.)')
end
if epsx>=1
    error('Zadejte mensi cislo (napr. 0.001) jako presnost ''epsx''!')
end
for k=1:nmax 	% az do vycerpani trpelivosti
   if x0<a | x0>b 	% mimo definicni obor?
      error(['n=' num2str(i) ' Nova aproximace korene je mimo zadany interval!'])
   end
   f=feval(jmf,x0); % vycislit f(x) v novem bode
   if abs(f)<=epsf 	% nejsme uz blizko nuly?
      x=x0; % hura!!!
      return;
   end
   d=(feval(jmf,x0+epsx)-f)/epsx; % priblizna hodnota derivace v novem bode
   if d==0 	% nutny dotaz!!!
      error(['n=' num2str(i) ' Derivace je nulova!'])
   end
   x=x0-f/d; 	% tajemstvi Newtonovy metody
   if abs(x-x0)<=epsx 	% proc se nezeptat?
      return;
   end
   x0=x; 	% skatulata, hejbejte se
end