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

Private GIT Repository
j
[cours-mesi.git] / tel / TPmatlab / equation_nonlineaire / TP4g / entrelacs_conv_anim.m
1 function entrelacs_conv_anim(f1,f2)\r
2 % Propose une visualisation animée de la convergence d'une suite.\r
3 %\r
4 % variables d'entrée\r
5 % f1 désigne un vecteur de n1 valeurs d'une suite convergente\r
6 % dont la dernière est considérée comme la limite.\r
7 % L'écart à la limite sera représenté par des rayons polaires\r
8 % répartis sur un cercle proportionnellement aux gains de  variation relative,\r
9 % rapportés à la somme de ceux-ci, tous considérés en valeur absolue.\r
10 % Le rayon est l'écart de chaque valeur à la "limite".\r
11 % Idem en f2.\r
12 \r
13 \r
14 % Tests d'entrée\r
15 if nargin~=2\r
16     error('Nombre des arguments incorrect');\r
17 end\r
18 \r
19 % ménage!\r
20 clf;\r
21 \r
22 % Calibrage des données: ces constantes modifiables par l'utilisateur\r
23 % pourraient aussi etre passées comme champs complémentaires.\r
24 % nul_seuil: un nombre inférieur en valeur absolue à nul_seuil est considéré nul.\r
25 % rap_seuil: pourcentage de la fenetre en dessous duquel on dilate l'image.\r
26 % u: unité de pause en secondes; règle la vitesse de production des images.\r
27 \r
28 \r
29 nul_seuil=0.5E-11;\r
30 rap_seuil=0.1;\r
31 u=1;\r
32 \r
33 % détermination des rayons vecteurs, angles\r
34 % et initialisations diverses relatives à f1\r
35 r1=abs(f1-f1(size(f1,2)));ind1=find(r1>nul_seuil);\r
36 r1=r1(ind1);\r
37 nb_pas1=size(r1,2);\r
38 att1=zeros(1,nb_pas1);alph1=zeros(1,nb_pas1);\r
39 var_rel1=abs(diff(r1))./abs(r1(2:nb_pas1));\r
40 att1(2:nb_pas1)=1./var_rel1*u;\r
41 alph1(2:nb_pas1)=2*pi/sum(var_rel1)*cumsum(var_rel1);\r
42 \r
43 % détermination des rayons vecteurs, angles\r
44 % et initialisations diverses relatives à f2\r
45 r2=abs(f2-f2(size(f2,2)));ind2=find(r2>nul_seuil);\r
46 r2=r2(ind2);\r
47 nb_pas2=size(r2,2);\r
48 att2=zeros(1,nb_pas2);alph2=zeros(1,nb_pas2);\r
49 var_rel2=abs(diff(r2))./abs(r2(2:nb_pas2));\r
50 att2(2:nb_pas2)=1./var_rel2*u;\r
51 alph2(2:nb_pas2)=2*pi/sum(var_rel2)*cumsum(var_rel2);\r
52 \r
53 % création de la table globale\r
54 % qui sera ordonnée temporellement ultérieurement.\r
55 date1=cumsum(att1);num1=ones(1,nb_pas1);\r
56 X1=r1.*cos(alph1);Y1=r1.*sin(alph1);\r
57 date2=cumsum(att2);num2=3*ones(1,nb_pas2);\r
58 X2=r2.*cos(alph2);Y2=r2.*sin(alph2);\r
59 \r
60 date=[date1 date2];num=[num1 num2];\r
61 X=[X1 X2];Y=[Y1 Y2];r=[r1 r2];\r
62 [tdate,ind]=sort(date);\r
63 tnum=num(ind); tr=r(ind);\r
64 tX=X(ind);tY=Y(ind);tatt=[0 diff(tdate)];\r
65 \r
66 \r
67 % création des valeurs qui s'enroulent autour de\r
68 % la limite avec ajustement d'échelle automatique\r
69 % initialisations\r
70 coef=1.1*min(r1(1),r2(1));\r
71 lim1=[-coef coef -coef coef];\r
72 c=rap_seuil*coef;\r
73 x=[-c,-c,c,c,-c];y=[-c,c,c,-c,-c];\r
74 tot=nb_pas1+nb_pas2;compt1=0;compt2=0;\r
75 encor1=1;encor2=1;\r
76 \r
77 n=1;\r
78 \r
79     \r
80 % préparation des fenetres\r
81 figure;\r
82 subplot(2,2,1);title('Conv de suite 1');hold on;\r
83 subplot(2,2,2);title('Var rel cum pour suite 1');hold on;\r
84 subplot(2,2,3);title('Conv de suite 2');hold on;\r
85 subplot(2,2,4);title('Var rel cum pour suite 2');hold on;\r
86 \r
87 max1=max(nb_pas1,nb_pas2);\r
88 max2=max(sum(var_rel1),sum(var_rel2));\r
89 lim2=1.1*[2 max1 0 max2];\r
90 \r
91 subplot(2,2,2);\r
92 axis(lim2);plot((2:nb_pas1),cumsum(var_rel1),'k.-');\r
93 hold on;\r
94 subplot(2,2,4);\r
95 axis(lim2);plot((2:nb_pas2),cumsum(var_rel2),'k.-');\r
96 hold on;\r
97 \r
98 while n<=tot\r
99     if  (1/coef*tr(n)>rap_seuil)\r
100         % suivi des points traites\r
101         ch=num2str(1+(tnum(n)-1)/2);\r
102         ch_x=['compt' ch];ch_y=['var_rel' ch];\r
103         eval([ch_x '=' ch_x '+1;']);tx=eval(ch_x);\r
104         ty=eval(['sum(' ch_y '(1:tx-1))']);\r
105         \r
106         % tracés dans les fenetres\r
107         subplot(2,2,tnum(n));axis(lim1);\r
108         line([0,tX(n)],[0,tY(n)]);hold on;\r
109         subplot(2,2,tnum(n)+1);axis(lim2);\r
110         plot([tx],[ty],'cs');\r
111         hold on;\r
112         \r
113         % prise d'une pause (bien méritée!)\r
114         pause(tatt(n));\r
115         \r
116         % mise à jour de n\r
117         n=n+1;\r
118         j=find(tnum(n:tot)==1);\r
119         if (j==[])&(encor1)\r
120             encor1=0;\r
121             subplot(2,2,1);axis(lim1);\r
122             plot([0],[0],'rp-');\r
123             legend('Limite ''atteinte''',0);\r
124             hold on;\r
125         end\r
126         j=find(tnum(n:tot)==3);\r
127         if (j==[])&(encor2);\r
128             encor2=0;\r
129             subplot(2,2,3);axis(lim1);\r
130             plot([0],[0],'rp-');\r
131             legend('Limite ''atteinte''',0);\r
132             hold on;\r
133         end\r
134     \r
135     else\r
136        % annonce d'agrandissement\r
137        c=rap_seuil*coef;\r
138        x=[-c,-c,c,c,-c];y=[-c,c,c,-c,-c];\r
139        if encor1\r
140            subplot(2,2,1);axis(lim1);\r
141            plot(x,y,'r.--');\r
142            hold on;pause(u/4);\r
143        end\r
144        if encor2\r
145            subplot(2,2,3);axis(lim1);\r
146            plot(x,y,'r.--');\r
147            hold on;pause(u/4);\r
148        end\r
149        \r
150        % changement d'échelle\r
151        k=1.1/coef*tr(n);\r
152        lim1=k*lim1;coef=k*coef;\r
153    end\r
154 end\r
155 \r
156 % fin de fonction