1 function [ens_rac,nb_iter]=muller(init,pol3,arret)
\r
2 % Produit une racine d'équation (E) f(x)=0 par méthode de Muller.
\r
3 % Le calcul se termine par un forçage à une écriture symbolique de rac,
\r
4 % qui est affichée en plus de la numérique!
\r
5 % Ceci peut etre aisément modifié!
\r
8 % init est un vecteur de trois valeurs initiales distinctes
\r
9 % pour la méthode de Muller classique. On peut généraliser!
\r
10 % pol3 définit le polynome de degré trois, passé comme un vecteur
\r
11 % de réels conformément à l'ordinaire matlab.
\r
12 % arret est un vecteur de trois réels [f_seuil,nul_seuil,n_max]
\r
13 % dont la signification est la suivante:
\r
14 % si |f(x)|<f_seuil on considère f(x) nul;
\r
15 % si |x|<nul_seuil on considère x nul;
\r
16 % n_max est un entier naturel qui désigne le nombre maximal
\r
17 % d'itérations autorisées.
\r
19 % variables de sortie
\r
20 % ens_rac désigne l'ensemble des valeurs approchées des racines réelles
\r
21 % ou complexes de l'équation pol3(x)=0.
\r
22 % Elles sont obtenues à partir d'init par algorithme de Muller classique.
\r
23 % nb_iter est un vecteur qui grade trace du nombre d'itérations
\r
24 % nécessaires au calcul de chaque racine, sachant qu'une racine complexe
\r
25 % et sa conjuguée sont produites en un seul calcul.
\r
27 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\r
28 % Fonctions connexes appelées
\r
30 % muller_elem, affiche_racines (si libérée du commentaire)
\r
31 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\r
38 error('Nombre des arguments incorrect, ou écriture inattendue');
\r
40 % Les tests de controle suivants peuvent etre plus ou moins développés,
\r
41 % selon la dangerosité pressentie de l'utilisateur... ordinaire!
\r
42 if (size(init,1)~=1)|(size(init,2)~=3)|((sum(diff(init)==0)>0))
\r
43 error('Champ init mal écrit. Voir controle');
\r
45 if (size(arret,1)~=1)|(size(arret,2)~=3)
\r
46 error('Champ arret mal écrit. Voir controle');
\r
48 if (size(pol3,1)~=1)|(isstr(pol3))
\r
49 error('Champ pol3 mal écrit. pol3 est un vecteur de réels ici');
\r
51 % compléments éventuels
\r
54 % Algorithme proprement dit
\r
57 % initialisations et préparation des données
\r
58 ens_rac=[];nb_iter=[];
\r
63 % si on a passé sciemment le vecteur nul,
\r
64 % on peut s'interroger sur la nullité de l'utilisateur!
\r
67 % création de la chaine d'appel de muller_elem associée à pol3 ou autre!
\r
69 exp_f=vect2str(vect);
\r
74 % adjonction des nouvelles racines issues de Muller élémentaire
\r
75 [rac,iter]=muller_elem(init,exp_f,arret);
\r
76 ens_rac=[ens_rac rac];nb_iter=[nb_iter iter];
\r
82 div=[1 -rac];deg=deg-1;
\r
84 div=[1 -sum(rac) prod(rac)];deg=deg-2;
\r
87 % préparation de l'itération suivante
\r
88 vect=deconv(vect,div);
\r
89 exp_f=vect2str(vect);
\r
92 % fin de déflation éventuelle
\r
94 rac=-vect(2)/vect(1);
\r
96 ens_rac=[ens_rac rac];nb_iter=[nb_iter iter];
\r
99 % affichage éventuel des résultats
\r
100 % à libérer du commentaire éventuellement
\r
101 % affiche_racines(ens_rac,vect2str(pol3),arret(1));
\r