Interférence de deux ondes sinusoïdales sous MATLAB
On se propose de construire une interface graphique, qui affiche l’interférence de deux ondes sinusoïdales de même amplitude. La vitesse angulaire de la première onde est fixe et égale à 1, et avec une phase réglée à zéro.
Les données de la première onde étant considérées comme invariables, l’utilisateur peut définir la phase de la seconde onde et établir le rapport de sa vitesse angulaire en fonction de la première onde.
On cherche à montrer les effets des modifications de vitesse angulaire et de phase de la deuxième composante sur la forme de l’onde résultante.
Pour cela l’interface devra contenir :
- Une figure principale;
- Deux axes pour les représentations graphiques;
- Deux boutons pour le rafraichissement et la remise à zéro des courbes;
- Quatre zone de texte statique;
- Deux zones de textes éditable.
Dans la figure ci dessous, vous avez une illustration du résultat attendu:
Le bouton « Restore » permet de remettre à zéro les courbes et le bouton « Refresh » permet de rafraichir la représentation graphique de l’onde résultante.
Solution
Nous avons fait le choix, de coder cette interface graphique sous la forme d’un programme, qui va se comporter comme un trieur. Pour cela, nous allons structurer le programme avec un Switch qui aura 4 états:
- mpt_init : initialise l’interface utilisateur graphique
- mpt_omega : définit la vitesse angulaire de la deuxième onde
- mpt_phase : définit la phase de la deuxième onde
- mpt_rafraichir : trace la superposition des deux ondes
Le programme prend en entrée une variable, nommée flag. Le Switch évalue la valeur du flag qui lui est donnée et aiguille le programme vers le cas correspondant.
function MPT_Interference(flag) % netoyage clc; % initialise sans argument if nargin < 1 flag = 'mpt_init'; end
Lorsque l’on exécute le programme sans paramètres, la fonction MATLAB nargin, détecte un nombre d’arguments inférieur à 1 et affects la chaine de caractère « mpt_init » à la variable flag.
Initialisation de linterface
Dans le cas d’une demande d’initialisation, la variable flag = ‘mpt_init‘.
switch flag case 'mpt_init' % suppression de la figure appelante s'il existe if ~isempty(gcf) delete(gcf); end % couleur de la figure colorfigure = [185/255 205/255 229/255]; % Définition de la première onde % omega1 : vitesse angulaire de la 1ere onde, rad/s % T : période de la 1ere onde, s % t : échelle de temps, s omega1 = 1; T = 2*pi / omega1; t = 0:T/30:3*T; w1 = sin(omega1*t); % rapport entre la deuxième onde sur la première multipl = 1; % rapport de phase par rapport à la période de la deuxième onde phase = 0;
On regarde d’abord si la figure existe déjà. Si c’est le cas, on la supprime. Ensuite on définit les données invariables de la première onde.
Le code suivant permet de créer et d’affecte à la figure, un nom et une couleur de fond.
% création de la figure principale H_fig = figure( 'NumberTitle', 'off', ... 'Name', 'Interférence de deux ondes sunisoïdales', ... 'Color', colorfigure);
Création des zones de textes
Ensuite, on crée deux zones d’édition et un label pour chaque zone d’édition. Ces zones d’édition permettront à l’utilisateur de modifier la valeur de la vitesse angulaire ainsi que la valeur de la phase de la deuxième onde
% création de la zone de text "Multiplicateur de fréquence" uicontrol(H_fig,'Units', 'normalized', ... 'Position', [0.05 0.07 0.15 0.05], ... 'Style', 'Edit', ... 'String', num2str(multipl), ... 'Tag', 'omega', ... 'CallBack', ('MPT_Interference(''mpt_omega'')')); % Création du label uicontrol(H_fig,'Units', 'normalized', ... 'Position', [0.05 0.13 0.15 0.08], ... 'Style', 'Text', ... 'BackGround', colorfigure, ... 'String', 'Multiplicateur de fréquence'); % Création de la zone de text "Phase w_2/T2" uicontrol(H_fig,'Units', 'normalized', ... 'Position', [0.3 0.07 0.15 0.05], ... 'Style', 'Edit', ... 'String', num2str(phase), ... 'Tag', 'rapport_phase', ... 'CallBack', ('MPT_Interference(''mpt_phase'')')); % Création du label uicontrol(H_fig,'Units', 'normalized', ... 'Position', [0.3 0.13 0.15 0.08], ... 'Style', 'Text', ... 'BackGround', colorfigure, ... 'String', 'Phase w_2/T2');
La propriété CallBack, permet de définir la fonction, qui sera appelée lorsqu’on modifie la valeur de la zone d’édition. En l’occurrence, c’est le programme principal MPT_Interference(), qui sera appelé avec l’argument »mpt_omega » ou « mpt_phase ».
La propriété position permet de définir la position de l’objet graphique dans la figure principale. On l’utilise comme suite : ‘position’, [gauche, bas, largeur, Hauteur].
- gauche et bas : définissent les coordonnées x, y de l’objet, en partant du coin bas à gauche de la figure principale.
La propriété Units, nous permet d’exprimer les dimensions en unité normalisée. C’est à dire en pourcentage de la taille de la figure principale.
Création des boutons
Création des deux boutons, pour rafraichir et pour réinitialiser l’application.
% Création du bouton "Refresh" uicontrol(H_fig,'Units', 'normalized', ... 'Position', [0.55 0.07 0.15 0.14], ... 'Style', 'Pushbutton', ... 'String', 'Refresh', ... 'BackGround', colorfigure, ... 'CallBack', ('MPT_Interference(''mpt_rafraichir'')')); % Création du bouton "Restore" uicontrol(H_fig,'Units', 'normalized', ... 'Position', [0.8 0.07 0.15 0.14], ... 'Style', 'Pushbutton', ... 'String', 'Restore', ... 'BackGround', colorfigure, ... 'CallBack', ('MPT_Interference(''mpt_init'')'));
Création des axes
Le code suivant permet de créer les deux axes, avec pour chacun une zone de texte pour servir de description.
% Création de la legende des ondes d'origines uicontrol(H_fig,'Units', 'normalized', ... 'Position', [0.8 0.71 0.15 0.14], ... 'Style', 'Text', ... 'BackGround', colorfigure, ... 'String', 'Ondes d''origines, w_1 et w_2'); % Création de la legende de l'onde résultant uicontrol(H_fig,'Units', 'normalized', ... 'Position', [0.8 0.36 0.15 0.14], ... 'Style', 'Text', ... 'BackGround', colorfigure, ... 'String', 'Onde résultante, w_1 + w_2'); % Création des axes Ha_up = axes('Position', [0.05 0.71 0.65 0.21]); plot (t, w1, 'r-'); Ha_down = axes('Position', [0.05 0.36 0.65 0.21]); plot (t, w1, 'r-'); xlabel('Time, S')
Gestion des données dans l’IHM
On utilise un tableau de cellules pour stocker les données transmises entres les différents segments de l’interface. Ensuite on enregistre le tableau de cellules résultant Mydata dans la propriété UserData associée à la figure, un dispositif qui permet de transmettre des données entre les différentes parties d’une fonction récursives.
% allocation d'espace mémoire Mydata = cell (7); Mydata{1} = omega1; Mydata{2} = t; Mydata{3} = w1; Mydata{4} = multipl; Mydata{5} = phase; Mydata{6} = Ha_up; Mydata{7} = Ha_down; % Enregistrement sur la mémoire de l'interface set (gcf, 'UserData', Mydata);
Définition de la vitesse angulaire de la deuxième onde
Dans le cas où flag = ‘mpt_omega’, c’est-à-dire lorsque, l’utilisateur change la valeur de la vitesse angulaire de la deuxième onde sur la première.
Ce bout de code va récupérer la nouvelle valeur rentrée par l’utilisateur.
case 'mpt_omega' % lecture de la valeur de omega h_omega = findobj (gcf, 'Tag', 'omega'); multipl = str2double (get(h_omega, 'String'));
Ensuite, on récupère les données contenues dans le tableau Mydata, puis on crée la deuxième onde.
% lecture des donnees contenu sur l'interface Mydata = get (gcf, 'UserData'); omega1 = Mydata{1}; t = Mydata{2}; w1 = Mydata{3}; Ha_up = Mydata{6}; % représenter la 2eme courbe omega2 = omega1 * multipl; w2 = sin (omega2*t);
Enfin, on trace la deuxième onde sur le premier axe et on met à jour le tableau de données Mydata.
% affichage de la courbe de w2 axes (Ha_up); plot (t, w1, 'r-', t, w2, 'b--'); % sauvegarde de la nouvelle valeur de multipl Mydata{4} = multipl; set(gcf, 'UserData', Mydata);
Définition de la phase de la deuxième onde
Dans le cas où flag = ‘mpt_phase’, c’est-à-dire lorsque, l’utilisateur change la valeur de la phase de la deuxième onde.
Ce bout de code va récupérer la nouvelle valeur rentrée par l’utilisateur:
case 'mpt_phase' % Lecture de la valeur phase h_phase = findobj (gcf, 'Tag', 'rapport_phase'); phase = str2double (get(h_phase, 'String'));
Ensuite, on récupère les données contenues dans le tableau de cellules Mydata, puis on crée la deuxième onde:
% lecture des données de l'interface Mydata = get (gcf, 'UserData'); omega1 = Mydata{1}; t = Mydata{2}; w1 = Mydata{3}; multipl = Mydata{4}; Ha_up = Mydata{6}; % representer la 2eme courbe omega2 = omega1 * multipl; T2 = 2*pi/omega2; delta = phase*T2; w2 = sin(omega2*t + delta);
On trace la deuxième onde sur le premier axe et on met à jour le tableau de données Mydata:
% représentation de la 1ere courbe axes (Ha_up); plot (t, w1, 'r-', t, w2, 'b--'); % sauvegarde de la nouvelle valeur de phase Mydata{5} = phase; set(gcf, 'UserData', Mydata);
Tracer de la superposition des deux ondes
Dans le cas où flag = ‘mpt_rafraichir’, c’est-à-dire lorsque l’utilisateur clique sur le bouton Rafraichir, on trace alors l’onde résultante sur la deuxième axe :
case 'mpt_rafraichir' % lecture des données de l'interface Mydata = get (gcf, 'UserData'); omega1 = Mydata{1}; t = Mydata{2}; w1 = Mydata{3}; multipl = Mydata{4}; phase = Mydata{5}; Ha_down = Mydata{7}; % représentation de la courbe résultante omega2 = omega1 * multipl; T2 = 2*pi/omega2; delta = phase*T2; w2 = sin(omega2*t + delta); w = w1 + w2; axes (Ha_down); plot (t, w, 'b-'); end
Comments