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

Interfaces Graphiques Discussion :

Courbe d'un produit (PI) d'une fonction


Sujet :

Interfaces Graphiques

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 11
    Par défaut Courbe d'un produit (PI) d'une fonction
    Bonjour, j'ai un projet Matlab à rendre pour la semaine prochaine, et je bloque sur la fin.
    Mon projet est sur le paradoxe des anniversaires (http://fr.wikipedia.org/wiki/Paradoxe_des_anniversaires).

    J'ai créé pour cela une Interface graphique avec des boutons permettant de définir combien de personne il y a dans la pièce (incrémente une variable "compteur")
    Je calcule le résultat de la probabilité (qui s'affiche).

    Et la où je bloque, c'est que j'aimerais représenter sous forme d'un graphique type immeubles mon résultat.
    Avec en abscisse le nb de personne (allant de 1 à compteur) et en ordonnée le pourcentage (allant de 0 à 100%)

    Ex: Si je rentre 5 dans compteur, j'aurai un graphique composé de 5 immeubles de hauteur égale à leur probabilité.

    J'ai programmé quelque chose, mais je ne comprend pas pourquoi cela ne marche pas !!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function calculer(hObject,eventdata)
    global compteur handles p
    k=1:compteur;
    s = prod ((366-k)/365);
    p=(1-s)*100
    % Actualisation de la propriété String de l'objet Uicontrol Text calculer
    set(handles(5),'string',num2str(p));
    La fonction calculer marche, je l'ai jointe pour la compréhension

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    function courbe(hObject,eventdata)
    global compteur
     
     k=1:1:compteur
        i=1:k
        s = prod ((366-i)/365);
        p=(1-s)*100
    subplot(2,1,1)
    plot(k,p)
    En espérant avoir été le plus clair possible
    Merci d'avance pour votre aide, qui me serait précieuse.

    Benoit

  2. #2
    Expert confirmé
    Avatar de Caro-Line
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9 458
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9 458
    Par défaut
    Qu'est-ce qui ne marche pas ?

    Note : d'après toi que vaut i dans ta 2ème fonction ?
    (à mon avis ton problème vient de là )

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 11
    Par défaut
    Ce qui ne marche pas, c'est que je n'obtiens pas de courbe (à défaut d'immeubles car je ne sais pas comment faire pour le moment)

    Dans ma 2ème fonction, i vaut (si le compteur est à 3 par ex) successivement : i = 1
    i = 1 2
    i = 1 2 3
    (a moins que cela ne soit avec une boucle for (chose que j'ai aussi essayé))

  4. #4
    Expert confirmé
    Avatar de Caro-Line
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9 458
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9 458
    Par défaut
    Citation Envoyé par lebronjames44 Voir le message
    Dans ma 2ème fonction, i vaut (si le compteur est à 3 par ex) successivement : i = 1
    i = 1 2
    i = 1 2 3
    Et bien non puisque justement il n'y a pas de boucle, c'est ça qui est étrange.
    Du coup i est un scalaire, donc s et p aussi, donc ce que tu traces est une ligne (quelque soit k la valeur de p est la même).
    Il faut donc que tu construises le vecteur p.

    Ensuite pour tes "immeubles" (je n'ai jamais entendu ce terme), regarde du côté de la fonction BAR.

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 11
    Par défaut
    Ok d'accord, j'ai essayé avec une boucle for (for i=1:k), mais je ne vois pas comment construire le vecteur p !

  6. #6
    Expert confirmé
    Avatar de Caro-Line
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9 458
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9 458
    Par défaut
    Je ne sais pas quel est ton niveau en MATLAB, mais si tu es débutant, un exemple simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for i=1:5
       v(i)=i;
    end
    Plus "propre" avec la pré-allocation quand on connait en avance la taille du vecteur (Cf Qu'est-ce que la préallocation de mémoire ?):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    v=zeros(1,5);
    for i=1:5
       v(i)=i;
    end
    Et ta boucle devra aller de 1 à compteur pas de 1 à k (k étant un vecteur)

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 11
    Par défaut
    En effet je suis débutant!
    Je pense avoir compris votre précédent message, et pourtant ce la ne marche pas. Pourquoi?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    k=1:1:compteur
        %p=zeros(1:100);
        for i=1:compteur
        p(i)=i;
            s = prod ((366-i)/365);
        p=(1-s)*100
    subplot(2,1,1)
    plot(k,p)
    %bar(k,p,'b')
        end

  8. #8
    Expert confirmé
    Avatar de Caro-Line
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9 458
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9 458
    Par défaut
    Ouille... !

    Dans ta boucle tu fais :Puis :Donc p redevient un scalaire.

    Un exemple pour comprendre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    for i=1:3
       a(i)=2;
       disp('a est un vecteur : ');
       disp(a);
       a=2;
       disp('a est un scalaire');
       disp(a);
    end
    Essaye maintenant de réfléchir en terme algo sur ton problème car là tu n'as pas vraiment placé la boucle au bon endroit.
    Donc réponds à ces questions :
    - sur quoi veux-tu boucler ?
    - à chaque boucle que veux-tu calculer ?

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 11
    Par défaut
    Ok pour mon erreur de vecteur, je pense l'avoir corrigée.

    Quant au for, je sais bien ce que je veux faire, mais j'ai peu de notion matlab et je n'arrive pas résonner.

    Ce que je veux, c'est une courbe représentant p en fonction de k.
    Donc je vais faire varier k entre 1 et le compteur et donc boucler p pour le faire varier selon k (??)
    Soit p(k=1) , p(k=2) , ... , p(k=compteur)

    Ci-joint, ma courbe s'affichant !
    Images attachées Images attachées  

  10. #10
    Expert confirmé
    Avatar de Caro-Line
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9 458
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9 458
    Par défaut
    Et donc c'est la courbe que tu attendais ?
    On peut voir ton code final ?

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 11
    Par défaut
    Bah non justement, ma courbe est celle de l'équation y=x.

    Or moi, mes 1ere valeur sont :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    p(1)=0
    p(2)=0.27
    p(3)=0.82
    p(4)=1.64
    p(5)=2.71
    p(6)=4.05
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    k=1:1:compteur;
        %p=zeros(1:100);
        for i=1:compteur
        p(i)=i;
            s = prod ((366-i)/365);
        p(i)=(1-s)*100;
    subplot(2,1,1)
    %plot(k,p)
    bar(k,p(i))
        end

  12. #12
    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 qu'il y a un problème avec cette ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    s = prod ((366-i)/365);
    SI tu la mets dans un boucle sur i, le terme (366-i)/365 est un scalaire à chaque itération, donc PROD n'a aucun intérêt.
    Cela revient à faire :

    Autre chose, p(i)=i ne sert à rien puisque la valeur est automatiquement écrasée juste après

  13. #13
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 11
    Par défaut
    ok mais que faire alors, je ne vois pas où vous voulez en venir .

  14. #14
    Expert confirmé
    Avatar de Caro-Line
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9 458
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9 458
    Par défaut
    De plus pourquoi fais-tu :
    L'objectif de la boucle est de construire un vecteur que tu pourras donner en argument de bar, pas de construire les barres une par une.

    Cette commande doit donc être sortie de la boucle et être simplement :
    Et pour la boucle...c'est pour ça que je te disais de penser d'abord algo avant d'écrire le code.
    Essaye de formaliser déjà la succession des étapes en français et je te jure qu'ensuite le code viendra presque tout seul.

  15. #15
    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 viens de jeter un oeil au lien Wikipédia

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    N = 50;
     
    pt(1) = 1;
    for n = 1:N-1
        pt(n+1) = pt(n) * (1-n/365);
    end
     
    p = 1-pt;
     
    figure
    bar(p)

  16. #16
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 11
    Par défaut
    Ok, mais c'est la méthode que je m'efforce de suivre depuis le début.

    - Je définis mon compteur
    - Je dis à mon k d'aller de 1 à compteur ( axes des abscisses )
    - Je dis à mon p de calculer les valeurs selon k ( p(1), p(2), ..., p(compteur))
    - Je trace p en fonction de k

  17. #17
    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
    Et donc , pour avoir les résultats intermédiaire avec la toute première méthode que tu as proposée dans ton premier message :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    N = 50;
     
    for i = 1:N
        k=1:i; % k va de 1 jusqu'à i, pas jusqu'à N
        s = prod ((366-k)/365);
        p(i)=(1-s)*100;
    end
     
    figure
    bar(p)

  18. #18
    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
    La preuve que ça marche :

    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
    figure
     
    N = 50;
     
    pt(1) = 1;
    for n = 1:N-1
        pt(n+1) = pt(n) * (1-n/365);
    end
    p = 1-pt;
     
    subplot(211)
    bar(p)
     
    clear p
     
    for i = 1:N
        k=1:i;
        s = prod ((366-k)/365);
        p(i)=(1-s)*100;
    end
     
    subplot(212)
    bar(p)

  19. #19
    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
    En relisant tout depuis le début... je me rend compte que cette discussion est assez... paradoxale (comme le sujet )

    En gros il te suffisait de remplacer PLOT par BAR avec un HOLD ON dès ton premier message, et le tour était joué ²

  20. #20
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 11
    Par défaut
    Ok, en effet cela fonctionne très bien. Et surtout j'ai compris le mauvais placement de ma boucle for.

    Je vous remercie tous les 2 de m'avoir aidé pédagogiquement.

Discussions similaires

  1. Réponses: 6
    Dernier message: 17/11/2012, 14h54
  2. [Débutant] afficher courbe d'une fonction
    Par mmplv dans le forum MATLAB
    Réponses: 1
    Dernier message: 10/05/2011, 18h40
  3. Affiner une courbe à l'aide d'une fonction cosinus
    Par momo032114 dans le forum MATLAB
    Réponses: 0
    Dernier message: 12/08/2008, 16h42
  4. Expression d'une fonction à partir d'une courbe
    Par ramrouma dans le forum MATLAB
    Réponses: 2
    Dernier message: 08/01/2007, 17h52
  5. Réponses: 1
    Dernier message: 25/12/2006, 16h03

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