function [x,it] = newton(fun,dfun,ddfun,x0,tol)

% [x,it] = newton(fun,dfun,ddfun,x0,tol)
%
% funkce nalezne minimum funkce f(x)
% Newtonovou metodou (modifikovana verze pro zajisteni globalni konvergence)
%
% x   ... minimum
% it  ... pocet iteraci
%
% fun ... f(x) zadana ve stringu 
% dfun .. derivace f(x) zadana ve stringu 
% ddfun . druha derivace f(x) zadana ve stringu 
% x0  ... pocatecni aproximace
% tol ... pozadovana absolutni presnost

c=1; eps=1e-8;

%x0
x=x0;


fx=feval(fun,x);



a=feval(ddfun,x);
if a<=eps
   a=c;
end;

xn = x - feval(dfun,x)/a;
fxn=feval(fun,xn);

while fxn>fx
   xn=(xn+x)/2;
   fxn=feval(fun,xn);
end

it = 1;
plot([x xn],[fx fxn],'-g');
plot(xn,fxn,'+r');
text(xn,fxn+it/10,num2str(it),'fontsize',10);   


while norm(xn-x) >= tol 
   
   x=xn; fx=fxn;
   
   
   a=feval(ddfun,x);
   
   if a<=eps
      a=c;
   end;
   
   xn = x - feval(dfun,x)/a;
   fxn=feval(fun,xn);

   
           % nez bude pokracovat, pocka 1 sekundu
            t = timer('StartDelay', 1 ,'TimerFcn','disp(''cekam'')');
            start(t);
            wait(t);
            delete(t);
   
   while fxn>fx
      xn=(xn+x)/2;
      fxn=feval(fun,xn);
        plot(xn,fxn,'+r');
        disp(['jsem v procedure' num2str(fxn) ',' num2str(fx)])
   end
  
   it = it + 1;
   
   plot([x xn],[fx fxn],'-g'); 
   plot(xn,fxn,'+r');
   text(xn,fxn+it/10,num2str(it),'fontsize',10);  
end

x = xn;
text(xn-pi/4,fxn+it/10,['Iter.: ' num2str(it) ' ,xmin= ' num2str(x,3) ' ,fmin= ' num2str(sin(x))],'fontsize',10,'BackgroundColor',[1 1 .6]);  
% end