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; % anonymni funkce
%  x = puleni(f,1,4,1e-5)
%overeni vysledku v Command window f(x)
%pøíklady dalšího volání
% f = @(x) sin(1/x); % anonymni funkce
% puleni(f,0.1,1,1e-16)
% f(ans) % nebo sin(1/ans) - overeni vysledku
% %
% p1 = @(x) 2*x^2-5*x-3;  % anonymni funkce
% x = puleni(p1,1,4,1e-7)
% p1(x) % overeni vysledku
% x = puleni(p1,1,4,1e-16) % vyssi presnost
% p1(x) % overeni vysledku
% %
% p2 = @(x) x^4+4*x^3-139*x^2-706*x+840;
% x = puleni(p2,-15,-9,1e-10)
% p2(x) % overeni prvniho vysledku
% p2(-10) % je -10 presny koren???
% x2 = puleni(p2,10,13,1e-10)
% p2(x2) % overeni druheho vysledku

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
