function xstar = my_newton(fhandle, fphandle, x0,tol)
% aproximeaza radacina unei ecuatii neliniare f(x) = 0 
% folosind metoda lui Newton. 
%
% Input:
%   - fhandle, fphandle: pointer catre functie si derivata
%   - x0               : punctul initial
%   - tol              : valoare folosita in oprirea procesului iterativ,
%                        care se va opri in momentul in care f(xstar) <= tol 
% Output:
%   - xstar            : valoarea numerica (aproximativa) a radacinii     
% 
% CTI 2021


xold      = x0; 
xstar     = xold;
fold      = feval(fhandle, xold);
iter      = 0;

% constanta folosita pentru a limita nr de iteratii
MaxIter   = 20;

% constant folosita pentru printout. Daca displayOn==1 => printout (vezi mai jos)
displayOn = 1;


% constant keepIter este folosita pentru plot (vezi ultima parte a codului)
keepIter  = 0;
xiter     = [xold];

% loop-ul principal este un while-loop si se executa atata timp cat functia
% f(x) este in valoare absoluta > tol

while abs(fold) > tol
  fpold = feval(fphandle, xold);
  xnew  = xold- fold/fpold;
  iter  = iter+1;
  if displayOn
    % !!! aici trebuie completat cu fprintf-ul corespunzator cerintelor
  end;
  xold  = xnew;
  if keepIter
    xiter = [xiter xold]; 
  end;
  fold  = feval(fhandle, xold);
  if iter > MaxIter
    fprintf('Nr maxim de iteratii a fost atins\n');
    fprintf('Returnam punctul initial x0\n');
    break;
  end;
end;

xstar = xold;

% se genereaza vectorul ce contine iteratiile, in cazul in care keepIter = 1
if keepIter
  xmin = min(xiter)-0.5;
  xmax = max(xiter)+0.5;
  x = [xmin:0.01:xmax];
  y = feval(fhandle,x);
  plot(x,y);
  grid on;
  for i=1:length(xiter)
      hold on; 
      plot(xiter(i),0,'*r');
      pause(0.5);
  end;  
end;
