% Newtonova metoda 06

funkce='-2*sin(x) + sin(2*x) - 2*sin(3*x)/3';     % ucelova funkce        
DER1='-2*cos(x) + 2*cos(2*x) - 2*cos(3*x)';       % 1. derivace ucelove funkce
DER2='2*sin(x) - 4*sin(2*x) + 6*sin(3*x)';        % 2. derivace ucelove funkce
a=1; b=3;                            % krajni hodnoty intervalu I=[a,b] 
x=(a+b)/2;                  % 1. aproximace bude 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;

fx1=eval(funkce)-0.04;
fx2=eval(funkce)+0.04;
line([x,x],[fx1,fx2])    % vyznaceni aproximace minima

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(DER1);      % hodnota 1. derivace funkce f v bode x
   DERxx=eval(DER2);     % hodnota 2. derivace funkce f v bode x
     
   disp(sprintf('%d. krok: a=%f, b=%f, x=%f, df(x)=%f, ddf(x)=%f',i,a,b,x,DERx,DERxx));         
      
   xx=x;   % ulozeni stare hodnoty x (posledni aproximace)   

   x=xx - (DERx/DERxx); 
  
   chyba = abs(xx-x);     % chyba jako rozdil poslednich dvou aproximaci
   
   disp(sprintf('        => nova aproximace: x=%f, chyba=%f',x,chyba));     
  
  
   disp(' '); % vlozi prazdny radek na vystupni obrazovku
  
   fx1=eval(funkce)-0.04*(i+1);
   fx2=eval(funkce)+0.04*(i+1);
   line([x,x],[fx1,fx2])    % vyznaceni aproximace minima
 
   if (chyba==0) i=17;       % "trefili" jsme presne minimum
   end    
  keyboard;
end % konec while-cyklu (cyklu kroku vypoctu, radky 34-62)


% 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