function [ xr, x ]= bisezione_2(fname, a, b, eps_f, max_i)
% 
% Sintassi [xr, x] = bisezione_2(fname,a,b,eps_f, max_i)
%
%  IN:  
%    fname:   stringa che definisce la funzione o 
%             nome della funzione f(x)
%             La compatibilita' con Octave e' garantita se la funzione
%             viene inserita come inline function;
%             es: fname = inline('sin(x) - 0.7')
%             per cercare le radici dell'equazione
%             sen(x) = 0.7
%      a,b:   definiscono l'intervallo [a,b] di ricerca, f(a)f(b) <= 0
%    eps_f:   tolleranza prefissata sulla radice 
%    max_i:   massimo numero di iterazioni nel ciclo di while
%
%  OUT:
%        x:   successione x(k) convergente alla radice x* 
%             t.c. f(x*)=0
%       xr:   approssimazione finale della radice
%

% pone il valore di eps_f al default 0 
% se non viene immesso dall'utente
if nargin==3 
    eps_f = 0; 
    max_i = 100;
end
eps_f = eps_f + eps*max(abs(a),abs(b));
 
% questo garantisce che, se fname e' una stringa, sia convertito
% in una inline function
f = fcnchk(fname);

x(1)=a; x(2)=b;
fa = feval(f,a); 
fb = feval(f,b);

% se in a o in b la funzione vale pressoche' 0, basta cosi'
if abs(fa) < eps_f
    xr = a; 
    return 
end
if abs(fb) < eps_f 
    xr = b; 
    return 
end

% controllo del segno agli estremi
if fa*fb > 0
   disp('L''intervallo iniziale non e'' accettabile')
   xr = NaN;
   x  = NaN;
   return
end


fkx = fb;
k = 3;
while (k<max_i) & (abs(fkx)>eps_f)
    
    x(k) = (a+b)/2;
    fkx = feval(f,x(k));
    if sign(fkx) == sign(fa)
        a  = x(k);
        fa = fkx;
    else
        b  = x(k);
        fb = fkx;
    end
    k = k+1;
    
end

xr = x(end);
