1 function entrelacs_conv_anim(f1,f2)
\r
2 % Propose une visualisation animée de la convergence d'une suite.
\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
16 error('Nombre des arguments incorrect');
\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
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
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
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
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
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
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
67 % création des valeurs qui s'enroulent autour de
\r
68 % la limite avec ajustement d'échelle automatique
\r
70 coef=1.1*min(r1(1),r2(1));
\r
71 lim1=[-coef coef -coef 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
80 % préparation des fenetres
\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
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
92 axis(lim2);plot((2:nb_pas1),cumsum(var_rel1),'k.-');
\r
95 axis(lim2);plot((2:nb_pas2),cumsum(var_rel2),'k.-');
\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
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
113 % prise d'une pause (bien méritée!)
\r
118 j=find(tnum(n:tot)==1);
\r
119 if (j==[])&(encor1)
\r
121 subplot(2,2,1);axis(lim1);
\r
122 plot([0],[0],'rp-');
\r
123 legend('Limite ''atteinte''',0);
\r
126 j=find(tnum(n:tot)==3);
\r
127 if (j==[])&(encor2);
\r
129 subplot(2,2,3);axis(lim1);
\r
130 plot([0],[0],'rp-');
\r
131 legend('Limite ''atteinte''',0);
\r
136 % annonce d'agrandissement
\r
138 x=[-c,-c,c,c,-c];y=[-c,c,c,-c,-c];
\r
140 subplot(2,2,1);axis(lim1);
\r
142 hold on;pause(u/4);
\r
145 subplot(2,2,3);axis(lim1);
\r
147 hold on;pause(u/4);
\r
150 % changement d'échelle
\r
152 lim1=k*lim1;coef=k*coef;
\r