function x = puleni(f,a,b,e)
% puleni - hledani korene rovnice f(x)=0 metodou puleni intervalu
% x = puleni(f,a,b,e)
% f ..... "ukazatel" na funkci (mela by byt spojita)
% a,b ... interval, kde hledame koren
% e ..... presnost (odchylka dvou po sobe jdoucich aproximaci korene)
% vystup:
% x ... nalezeny koren
% priklad volani:
%  f = @(x) x^2-x-2; % rovnice ve tvaru anonymni funkce
%  x = puleni(f,1,4,1e-5)
% x = puleni(f,-3,0,1e-5)
% ezplot('x^2-x-2')
%overeni vysledku v Command window f(2), resp. feval(f,2)
% f = @(x) sin(3*x)./x;  % reseni nejake rovnice
% x=-pi:pi/50:pi; plot(x,f(x),'k')
% hold on, plot(x,x*0,'g'),hold off
% x1 = puleni(f,1,2,1e-5)
% x2 = puleni(f,1.5,2,1e-5)
% x3 = puleni(f,2.5,3.5,1e-5)
% h = @(x) x.^3+x.^2-5*x+3; % reseni jine rovnice
% x=-pi:pi/50:pi;(x,h(x))
% hold on, plot(x,x*0,'g')
% x1 = puleni(h,1,2,1e-1)
% x2 = puleni(h,0,2,1e-1)
% x3 = puleni(h,-4,-3,1e-1)

if ~isa(f,'function_handle') % je 'f' ukazatel na funkci???
    error('Prvni vstup musi byt "ukazatel" na funkci!')
end
if f(a)*f(b)>0 % je splnena podminka pro existenci korene?
    error('Zadana funkce nemeni na intervalu znamenko!')
end
if e<=0 || e>=1
    error('Zadejte presnost mezi 0 a 1 (4. vstup)!')
end
% hledame koren:
if f(a)==0 % co kdyby?
    x = a;
    return;
end
if f(b)==0 % co kdyby?
    x = b;
    return;
end
% metoda puleni intervalu:
odchylka = 1; % priprava
while odchylka>e
    x = (a+b)/2; % pulka intervalu
    odchylka = abs(x-a);
    y = f(x); % at se nemusi vycislovat vicekrat
    if y==0 % co kdyby?
        return;
    end
    if y*f(a)>0
        a = x; % zahodit krajni bod intervalu
    else
        b = x; % zahodit krajni bod intervalu
    end
end
