]> AND Private Git Repository - cours-mesi.git/blob - tel/TPmatlab/integration/TP3c/determin_periode.m
Logo AND Algorithmique Numérique Distribuée

Private GIT Repository
j
[cours-mesi.git] / tel / TPmatlab / integration / TP3c / determin_periode.m
1 function [per,num]=determin_periode(X,Z)\r
2 % détermine la période d'un signal sinusoidal par calcul d'intégrale\r
3 %\r
4 % variables d'entrée\r
5 % X désigne le vecteur des dates régulièrement réparties du signal\r
6 % Z désigne le vecteur des images du signal s : Z=s(X).\r
7 % Il est essentiel que le signal issu de mesures a été toiletté\r
8 % préalablement sinon les calculs d'intégrales menés par exemple\r
9 % n'ont pas de sens.\r
10 %\r
11 % variable de sortie\r
12 % per est la valeur approchée de la période obtenue\r
13 % grace à la méthode retenue: voir sujet et fichier .doc.\r
14 % num désigne l'indice du vecteur X tel que X(num)-X(1)=per.\r
15 % On pourrait renvoyer comme paramètre de sortie aussi les deux\r
16 % premiers indices en lesquels Z est nul.\r
17 %\r
18 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r
19 %                     Fonctions connexes appelées\r
20 % simpson,\r
21 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r
22 % Tests d'entrée\r
23 if nargin~=2\r
24     error('Nombre de champs incorrect');\r
25 end\r
26 % controle des données\r
27 if size(X)~=size(Z)\r
28     error('Champs incorrects. Voir controle des données');\r
29 end\r
30 \r
31 \r
32 format long e;\r
33 %\r
34 \r
35 \r
36 % paramètres indispensables\r
37 pas_X=X(2)-X(1);\r
38 lgr=size(X,2);\r
39 \r
40 % détermination du deuxième changement de signe de Z\r
41 positifs=(Z>=0);\r
42 chgt=find(diff(positifs));\r
43 \r
44 % Initialisation du cacul de l'intégrale de z=f(x)\r
45 % entre X0 et le deuxième changement de signe de Z.\r
46 % ind_deb, choisi pour disposer d'un nombre de points impairs,\r
47 % sera l'indice de début dans le calcul des intégrales suivantes.\r
48 ind_deb=chgt(2)+mod(chgt(2)+1,2);\r
49 integ0=simpson(pas_X,Z,1,ind_deb);\r
50 ind_fin=lgr-mod(lgr-ind_deb,2);\r
51 integ=integ0;\r
52 \r
53 % recherche dichotomique de l'intégrale nulle\r
54 % en fin de boucle\r
55 % l'integrale entre 1 et ind_deb est d'un signe\r
56 % l'integrale entre 1 et ind_fin est de l'autre\r
57 % donc l'intégrale entre 1 et leur milieu est considérée nulle.\r
58 \r
59 while (ind_fin-ind_deb>2)\r
60     mil=(ind_deb+ind_fin)/2;\r
61     % vérification de la conformité des indices deb et fin\r
62     % assurant un nombre impair de points pour intégrer.\r
63     mil=mil-mod(mil-ind_deb,2);\r
64     integ_ajout=simpson(pas_X,Z,ind_deb,mil);\r
65     if (integ0*(integ+integ_ajout)>=0)\r
66         ind_deb=mil;\r
67         integ=integ+integ_ajout;\r
68     else\r
69         ind_fin=mil;\r
70     end\r
71 end\r
72 \r
73 % sortie des paramètres attendus\r
74 num=(ind_deb+ind_fin)/2;\r
75 per=(num-1)*pas_X;\r
76 % on pourrait sortit un vecteur ind_zeros_Z qui contiendrait\r
77 % [chgt(1) chgt(2)].\r
78 \r
79 \r
80 \r
81     \r
82 \r
83 \r
84 \r
85 \r
86         \r
87 \r
88 \r
89 \r
90 \r