function XX = bisektdemo(f, int, tol)
% bisektdemo - bisektionsalgoritmen för den skalära ekvationen f(x) = 0
% 
%   Syntax: 
%           XX = bisektdemo(f, int, tol)
%   Inargument: 
%           f - funktionshandtag till en funktionsfil
%           int - 1x2-matris som specificerar ett intervall int = [a,b]
%           tol - en tolerans 
%   Utargument: 
%           XX - matris med två kolonner innehållande vänster och höger 
%           ändpunkter av de successivt tudelade intervallen
%   Beskrivning:
%           Programmet bisektdemo använder bisektionsalgoritmen för att
%           beräkna en approximativ lösning till den skalära ekvationen
%           f(x) = 0 i intervallet int = [a,b].  Funktionsfilen som f 
%           pekar på måste innehålla funktionen y = f(x). Funktionsvärdena
%           f(a) och f(b) måste ha olika tecken.  Programmet returnerar
%           en tom matris XX = [] som utargument om f(a) och f(b) har
%           samma tecken.  
%   Exempel: 
%          XX = bisektdemo(@sin,[1,4],1e-7)  beräknar pi med 6 decimaler
%
%----------------------------------------------------------------------

i=1;           % räknare innehållande aktuellt intervallnummer
x(i)=int(1);   % startintervallets vänstra ändpunkt
               %   x skall bli en vektor innehållande vänster ändpunkter
X(i)=int(2);   % startintervallets högra ändpunkt
               %   X skall bli en vektor innehållande höger ändpunkter
               % notera att i MATLAB startar indexeringen av en vektor med
               %   ett, så startintervallet [x_0,X_0] blir [x(1),X(1)]

% Visa ett felmeddelande, avbryt och returnera XX = [] om f(a) och f(b)
% har samma tecken.

if f(x(i))*f(X(i))>0
  disp('Bisektionsalgoritmen misslyckades: f(a), f(b) har samma tecken.')
  XX=[];
  return
end

while X(i)-x(i)>tol   % fortsätt så länge som aktuellt intervall är längre
                      % än angiven tolerans

  xx = (x(i)+X(i))/2;  % beräkna mittpunkten xx på aktuellt intervall
  fx = f(xx);          % beräkna värdet på f i mittpunkten                    
                      
  if fx==0              % xx är en lösning
    x(i+1)=xx;          %    flytta vänster och höger ändpunkt      
    X(i+1)=xx;          %    while-loopen kommer att avbrytas nästa gång
  elseif f(x(i))*fx<0   % lösning i vänster hälft av aktuellt intervall 
    x(i+1)=x(i);        %    behåll vänster ändpunkt       
    X(i+1)=xx;          %    flytta höger ändpunkt
  else                  % lösning i höger hälft av aktuellt intervall 
    X(i+1)=X(i);        %    behåll höger ändpunkt        
    x(i+1)=xx;          %    flytta vänster ändpunkt
  end
  
  i=i+1;                % öka räknare med ett
  
end 

x=x';                   % transponera x till en kolonnvektor
X=X';                   % transponera X till en kolonnvektor
XX=[x,X];               % tabell med två kolonner returneras
