IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MATLAB Discussion :

Tracé de diagrammes de Bode [Débutant]


Sujet :

MATLAB

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 32
    Par défaut Tracé de diagrammes de Bode
    Bonjour,

    j'ai écrit un programme (.m) pour tracé les diagrammes de Bode d'une fonction de transfert mais rien ne se passe quand je clique sur run.
    j'ai le message d'erreur suivant : "Error: Missing variable or function."

    Voici le programme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    % définition des différentes fonctions de transfert de la PLL. (en phase)
     
    clear all;
    close all;
     
    w=logspace(-1,5,500);
     
    Kc=1;                          % gain du comparateur de phase
     
    Kf=1;                          % fonction de transfert du filtre passe bas de gain Kf, constante de temps Tau                              
    Tau=1;
    F=Kf/(1+Tau*i*w);        
     
    Ko=1;                          % gain du VCO
     
    G=1/i*w;                       % intégrateur
     
    % tracé des diagrammes de Bode en boucle ouverte et en boucle fermée
     
    figure(1);
     
    A=Kc*F*Ko*G;                   % fonction de transfert en boucle ouverte
     
    subplot(2,1,1);
    semilogx(w,20*log10(abs(A)));
    grid; xlabel('log(w)'); ylabel('G'); title('Diagramme de Bode de la FTBO en gain');
    subplot(2,1,2);
    semilogx(w,unwrap(angle(A))*180/pi);
    grid; xlabel('log(w)'); ylabel('Phi'); title('Diagramme de Bode de la FTBO en phase');
     
     
    figure(2);
     
    B=(Kc*F*Ko*G)/(1+Kc*F*Ko*G);    % fonction de transfert en boucle fermée (retour unitaire)
     
    subplot(2,1,1);
    semilogx(w,20*log10(abs(B)));
    grid; xlabel('log(w)'); ylabel('G'); title('Diagramme de Bode de la FTBF en gain');
    subplot(2,1,2);
    semilogx(w,unwrap(angle(B))*180/pi);
    grid; xlabel('log(w)'); ylabel('Phi'); title('Diagramme de Bode de la FTBF en phase');
    Si quelqu'un pourrait m'aider se serait vraiment gentil car c'est mon premier programme et je ne gère pas trop !
    merci beaucoup.

  2. #2
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 317
    Par défaut
    Citation Envoyé par syl55 Voir le message
    j'ai le message d'erreur suivant : "Error: Missing variable or function."
    Es-tu sûr ? Je n'ai pas le même message sur ma machine

    Quel est le message d'erreur complet ?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 32
    Par défaut merci de votre réponse
    oui je suis sur, pour preuve : (stabilité est le nom du fichier .m)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ??? stabilité
                |
    Error: Missing variable or function.
     
    >>
    j'ai la version 7.0.0 (R14) de Matlab. Qu'est ce que vous avez vous comme message ?

    merci encore !

  4. #4
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 317
    Par défaut
    Je pense que MATLAB n'apprécie pas les caractères accentués ni dans les noms de fonction, ni dans les noms de variables

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 32
    Par défaut effectivement vous aviez raison !!!!
    j'ai changé le nom de mon fichier ( je l'ai appelé stabilite2.m mais je n'ai rien changé dans le corps du programme) et là je n'ai plus le même message d'erreur !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ??? Error using ==> mrdivide
    Matrix dimensions must agree.
     
    Error in ==> stabilite2 at 12
    F=Kf/(1+Tau*i*w);
    Pourriez vous m'indiquer ce que cela signifie ? quel est le problème avec mon expression de F ?

    merci beaucoup de votre aide !

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 32
    Par défaut si cela peut vous aider
    Je me suis inspiré de ce programme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    %=======================================================================================
    % b) plotting of frequency response as a Bode plot using standard complex number
    % and plotting functions
    %=======================================================================================
     
    % open figure 2 for second frequency response plots
    figure(2);
     
    % create vector of 500 logarithmically spaced (i.e., same number of points per decade)
    % frequencies from 10^-1 = 0.1rad/sec to 10^5 = 100000rad/sec
    w = logspace(-1,5,500);
     
    % define transfer function
    H = 5000*j*w./(500 + j*w);
     
    % divide figure window into two rows, one column, and plot magnitude response in top graph,
    % phase response in bottom graph
    subplot(2,1,1);
    semilogx(w,20*log10(abs(H)));
    grid; ylabel('|H(j\omega)|'); title('Bode Plot: Magnitude Response');
    subplot(2,1,2);
    semilogx(w,unwrap(angle(H))*180/pi);
    grid; xlabel('\omega (rad/sec)'); ylabel('\angleH(j\omega) (\circ)'); title('Bode Plot: Phase Response');
    Il marche très bien sur ma machine et le mien est quasiment la copie conforme sauf que moi il ne marche pas ! j'ai remarqué cependant une différence entre ce programme et le mien c'est la présence d'un "." dans la fonction de transfert H, que signifie ce point ? mon message d'erreur vient t-il de là ?

    merci.

  7. #7
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2007
    Messages
    979
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2007
    Messages : 979
    Par défaut
    Salut,

    Le point signifie que l'opération sera faites terme à terme :

    (x.*y) (i) est égale à x(i)*y(i)
    Alors que :
    x*y est le produit matriciel de x et y.

    Ceci explique l'erreur que tu as obtenu.

    ++

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 32
    Par défaut test
    j'ai essayé de mettre des points un peu partout dans mon programme et maintenant ça marche mais je ne sais pas si les diagrammes de bode qui s'affichent sont les bons car j'ai peut etre mis les points au mauvaise endroit.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    % definition des differentes fonctions de transfert de la PLL. (en phase)
     
    clear all;
    close all;
     
    w=logspace(-1,5,500);
     
    Kc=1;                          % gain du comparateur de phase
     
    Kf=1;                          % fonction de transfert du filtre passe bas de gain Kf, constante de temps Tau                              
    Tau=1;
    F=Kf./(1+Tau*i*w);        
     
    Ko=1;                          % gain du VCO
     
    G=2*pi/i*w;                    % integrateur
     
    % trace des diagrammes de Bode en boucle ouverte et en boucle fermee
     
    figure(1);
     
    A=Kc.*F*Ko.*G;                   % fonction de transfert en boucle ouverte
     
    subplot(2,1,1);
    semilogx(w,20*log10(abs(A)));
    grid; xlabel('log(w)'); ylabel('G'); title('Diagramme de Bode de la FTBO en gain');
     
    subplot(2,1,2);
    semilogx(w,unwrap(angle(A))*180/pi);
    grid; xlabel('log(w)'); ylabel('Phi'); title('Diagramme de Bode de la FTBO en phase');
     
     
    figure(2);
     
    B=(Kc.*F*Ko.*G)./(1+Kc.*F*Ko.*G);    % fonction de transfert en boucle fermee (retour unitaire)
     
    subplot(2,1,1);
    semilogx(w,20*log10(abs(B)));
    grid; xlabel('log(w)'); ylabel('G'); title('Diagramme de Bode de la FTBF en gain');
     
    subplot(2,1,2);
    semilogx(w,unwrap(angle(B))*180/pi);
    grid; xlabel('log(w)'); ylabel('Phi'); title('Diagramme de Bode de la FTBF en phase');
    est ce que vous pourriez me dire si je n'ai pas fait de catastrophe avec mes points ?
    ( j'ai mis des points dans les fonctions de transfert F, A et B)
    merci

  9. #9
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2007
    Messages
    979
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2007
    Messages : 979
    Par défaut
    A priori, ton code devrait bien tourner. On ne fait pas de calcul matriciel pour les fonctions de transferts .

    De plus tu connais les expressions de tes fonctions de transfert. Et tu peux donc vérifier les pentes (-20 dB, -40dB, ...).

    ++ bon courage

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 32
    Par défaut
    merci pour votre aide,

    après avoir faire quelques tests je me suis rendu compte que les diagrammes de bode ne correspondaient pas aux fonctions de transfert ! cependant j'ai trouvé mon erreur, j'ai oublié de mettre des parenthèses à certains endroit. d'où le programme final pour ceux que ça intéresse (on ne sait jamais !)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    % definition des differentes fonctions de transfert de la PLL. (en phase)
     
    clear all;
    close all;
     
    w=logspace(-3,3,500);
     
    Kc=(1);                              % gain du comparateur de phase
     
    Kf=(1);                              % fonction de transfert du filtre passe bas de gain Kf, constante de temps Tau                              
    Tau=(1);
    F=(Kf./(1+Tau.*j.*w));        
     
    Ko=(1);                              % gain du VCO
     
    G=(2*pi./(j.*w));                    % integrateur
     
    % trace des diagrammes de Bode en boucle ouverte et en boucle fermee
     
    figure(1);
     
    A=Kc.*F.*Ko.*G;                       % fonction de transfert en boucle ouverte
     
    subplot(2,1,1);
    semilogx(w,20*log10(abs(A)));
    grid; ylabel('G en dB'); title('Diagramme de Bode de la FTBO en gain');
     
    subplot(2,1,2);
    semilogx(w,unwrap(angle(A))*180/pi);
    grid; xlabel('w en rad/s'); ylabel('Phi en degre'); title('Diagramme de Bode de la FTBO en phase');
     
     
    figure(2);
     
    B=(Kc.*F.*Ko.*G)./(1+Kc.*F.*Ko.*G);  % fonction de transfert en boucle fermee (retour unitaire)
     
    subplot(2,1,1);
    semilogx(w,20*log10(abs(B)));
    grid; ylabel('G en dB'); title('Diagramme de Bode de la FTBF en gain');
     
    subplot(2,1,2);
    semilogx(w,unwrap(angle(B))*180/pi);
    grid; xlabel('w en rad/s'); ylabel('Phi en degre'); title('Diagramme de Bode de la FTBF en phase');

    Personne ne sait comment afficher les marges de phases et de gains sur les diagrammes ??

  11. #11
    Membre Expert
    Homme Profil pro
    Inscrit en
    Mai 2008
    Messages
    2 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 040
    Par défaut
    L'instruction "margin" est faite pour ça.

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 32
    Par défaut
    oui j'ai vu cette instruction dans l'aide de Matlab, mais je n'arrive pas à l'utiliser, pourriez m'indiquer la syntaxe dans le cas de mon programme svp ?

  13. #13
    Membre Expert
    Homme Profil pro
    Inscrit en
    Mai 2008
    Messages
    2 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 040
    Par défaut
    Tu définis la fonction de transfert en BO avec l'instruction tf : BO = tf(...)
    Puis tu exécutes margin(BO)

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 32
    Par défaut
    voici mon programme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    % définition des différentes fonctions de transfert de la PLL. (en phase)
     
    clear all;
    close all;
     
    w=logspace(-3,3,500);
     
    Kc=(1);                              % gain du comparateur de phase
     
    Kf=(1);                              % fonction de transfert du filtre passe bas de gain Kf, constante de temps Tau                              
    Tau=(1);
    F=(Kf./(1+Tau.*j.*w));        
     
    Ko=(1);                              % gain du VCO
     
    G=(2*pi./(j.*w));                    % intégrateur
     
    % tracé des diagrammes de Bode en boucle ouverte et en boucle fermée
     
    figure(1);
     
    A=Kc.*F.*Ko.*G;                      % fonction de transfert en boucle ouverte
     
    subplot(2,1,1);
    semilogx(w,20*log10(abs(A)));
    grid; ylabel('G en dB'); title('Diagramme de Bode de la FTBO en gain');
     
    subplot(2,1,2);
    semilogx(w,unwrap(angle(A))*180/pi);
    grid; xlabel('w en rad/s'); ylabel('Phi en degré'); title('Diagramme de Bode de la FTBO en phase');
     
     
    figure(2);
     
    B=(Kc.*F.*Ko.*G)./(1+Kc.*F.*Ko.*G);  % fonction de transfert en boucle fermée (retour unitaire)
     
    subplot(2,1,1);
    semilogx(w,20*log10(abs(B)));
    grid; ylabel('G en dB'); title('Diagramme de Bode de la FTBF en gain');
     
    subplot(2,1,2);
    semilogx(w,unwrap(angle(B))*180/pi);
    grid; xlabel('w en rad/s'); ylabel('Phi en degré'); title('Diagramme de Bode de la FTBF en phase');
    je voudrais avoir les marges de phases et de gains des fonctions de transfert A et B, mais quand je tape margin(A); ou margin(B); cela ne marche pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ??? Error using ==> margin
    Not enough input arguments.
     
    Error in ==> stabilite2 at 31
    margin(A);
    savez vous comment corriger cette erreur ?
    merci

  15. #15
    Membre Expert
    Homme Profil pro
    Inscrit en
    Mai 2008
    Messages
    2 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 040
    Par défaut
    Margin utilise la FTBO en symbolique !

    Tu peux la définir aussi avec le numérateur et le dénominateur sous formes matricielles :
    BO=tf(N D);

  16. #16
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 32
    Par défaut
    ça veut dire que je ne peux pas demander les marges avec mon programme ? car mes fonctions de transfert ne sont pas définies par FTBO=tf... ?

  17. #17
    Membre Expert
    Homme Profil pro
    Inscrit en
    Mai 2008
    Messages
    2 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 040
    Par défaut Bode
    Tu peux avoir les marges avec : [Gm,Pm,Wcg,Wcp] = margin(BO).
    Ou le tracé avec : margin(BO).
    Dans ton cas,si je ne me trompe pas :
    Code :
    BO=tf(Kf*Kc*Ko*2*pi,[Tau 1 0]);

  18. #18
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 32
    Par défaut
    super ça marche.

    c'est bon , il faut juste rajouter grid pour avoir la grille sur le graph;

    merci à vous.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 31/01/2014, 12h15
  2. tracé d'un diagramme de bode
    Par bendesarts dans le forum MATLAB
    Réponses: 1
    Dernier message: 15/10/2010, 00h01
  3. Réponses: 0
    Dernier message: 12/10/2010, 17h10
  4. Tracé un diagramme de Bode
    Par franckov dans le forum Simulink
    Réponses: 1
    Dernier message: 13/06/2008, 12h33
  5. Tracer un diagramme de Bode
    Par ricciheig dans le forum Signal
    Réponses: 2
    Dernier message: 20/05/2007, 18h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo