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 :

Tracer une fonction avec conditions sur variable


Sujet :

MATLAB

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 61
    Points : 31
    Points
    31
    Par défaut Tracer une fonction avec conditions sur variable
    Bonjour,

    je souhaites tout simplement tracer la fonction suivant avec MATLAB

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    f(t)=asin(wt)+C si sin(wt)>0
    f(t)=C sinon
    En gros c'est une sinusoïde qui est filtre avec un pont de diode a laquelle on rajoute un offset C en sortie pour décaler le signal.

    Comment fait ton pour instaurer de telles conditions sous matlab?

    Merci
    Jeremy

  2. #2
    Expert confirmé
    Avatar de duf42
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Novembre 2007
    Messages
    3 111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Formateur en informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 111
    Points : 4 661
    Points
    4 661
    Par défaut
    Bonsoir,

    Je peux pas tester mais est-ce que quelquechose du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    f(t)=max(asin(wt)+C, C);
    Pourrait convenir?

    Bonne soirée,
    Duf

  3. #3
    Modérateur

    Homme Profil pro
    Ingénieur en calculs scientifiques
    Inscrit en
    Août 2007
    Messages
    4 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur en calculs scientifiques

    Informations forums :
    Inscription : Août 2007
    Messages : 4 639
    Points : 7 614
    Points
    7 614
    Par défaut
    Cela suppose que a est positif, non?

    Sinon pourquoi ne pas faire une bonne vieille boucle avec une condition?

  4. #4
    Expert confirmé
    Avatar de duf42
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Novembre 2007
    Messages
    3 111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Formateur en informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 111
    Points : 4 661
    Points
    4 661
    Par défaut
    Ah oui tout à fait, j'avais pas pensé à toutes les conditions

    Cela dit, il doit quand même y avoir un moyen d'éviter de faire une boucle (en mettant une condition sur le signe de A je pense car sauf autre erreur de ma part, la valeur limite est toujours C)

    [EDIT] Donc plutôt un truc du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if (a>0)
    f(t)=max(a*sin(w*t)+C, C);
    else
    f(t)=min(a*sin(w*t)+C, C);
    end

  5. #5
    Modérateur

    Homme Profil pro
    Ingénieur en calculs scientifiques
    Inscrit en
    Août 2007
    Messages
    4 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur en calculs scientifiques

    Informations forums :
    Inscription : Août 2007
    Messages : 4 639
    Points : 7 614
    Points
    7 614
    Par défaut
    Maintenant je suis d'accords!

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 61
    Points : 31
    Points
    31
    Par défaut
    Oui a est forcement positif

    j'ai essaye ca comme code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    for t=0:0.01:10
       if sin(o*t)>0
          y=a*sin(o*t)+c;
       else
          y=c;
       end
    end
    plot(t,y)
    mais la figure ne m'affiche aucune courbe!

  7. #7
    Modérateur

    Homme Profil pro
    Ingénieur en calculs scientifiques
    Inscrit en
    Août 2007
    Messages
    4 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur en calculs scientifiques

    Informations forums :
    Inscription : Août 2007
    Messages : 4 639
    Points : 7 614
    Points
    7 614
    Par défaut
    Si a est forcément positive, alors utilise la première solution de duf42 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    f(t)=max(asin(wt)+C, C);
    Si tu n'es pas sûr que a soit toujours positive alors utilise la deuxième solution toujours proposé par duf42 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if (a>0)
    f(t)=max(a*sin(w*t)+C, C);
    else
    f(t)=min(a*sin(w*t)+C, C);
    end
    Le mieux serait que tu comprennes ces codes afin que tu puisse les refaire tout seul...

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 61
    Points : 31
    Points
    31
    Par défaut
    j'ai finalement utilise la premiere methode de Duf, malheureusement j'ai toujours le meme probleme, j'ai les valeurs mais pas de courbes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    a=3;
    o=30;
    c=-0.5;
    for t=0:0.1:10
        y=max(a*sin(o*t)+c,c)
    end
    t=0:0.1:10;
    plot(t,y);
    Et puis rien sur la figure
    [EDIT]
    Oui il a effectivement une courbe, mais en fait c'est une constante y=c
    Pourtant au vu des valeurs y n'est pas une constante

  9. #9
    Modérateur

    Homme Profil pro
    Ingénieur en calculs scientifiques
    Inscrit en
    Août 2007
    Messages
    4 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur en calculs scientifiques

    Informations forums :
    Inscription : Août 2007
    Messages : 4 639
    Points : 7 614
    Points
    7 614
    Par défaut
    Bon, alors duf42 te propose une méthode sans boucle, et toi tu en rajoute une!

    Mais bon, à la limite cela te permet de comprendre le principe.
    Il y a une erreur de programmation dans ton code : dans la boucle for, à chaque itération, tu viens écraser la valeur de y, donc au final tu auras "y = à la dernière valeur".

    Pour éviter cela il faut placer les différentes valeurs de y dans un tableau. Je te laisse chercher un peu pour faire cela.

    Une deuxième méthode consiste à ne pas utiliser de boucle : le calcul de y se fait une ligne.

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 61
    Points : 31
    Points
    31
    Par défaut
    Oui ca y'est j'ai trouve, effectivement j'ai créer un tableau (n,1)

    Merci beaucoup

  11. #11
    Modérateur

    Homme Profil pro
    Ingénieur en calculs scientifiques
    Inscrit en
    Août 2007
    Messages
    4 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur en calculs scientifiques

    Informations forums :
    Inscription : Août 2007
    Messages : 4 639
    Points : 7 614
    Points
    7 614
    Par défaut

    Et maintenant
    le même code, mais sans boucle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    a=3;
    o=30;
    c=-0.5;
    t=0:0.1:10;
    y=max(a*sin(o*t)+c,c)
    plot(t,y);

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 61
    Points : 31
    Points
    31
    Par défaut
    Re bonjour,


    alors je suis en train de ploter une differente fonction finalement seulement j'ai un probleme avec cette indexation dans un tableau (car cette fois ci la boucle est indispensable)

    par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    for t=0:0.1:10
    X(t)=1;
    end
    ca me renvoi un message d'erreur!
    ou est-ce que j'ai fais une erreur?

    Merci
    jeremy

  13. #13
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 309
    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 309
    Points : 52 901
    Points
    52 901

  14. #14
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 61
    Points : 31
    Points
    31
    Par défaut
    Merci pourtant j'ai bien essaye de remplir ces conditions avec ca

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    X=[0:0.1:10];
    for a=0:0.1:10
    b=a*10+1;
    X(b)=2;
    end
    Je comprends pas pourquoi ca ne marche toujours pas

  15. #15
    Modérateur

    Homme Profil pro
    Ingénieur en calculs scientifiques
    Inscrit en
    Août 2007
    Messages
    4 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur en calculs scientifiques

    Informations forums :
    Inscription : Août 2007
    Messages : 4 639
    Points : 7 614
    Points
    7 614
    Par défaut
    Salut,

    dans ton message d'erreur il y a écrit cela :
    ??? Subscript indices must either be real positive integers or logicals.

    Tu peux forcer b à être un entier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    X=[0:0.1:10];
    for a=0:0.1:10
    b=a*10+1
    X(round(b))=2;
    end

  16. #16
    Modérateur

    Homme Profil pro
    Ingénieur en calculs scientifiques
    Inscrit en
    Août 2007
    Messages
    4 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur en calculs scientifiques

    Informations forums :
    Inscription : Août 2007
    Messages : 4 639
    Points : 7 614
    Points
    7 614
    Par défaut
    Et pourquoi ne pas faire directement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    X=[0:0.1:10];
    for a=1:101
    X(a)=2;
    end
    et sans boucle :
    X(1:101)=2;

  17. #17
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 61
    Points : 31
    Points
    31
    Par défaut
    Merci beaucoup, ca marche comme ca, seulement je crois que j'ai un probleme dans l'algo,

    je veux une sinusoide d'amplitue a qui croit deux fois plus vite qu'elle ne decroit(o1=02/3 avec o la pulsation propre) avec toujours un offset -c

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    si cos(o1*t)>0
    y=(max(a*sin(o1*t)-c,-c)
    sinon
    y=(max(a*sin(o1*t)-c,-c)
    J'obtien une droite affine partant de -c en x=0

    Quelqu'un aurait une petite idee? ( Peut etre que cela est plus une question mathematique, dans ce cas la desole)

    jeremy

Discussions similaires

  1. Réponses: 1
    Dernier message: 14/08/2009, 12h19
  2. MAJ d'un champ d'une table avec condition sur clef primaire commune
    Par ar|equin dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 15/05/2007, 13h57
  3. [VBA-E] Minimum d'une colonne avec condition sur autre colonne
    Par Currahee dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 10/05/2007, 17h01
  4. Comment tracer une fonction complexe de 2 variables ?
    Par Mad__Max dans le forum MATLAB
    Réponses: 7
    Dernier message: 11/04/2007, 00h13

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