% Metoda bisekcji ________________________________________________

% Oblicza pierwiastek równania f(x)=0 metodą bisekcji
% (połowienia przedziału).
%
% Argumenty:
%     f: funkcja f(x).
%     a: początek przedziału.
%     b: koniec przedziału.
%     tol: dokładność (tolerancja).
%     iter_max: maksymalna liczba wykonywanych iteracji.
%     _________________________________________________________  


% Wczytanie argumentów _________________________________________
clc; clear
%f = @(x) x^2-exp(-x);          
%f = @(x) 2-exp(x);          
% a = 0;
% b = 1;

f = @(x) exp(x)-sin(x);          
a = -4;                         
b = -2; 

tol   = 1e-4;
iter_max = 30;   


    % Metoda _____________________________________________________

    fa = f(a);
    fb = f(b);

    if fa * fb > 0
        error('Błąd: Funkcja nie zmienia znaku na końcach przedziału.');
    end
    
    for iter = 1:iter_max
        r = (a + b) / 2;
        fr = f(r);

        deltaX = abs(b - a) / 2;

        Tab(iter,:) = [iter, a, fa, b, fb, r, fr, deltaX]; %dla prezentacji wyników.
                
        if deltaX <= tol && abs(fr) <= tol
            break;
        end

        if fa * fr > 0
            a = r;
            fa = fr;
        else
            b = r;
        end
    end

    if deltaX <= tol && abs(fr) <= tol
        disp('Metoda jest zbieżna.');
        disp('--------------------');
    else
        fprintf('x = %10.4g\t f(x) = %10.4g\n',r,fr);
        error('Uwaga: Metoda nie jest zbieżna. Wykonaj więcej iteracji.');
    end

    % Prezentacja wyników_________________________________________________
    fprintf(['%3s',repmat('%14s',[1,7]),'\n'],...
        'itr','a','f(a)','b','f(b)','r','f(r)', 'deltaX');
    div = ['---',repmat('--------------',[1,7]), '\n'];
    fprintf(div);
    fprintf(['%3.0f', repmat('%14.6g',[1,7]), '\n'],Tab.');
    fprintf(div);
    fprintf('x = %10.4g\t f(x) = %10.4g\n',r,fr);

