function [ait,deb_acc]=aitken(x0,exp_g,eps_seuil,n_max,nul_seuil)
% produit  les accélérés d'Aitken d'une suite du point fixe et l'indice de début d'accélération.
% La convergence de la suite initiale est supposée connue,
% ainsi que celle des accélérés.
%
% variables d'entrée
% x0 est la valeur initiale,
% exp_g le nom de la fonction d'itération passé sous la forme 'g(x)'
% eps_seuil désigne comme annoncé dans l'ouvrage le seuil de variation
% relative des itérés qui déclenche le processus d'accélération.
% n_max est la taille maximale du vecteur attendu en sortie;
% on se limite à des valeurs d'itérés distinctes au sens de nul_seuil.
% nul_seuil est un réel positif en-dessous duquel un réel est considéré
% nul;
% plus précisément pour un vecteur d'itérés on ne prend plus en compte
% les valeurs distantes de la valeur finale de moins de nul_seuil.
%
% variables de sortie
% ait désigne le vecteur constitué des premiers itérés ordinaires de x0
% par la fonction g,
% suivis dès que possible au sens des paramètres passés,
% par les accélérés d'Aitken,
% avec arret dès que les suivants sont identiques au dernier terme
% au sens de nul_seuil choisi.
% deb_acc est l'indice au sens matlab du premier accéléré produit.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%              Fonctions appelées                                                                    *
%                                                  
%                                           
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


% spécifications
format long e;


% tests d'entrée
if nargin~=5
    error('Nombre des arguments incorrect');
end
if n_max<2
    error('taille n_max insuffisante pour accélérer');
end
% Il convient sans doute de tester d'autres paramètres, leur type etc...
% selon la dangerosité des utilisateurs!


% Algorithme proprement dit

% Génération des itérés simples par la fonction g;
% on peut remplacer par une écriture matricielle ce bloc. Il sera moins
% lisible.
x=x0;val(1)=x;
for i=1:n_max-1
    x=eval(exp_g);
    val(i+1)=x;
end


% Mise à l'abri de misères!
% On évite des valeurs identiques à partir d'un certain rang.
ind=find(abs(diff(val))>nul_seuil);val=val(ind);
n_max=size(val,2);

% recherche des ratios de variation relative des éléments de val;
% voir cours.

% Ici q(n) représentera ce qui dans le cours est q d'indice n
% contrairement à l'ordinaire matlab.
q=diff(val(1:n_max-1))./diff(val(2:n_max));

% variation des qn
rel=diff(q)./q(2:n_max-2);
ind=find(abs(rel)<eps_seuil);
sprintf('Début de l''accélération x d''indice:%3.0f ',ind(1));
deb_acc=ind(1)+1;

% détermination du vecteur ait
if ind(1)<=n_max-2
    % calcul des accélérés sous aitken
    ait=zeros(1,n_max-1);
    ait(1:ind(1))=val(1:ind(1));
    
    % version matricielle
    ait(ind(1)+1:n_max-1)=val(ind(1)+2:n_max)+diff(val(ind(1)+1:n_max))./(q(ind(1):n_max-2)-1);
end


% on suprime les valeurs présentes dans ait égales au sens de nul_seuil
% à la dernière calculée considérée comme la limite.
ind=find(abs(ait-ait(size(ait,2)))>=nul_seuil);
ait=ait(ind);


% affichage des résultats à la demande de l'utilisateur
% Ce bloc peut etre remplacé par le passage d'un champ complémentaire
% dans la fonction aitken, par exemple dem_affichage,
% qui serait un booléen égal à 1
% ssi l'utlisateur veut afficher les résultats.
% Ainsi l'utilisateur par une copie de la fenetre de commande
% après exécution récupère et imprime l'appel de fonction
% avec les paramètres passés, suivi des résultats obtenus.


ch=input('Voulez-vous afficher les résultats? (Si oui, taper 1)','s');
if str2num(ch)==1
    % à modifier selon l'impression souhaitée
    nb_lig=3;
    
    s=[];
    for i=1:size(ait,2)
        s=[s sprintf('ait%2.0f = %12.10f   ',i,ait(i))];
        % pourrait etre remplacé par un calibrage en fonction
        % de nul_seuil du type cal=-log10(2*nul_seuil)
        % à passer après transformation chaine à la place de 12.10f.
        if rem(i,nb_lig)==0|(i==size(ait,2))
            disp(s);sprintf('\n');
            s=[];
        end
    end
end

% fin de fonction aitken
