function [ens_rac,nb_iter]=muller(init,pol3,arret)
% Produit une racine d'équation (E) f(x)=0 par méthode de Muller.
% Le calcul se termine par un forçage à une écriture symbolique de rac,
% qui est affichée en plus de la numérique!
% Ceci peut etre aisément modifié!
%
% variables d'entrée
% init est un vecteur de trois valeurs initiales distinctes
% pour la méthode de Muller  classique. On peut généraliser!
% pol3 définit le polynome de degré trois, passé comme un vecteur
% de réels conformément à l'ordinaire matlab.
% arret est un vecteur de trois réels [f_seuil,nul_seuil,n_max]
% dont la signification est la suivante:
% si |f(x)|<f_seuil on considère f(x) nul;
% si |x|<nul_seuil on considère x nul;
% n_max est un entier naturel qui désigne le nombre maximal
% d'itérations autorisées.
%
% variables de sortie
% ens_rac désigne l'ensemble des valeurs approchées des racines réelles
% ou complexes de l'équation pol3(x)=0.
% Elles sont obtenues à partir d'init par algorithme de Muller classique.
% nb_iter est un vecteur qui grade trace du nombre d'itérations
% nécessaires au calcul de chaque racine, sachant qu'une racine complexe
% et sa conjuguée sont produites en un seul calcul.
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%                       Fonctions connexes appelées
%
% muller_elem, affiche_racines (si libérée du commentaire)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% spécification
format long e;

% Tests d'entrée

if nargin~=3
    error('Nombre des arguments incorrect, ou écriture inattendue');
end
% Les tests de controle suivants peuvent etre plus ou moins développés,
% selon la dangerosité pressentie de l'utilisateur... ordinaire!
if (size(init,1)~=1)|(size(init,2)~=3)|((sum(diff(init)==0)>0))
    error('Champ init mal écrit. Voir controle');
end
if (size(arret,1)~=1)|(size(arret,2)~=3)
    error('Champ arret mal écrit. Voir controle');
end
if (size(pol3,1)~=1)|(isstr(pol3))
    error('Champ pol3 mal écrit. pol3 est un vecteur de réels ici');
end
% compléments éventuels


% Algorithme proprement dit


% initialisations et préparation des données
ens_rac=[];nb_iter=[];

while pol3(1)==0
    pol3(1)=[];
end
% si on a passé sciemment le vecteur nul,
% on peut s'interroger sur la nullité de l'utilisateur!
deg=size(pol3,2)-1;

% création de la chaine d'appel de muller_elem associée à pol3 ou autre!
vect=pol3;
exp_f=vect2str(vect);


while deg>1
    
    % adjonction des nouvelles racines issues de Muller élémentaire
    [rac,iter]=muller_elem(init,exp_f,arret);
    ens_rac=[ens_rac rac];nb_iter=[nb_iter iter];
    
    % deflation
    taille=size(rac,2);
    switch taille
    case 1
        div=[1 -rac];deg=deg-1;
    case 2
        div=[1 -sum(rac) prod(rac)];deg=deg-2;
    end
    
    % préparation de l'itération suivante
    vect=deconv(vect,div);
    exp_f=vect2str(vect);
end

% fin de déflation éventuelle
if deg==1   
    rac=-vect(2)/vect(1);
    iter=0;
    ens_rac=[ens_rac rac];nb_iter=[nb_iter iter];
end

% affichage éventuel des résultats
% à libérer du commentaire éventuellement
% affiche_racines(ens_rac,vect2str(pol3),arret(1));
% fin de fonction