% Metoda bisekce 06

funkce='-2*sin(x) + sin(2*x) - 2*sin(3*x)/3';  % ucelova funkce        
DER='-2*cos(x) + 2*cos(2*x) - 2*cos(3*x)';     % derivace ucelove funkce
a=1; b=3;                          % krajni hodnoty intervalu I=[a,b] 
x=(a+b)/2;                  % aproximace bude vzdy stred intervalu [a,b]


fplot(funkce,[a,b],'r')             % graf funkce
line([2.356,2.356],[-3.185,-2.585]) % vyznaceni skutecneho minima
hold on;


i=0;                  % promenna urcena k pocitani iteraci 
chyba=1;              % "mira presnosti" - jak presny bude vysledek 

disp(' '); % vlozi prazdny radek na vystupni obrazovku

% vypis na obrazovku

disp(sprintf('Je zadana funkce f=%s a interval [a,b]=[%f,%f].',funkce,a,b));
disp(sprintf('Nasim cilem je najit minimum funkce f s presnosti 0,0001.'));

disp(' '); % vlozi prazdny radek na vystupni obrazovku


% zakladni WHILE-cyklus (cyklus jednotlivych kroku) konci ve chvili
% dosazeni pozadovane presnosti, ci pokud citac iteraci dosahne hodnoty 15

while ((chyba>0.0001) & (i<15))
    
   i=i+1;  % zvyseni poctu iteraci     
   
   
   DERx=eval(DER);      % hodnota derivace funkce f v bode x
     
   disp(sprintf('%d. krok: a=%f, b=%f, x=%f, df(x)=%f => ',i,a,b,x,DERx));
   
   if     (DERx<0)  a=x;   % b=b;
   elseif (DERx>0)  b=x;   % a=a;    
   else             i=17;  % mame minimum, konec while-cyklu
   end
          
       
   disp(sprintf('        => novy interval bude: [a,b]=[%f, %f]',a,b));
   
   
   xx=x;   % ulozeni stare hodnoty x (posledni aproximace)
  
   % vyznaceni aproximace minima
   line([x,x],[eval(funkce)-0.02*i,eval(funkce)+0.02*i])
     
       
   x=(a+b)/2;  % nova aproximace jako stred noveho intervalu
  
   chyba = (b-a)/2;     % chyba jako rozdil poslednich dvou aproximaci
  
  
   disp(' '); % vlozi prazdny radek na vystupni obrazovku     
 
 keyboard;
  
end % konec while-cyklu (cyklu kroku vypoctu, radky 29-74)


% Vypis informaci o vypocitanem reseni v zavislosti na tom,
% jestli jsme nahodou "netrefili" minimum presne

if (i==17)
      disp(sprintf('Presne reseni: x=%f.',x));
      disp(sprintf('Hodnota minima: f(x)=%f.' ,eval(funkce)));
      
else  
   
disp(sprintf('Priblizne reseni: x=%f s presnosti %f.',x,chyba));
disp(sprintf('Hodnota minima: f(x)=%f. ',eval(funkce)));
   
end