function [a,b] = min_puleni(fce,a,b,e)
% min_puleni - hledani minima funkce na danem intervalu metodou puleni int.
% [a,b] = min_puleni(fce,a,b,e)
% fce ... handle funkce, kterou minimalizujeme
% a,b ... zacatek a konec intervalu, kde hledame minimum
% e ..... pozadovana presnost (delka konecneho intervalu), 0<e<1
% --- vystupy:
% a,b ..... zacatek a konec upresneneho intervalu, kde lezi minimum

if ~isa(fce,'function_handle')
    error('1. vstup musi byt handle funkce!')
end
if a>=b
    error('Zacatek intervalu musi byt mensi nez konec (2. a 3. vstup)!')
end
if e<=0 || e>=1
    error('Delka intervalu musi byt kladne cislo mensi nez 1 (4. vstup)!')
end

% metoda puleni intervalu pro hledani minima funkce:
xm = (a+b)/2;
L = b-a;

while abs(L)>=e % dokud je interval moc dlouhy
    fxm = fce(xm); % pouziti handle minimalizovane funkce
    x1 = a + L/4;
    x2 = b - L/4;
    fx1 = fce(x1);
    fx2 = fce(x2);
    if fx1<=fxm % krok C (a)
        b = xm;
        xm = x1;
    else % krok C (b)
        if fx2<=fxm % krok D (a)
            a = xm;
            xm = x2;
        else % krok D (b)
            a = x1;
            b = x2;
        end
    end
    L = b-a;
end