Bonjour à tous!
Je suis étudiante et je suis en stage de 6 mois dans un labo. Je dois faire un programme en matlab qui me demande de fitter des données expérimentales à une somme de deux sinus tronqués et de regarder le déphasage entre ces deux sinus. J'ai donc utilisé la méthode des moindres carrés par l'intermédiaire de cette fonction: lsqcurvefit. Jusque là tout semble aller bien.
Cependant, lorsque je crée un modèle, extremement simpliste, de mes données expérimentales, à savoir une fonction F égale à la somme de deux sinus tronqués rien ne va plus. Je m'explique:
Ma fonction F est de la forme:
F = Partie positivede (A1*sin(x+P1)) + Partie négative de (A2*sin(x+P2)).
Ce qui correspond bien à la somme de deux sinus tronqués voir un sinus si les amplitudes A1 et A2 ainsi que les déphasages P1 et P2 sont égaux.
Voici une partie du programme que j'ai écrit pour effectuer le fittage. x0 et x1 sont les données de départ: à savoir l'amplitude A1 et la phase P1 que je met égale à l'amplitude et la phase que j'ai imposé à mes deus sinus de départ: A1 et A2.
ma fonction estimation est la suivante:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 Amp1=A1; Pha1=P1; Amp2=A2; Pha2=P2; x0 = [Amp1,Pha1]; %Estimation pour la partie positive de F [xP,resnormP] = lsqcurvefit(@fonction_estimation,x0,xdataP,ydataP) x1 = [Amp2,Pha2]; %Estimation pour la partie négative de F [xN,resnormN] = lsqcurvefit(@fonction_estimation2,x1,xdataN,ydataN)et ma fonction estimation2 est celle ci:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 function F = fonction_estimation(x,xdataP) F1 = x(1)*sin(xdataP*(pi/180)*(360/5000) + x(2)*pi/180); for i = 1:5000 if F1(i) >= 0 F1(i) = F1(i); else F1(i) = 0; end end F = F1;
Mon problème: En faisant ce programme, qui me semble on ne peut plus bateau, je m'attendais à retrouver exactement les déphasages que j'avais imposé à mes deux sinus de départ: P1 et P2. Mais il n'en est rien. Par exemple: j'attribue à P1 et P2 les valeurs: 0° et 70°, le programme, aprés fittage, me trouve: 11° et 58° ! J'ai pourtant fait attention à créer des sinus sur une seule période. Et j'ai essayé de voir si il n'y avait pas un problème de modulo quelque part, mais je ne vois pas où. Quelqu'un pourrait il m'aider à résoudre ce problème qui est sans doute trivial ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 function F = fonction_estimation2(x,xdataN) F2 = x(1)*sin(xdataN*(pi/180)*(360/5000) + x(2)*pi/180); for i = 1:5000 if F2(i) <= 0 F2(i) = F2(i); else F2(i) = 0; end end F = F2;
Merci d'avance, n'hésitez pas à me faire une remarque lorsque je n'ai pas été assez claire!
Cémaths.
Partager