]> AND Private Git Repository - cours-mesi.git/blob - tel/TPmatlab/equation_nonlineaire/TP4h/muller.m
Logo AND Algorithmique Numérique Distribuée

Private GIT Repository
ajout de partiels
[cours-mesi.git] / tel / TPmatlab / equation_nonlineaire / TP4h / muller.m
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
6 %\r
7 % variables d'entrée\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
18 %\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
26 %\r
27 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r
28 %                       Fonctions connexes appelées\r
29 %\r
30 % muller_elem, affiche_racines (si libérée du commentaire)\r
31 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r
32 % spécification\r
33 format long e;\r
34 \r
35 % Tests d'entrée\r
36 \r
37 if nargin~=3\r
38     error('Nombre des arguments incorrect, ou écriture inattendue');\r
39 end\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
44 end\r
45 if (size(arret,1)~=1)|(size(arret,2)~=3)\r
46     error('Champ arret mal écrit. Voir controle');\r
47 end\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
50 end\r
51 % compléments éventuels\r
52 \r
53 \r
54 % Algorithme proprement dit\r
55 \r
56 \r
57 % initialisations et préparation des données\r
58 ens_rac=[];nb_iter=[];\r
59 \r
60 while pol3(1)==0\r
61     pol3(1)=[];\r
62 end\r
63 % si on a passé sciemment le vecteur nul,\r
64 % on peut s'interroger sur la nullité de l'utilisateur!\r
65 deg=size(pol3,2)-1;\r
66 \r
67 % création de la chaine d'appel de muller_elem associée à pol3 ou autre!\r
68 vect=pol3;\r
69 exp_f=vect2str(vect);\r
70 \r
71 \r
72 while deg>1\r
73     \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
77     \r
78     % deflation\r
79     taille=size(rac,2);\r
80     switch taille\r
81     case 1\r
82         div=[1 -rac];deg=deg-1;\r
83     case 2\r
84         div=[1 -sum(rac) prod(rac)];deg=deg-2;\r
85     end\r
86     \r
87     % préparation de l'itération suivante\r
88     vect=deconv(vect,div);\r
89     exp_f=vect2str(vect);\r
90 end\r
91 \r
92 % fin de déflation éventuelle\r
93 if deg==1   \r
94     rac=-vect(2)/vect(1);\r
95     iter=0;\r
96     ens_rac=[ens_rac rac];nb_iter=[nb_iter iter];\r
97 end\r
98 \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
102 % fin de fonction