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

Private GIT Repository
j
[cours-mesi.git] / tel / TPmatlab / equation_nonlineaire / TP4g / visu2_conv_anim.m
1 function visu2_conv_anim(f1,f2)\r
2 % Propose une visualisation animée de la convergence comparée de deux suites.\r
3 %\r
4 % variables d'entrée\r
5 % f1 désigne un vecteur de n1 valeurs qui seront représentées en polaire\r
6 % par pas angulaire de 2*pi/n1;\r
7 % le rayon est l'écart de chaque valeur à la dernière, considérée comme limite.\r
8 % Idem en f2.\r
9 \r
10 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r
11 %              Fonctions appelées                                                                    *\r
12 %                                                  \r
13 %                                           \r
14 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r
15 \r
16 \r
17 % Tests d'entrée\r
18 if nargin~=2\r
19     error('Nombre des arguments incorrect');\r
20 end\r
21 \r
22 % ménage!\r
23 clf;\r
24 \r
25 % Calibrage des données: ces constantes modifiables par l'utilisateur\r
26 % pourraient aussi etre passées comme champs complémentaires.\r
27 % nul_seuil: un nombre inférieur en valeur absolue à nul_seuil est considéré nul.\r
28 % rap_seuil: pourcentage de la fenetre en dessous duquel on dilate l'image.\r
29 % u: unité de pause en secondes; règle la vitesse de production des images.\r
30 \r
31 \r
32 nul_seuil=0.5E-11;\r
33 rap_seuil=0.1;\r
34 u=1;\r
35 \r
36 % détermination des rayons vecteurs\r
37 r1=abs(f1-f1(size(f1,2)));ind1=find(r1>nul_seuil);\r
38 r1=r1(ind1);\r
39 r2=abs(f2-f2(size(f2,2)));ind2=find(r2>nul_seuil);\r
40 r2=r2(ind2);\r
41 \r
42 % calibrage des axes et choix du pas angulaire\r
43 alph1=2*pi/size(r1,2);\r
44 alph2=2*pi/size(r2,2);\r
45 coef=1.1*min(r1(1),r2(1));\r
46 lim=[-coef coef -coef coef];\r
47 \r
48 % création des valeurs qui s'enroulent autour de\r
49 % la limite avec ajustement d'échelle automatique\r
50 \r
51 tailles=[size(r1,2),size(r2,2)];\r
52 nb_pas1=min(tailles);nb_pas2=max(tailles);\r
53 n=1;\r
54 \r
55 % préparation des fenetres\r
56 subplot(2,1,1);title('Convergence de suite 1');\r
57 subplot(2,1,2);title('Convergence de suite 2');\r
58 % on peut faire plus rusé pour le titre!\r
59 c=rap_seuil*coef;\r
60 X=[-c,-c,c,c,-c];Y=[-c,c,c,-c,-c];\r
61 \r
62 while n<=nb_pas1\r
63     if  (1/coef*min(r1(n),r2(n))>rap_seuil)\r
64         \r
65         x1=r1(n)*cos((n-1)*alph1);\r
66         y1=r1(n)*sin((n-1)*alph1);\r
67         x2=r2(n)*cos((n-1)*alph2);\r
68         y2=r2(n)*sin((n-1)*alph2);\r
69         \r
70         % tracé dans les deux fenetres\r
71         subplot(2,1,1);axis(lim);\r
72         line([0,x1],[0,y1]);hold on;\r
73         subplot(2,1,2);axis(lim);\r
74         line([0,x2],[0,y2]);hold on;\r
75         \r
76         % prise d'une pause (bien méritée!)\r
77         pause(2*u);\r
78         \r
79         % mise à jour de n\r
80         n=n+1;\r
81     else\r
82        % annonce d'agrandissement\r
83        c=rap_seuil*coef;\r
84        X=[-c,-c,c,c,-c];Y=[-c,c,c,-c,-c];\r
85        subplot(2,1,1);axis(lim);\r
86        plot(X,Y,'r.--');\r
87        hold on;pause(2)\r
88        subplot(2,1,2);axis(lim);\r
89        plot(X,Y,'r.--');\r
90        hold on;pause(2);\r
91        % changement d'échelle\r
92        k=1.1/coef*min(r1(n),r2(n));\r
93        lim=k*lim;coef=k*coef;\r
94    end\r
95 end \r
96 % Variante : il est possible d'utiliser\r
97 % la fonction movie et de créer une animation\r
98 \r
99 % indication de fin de convergence\r
100 \r
101 if nb_pas1~=nb_pas2\r
102     ind=find(tailles==nb_pas2);\r
103     r3=eval(['r' num2str(ind)]);\r
104     alph3=eval(['alph' num2str(ind)]);\r
105     num=3-ind;\r
106     subplot(2,1,num);axis(lim);\r
107     plot([0],[0],'rp-');legend('Limite ''atteinte''',0);\r
108     hold on;\r
109     % préparation de fin de tracé\r
110     num=3-num;\r
111 else\r
112     subplot(2,1,1);axis(lim);\r
113     plot([0],[0],'rp-');legend('Limite ''atteinte''',0);\r
114     hold on;subplot(2,1,2);axis(lim);\r
115     plot([0],[0],'bp-');legend('Limite ''atteinte''',0);\r
116     hold on;\r
117 end\r
118 \r
119 % tracé de la courbe restante éventuelle\r
120 \r
121 while n<=nb_pas2\r
122     if  (1/coef*r3(n)>rap_seuil)\r
123         \r
124         x3=r3(n)*cos((n-1)*alph3);\r
125         y3=r3(n)*sin((n-1)*alph3);\r
126         \r
127         % tracé dans la fenetre convenable\r
128         subplot(2,1,num);axis(lim);\r
129         line([0,x3],[0,y3]);hold on;\r
130         \r
131         % prise d'une pause (bien méritée!)\r
132         pause(2);\r
133         \r
134         % mise à jour de n\r
135         n=n+1;\r
136     else\r
137        % annonce d'agrandissement\r
138        c=rap_seuil*coef;\r
139        X=[-c,-c,c,c,-c];Y=[-c,c,c,-c,-c];\r
140        subplot(2,1,num);axis(lim);\r
141        plot(X,Y,'r.--');\r
142        hold on;pause(2);\r
143        % changement d'échelle\r
144        k=1.1/coef*r3(n);\r
145        lim=k*lim;coef=k*coef;\r
146    end\r
147 end\r
148 \r
149 % limite atteinte\r
150 subplot(2,1,num);axis(lim);\r
151 plot([0],[0],'bp-');legend('Limite ''atteinte''',0);\r
152 hold off;\r
153 \r
154 % fin de fonction