%% Aplicatie care rezolva o ecuatie neliniara de forma x=g(x)
% Date de intrare:
     % Functia f(x)
     % Valoarea parametrului m obtinut din condtia |g(x0)|<1
     % Toleranta de calcul TOL
     % Aproximatia initiala x0
% Date de iesire:
     % Solutia ecuatiei x=g(x) - practic se afiseaza punctul fix
     % Numarul necesar de iteratii
     % Proba solutiei in ecuatia f(x)=0
     % Afisare grafic g(x) cu indicarea punctului fix
     % 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|
clear;
clc;    
%warning('off')
     
% Introducere date de intrare
% Functia f(x)
f=@(x) exp(x)-3*x^2;
%f=@(x) x^2*cos(x)-sqrt(2*x^3)-3;
% parametrul m 
m=-0.30471;

% Toleranta de calcul
TOL=1E-13;

% aproximatia initiala x0
x0=1;




%% Rezolvare 
% se defineste functia g(x) folosind parametrul m si functia f(x)
g=@(x) x-m*f(x);

%# Lansare proces iterativ
x1 = x0;
x2 = g(x1); 

%% plotare
%b=@(x) x; 

%fplot(g,[x0-1,x0+1], 'r','Linewidth',1); %graficul functie g(x) trasat in vecinatatea aproximatiei initiale
%hold on 
%fplot(b,[x0-1,x0+1],'b'); % prima bisectoare trasata in vecinatatea aproximatiei initiale
%ylim([x0-1,x0+1]);
%title('Grafic proces iterativ','fontsize', 14);
%xlabel('x','fontsize', 14);
%ylabel('g(x)','fontsize', 14);
%% sfarsit de plotare


nr_it = 0; %variabila care retine numarul de iteratii
Test_conv=abs(x2-x1); 
Iteratii(1,3)=Test_conv;


fprintf ( ' Nr. iteratie        x(i)                  g( x(i) )              |x(i) - x(i-1)| \n');     
fprintf('   \n');

while (Test_conv > TOL && nr_it<10000) % s-a limitat nr. maxim de iteratii la 10000
    
    %plot([x1 x1], [x1 x2], 'k--');
    %plot([x1 x2], [x2 x2], 'k--');
    nr_it = nr_it + 1;
    x1 = x2; % x_precedent
    x2 = g(x1); % x_curent
    Test_conv=abs(x2-x1); % test de conv= modul (x_curent-x_precedent)
    Iteratii(nr_it,1)=nr_it; 
    Iteratii(nr_it,2)=x2;
    Iteratii(nr_it+1,3)=Test_conv;
    fprintf(' %3.0f        %4.16f           %4.16f    %4.16f \n ', nr_it, x1 ,x2,Test_conv );
    
end

%plot(xplot, f(xplot),'b', x, (2:0.01:x),'k-', (x:-0.01:-10), x ,'k-', x, f(x),'ro','markersize', 10)
%plot(x2, g(x2),'ro','markersize', 10);
Iteratii(nr_it,1)=nr_it;
Iteratii(nr_it,2)=x2; % 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 ', x2);
  fprintf('\n Verificare in ecuatia x=g(x): %2.10f <--> %2.10f \n', x2, g(x2));
  return
end

if abs(x2)==inf
  fprintf('\n Solutia nu s-a putut calcula \n ');
  fprintf('\n Verificati datele de intrare \n');
  return
end
%if num2str(x2,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
fprintf('\n Solutia este: %2.16f \n Testul de convergenta a fost atins dupa %2i iteratii \n ', x1, nr_it);
%proba in ecuatia x=g(x)
fprintf('\n Proba solutiei in ecuatia x=g(x): %2.16f <--> %2.16f \n', x2, g(x2));
%proba in ecuatia f(x)=0
fprintf('\n Proba solutiei in ecuatie f(rad)=0: %2.16f  \n', f(x2));

%Se afiseaza si graficul functiei f(x) pentru a observa ca punctul fix al
    % ecuatiei x=g(x) este si radacina ecuatiei f(x)=0

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

