function [n,X]=iteration_regula_falsi(xm1,x0,nmax,epsilon,fcn)


%	iteration_regula_falsi : calcul d'une racine par regula falsi
%
% *********************************************************
%
%	[n,X]=iteration_regula_falsi(x0,xm1,nmax,epsilon,fcn) renvoie
%  les itérés de la méthode de la la fausse position
%
%	variables d'entrées : 
%		* nmax : nombre maximal d'itérations
%		* xm1 et x0 : les deux premiers termes (x_{-1} et x_0)
%     * epsilon : précision souhaitée
%     * fcn est une chaîne de caractère représentant la fonction 
%      (de type inline, builtin ou par fichier M-file);
%
%	variables de sortie :
%     * n est l'indice correspondant à x_n avec f(x_n)=0 ou |x_n-x_{n-1}|<epsilon 
%                                         ou n>=nmax
%     * X est une vecteur qui contient les valeurs de x_0 à x_n
%
% 
% 
% ************ Fonctions auxiliaires utilisées ************
%
%       aucune
%
% *********************************************************
%



% Contrôles d'entrée
qs=exist(fcn);
if (feval(fcn,x0)*feval(fcn,xm1)>0)
   error('il faut f(x0)f(x_(-1))<0');
end
if (qs~=2) & (qs~=5) & (qs~=1)
   error('fcn doit être le nom d''une fonction (built-in, M-file ou inline)');
end

% corps d'algorithme
p=-1;
n=0;
test=(feval(fcn,x0)~=0);
x=x0;
xp=xm1;
fxp=feval(fcn,xm1);
fx=feval(fcn,x);
xmm1=xm1;
X=x0;
while(test)
   xnp1=x-((x-xp)/(fx-fxp))*fx;
   fxnp1=feval(fcn,xnp1);
   test=~((fxnp1==0)|(n>=nmax)|(abs(x-xmm1)<=epsilon));
   xmm1=x;
   x=xnp1;
   fx=feval(fcn,x);
   X=[X x];
   if (test)
      if (feval(fcn,xmm1)*fx<0) 
         p=n;
         xp=xmm1;
         fxp=feval(fcn,xp);
      end
   end
   n=n+1;
end   
if (n>=nmax)
   disp('attention, n>nmax');
end


