%% Metoda bisectiei pentru rezolvarea unei ecuatii neliniare de forma f(x)=0
% Date de intrare:
     % Functia f(x)
     % Toleranta de calcul TOL
     % Aproximatiile initiale a și b
% Date de iesire:
     % Solutia ecuatiei f(x)=0 
     % Numarul necesar de iteratii
     % Proba solutiei in ecuatia f(x)=0
     % Afisare grafic f(x) 
     % Pentru vizualizare rezultate in fiecare iteratie se acceseaza
          % variabila iteratii structurata astfel:
              % pe prima coloana - numarul iteratiei
              % pe a doua coloana - valoarea necunoscutei x 
              % testul de convergenta |x_curent-x_precedent|
clearvars
clc   
%warning('off')
     
% Introducere date de intrare
% Functia f(x)
f=@(x) exp(x)-3*x^2;

% Toleranta de calcul
TOL=1E-4;

% aproximatile initiale a si b
a=0;
b=1;

%% Rezolvare 

if f(a)*f(b)>0 
    disp('Intervalul [a,b] nu contine nicio radacina')
else
%# Lansare proces iterativ

% fplot(f,[a-1,b+1], 'r','Linewidth',1); %graficul functie f(x) trasat in vecinatatea aproximatiei initiale
% ylim([a-1,b+1]);
% title('Grafic proces iterativ','fontsize', 14);
% xlabel('x','fontsize', 14);
% ylabel('f(x)','fontsize', 14);

nr_it = 0; %variabila care retine numarul de iteratii
Test_conv=abs(a-b);

while (Test_conv > TOL && nr_it<1000) % s-a limitat nr. maxim de iteratii la 10000
    
%     plot([a a], [a b], 'k--');
%     plot([a b], [b b], 'k--');
   nr_it = nr_it + 1; 
   x = (a + b)/2;
   if f(a)*f(x)<0 
       b = x;
       Test_conv=abs(x-a); % test de conv= modul (x_curent-x_precedent)
   else
       a = x;
       Test_conv=abs(x-b); % test de conv= modul (x_curent-x_precedent)
   end
   
   Iteratii(nr_it,1)=nr_it;
   Iteratii(nr_it,2)=x;
   
   Iteratii(nr_it,3)=Test_conv;
end
%plot(x, f(x),'ro','markersize', 10);
Iteratii(nr_it,1)=nr_it;
Iteratii(nr_it,2)=x; % solutia ecuatiei



%% Afisare rezultate
if nr_it==1000
  fprintf('\n Solutia nu s-a putut calcula dupa %2i iteratii \n ', nr_it);
  fprintf('\n Valoarea calculata in ultima iteratie este: %2.10f \n ', x);
  fprintf('\n Verificare in ecuatia f(x)=0: %2.10f <--> %2.10f \n', x, f(x));
  return
end

if abs(x)==inf
  fprintf('\n Solutia nu s-a putut calcula \n ');
  fprintf('\n Verificati datele de intrare \n');
  return
end
%if num2str(x,2)== 'NaN'
%  fprintf('\n Solutia nu s-a putut calcula \n ');
%  fprintf('\n Verificati datele de intrare \n');
%  return
%end
%solutia si numarul de iteratii


%% Se afiseaza graficul functiei f(x)
%figure
%fplot(f,[x-3,x+3], 'g','Linewidth',1);
%hold on;
%ylim([-2,2]);
%plot([x-3,x+3],[0,0], 'k') % linie orizontala prin y=0;
%plot (x, f(x),'ro','markersize', 10);
%title('Grafic functie f(x)','fontsize', 14);
%xlabel('x','fontsize', 14);
%ylabel('f(x)','fontsize', 14);
%%

[n1,~]=size(Iteratii);
fprintf ( ' Nr. iteratie     x(i)                |x(i) - x(i-1)| \n');     
%disp(' ');
fprintf('   \n');
for i1=1:n1
  fprintf(' %3.0f        %4.16f      %4.16f \n ', Iteratii(i1,1),Iteratii(i1,2),Iteratii(i1,3)  );
%Iteratii
end
end

fprintf('\n Solutia este: %2.10f \n Testul de convergenta a fost atins dupa %2i iteratii \n ', x, nr_it);
%proba in ecuatia f(x)=0
fprintf('\n Proba solutiei in ecuatia f(solutie)=%2.10f  \n', f(x));
disp(' ');