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
    Candidat au Club
    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/Paradox..._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 éminent sénior
    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à )
    Cette signature n'a pas pu être affichée car elle comporte des erreurs.

  3. #3
    Candidat au Club
    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 éminent sénior
    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.
    Cette signature n'a pas pu être affichée car elle comporte des erreurs.

  5. #5
    Candidat au Club
    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 éminent sénior
    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)
    Cette signature n'a pas pu être affichée car elle comporte des erreurs.

  7. #7
    Candidat au Club
    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 éminent sénior
    Ouille... !

    Dans ta boucle tu fais :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    p(i)=i;

    Puis :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    p=(1-s)*100
    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 ?
    Cette signature n'a pas pu être affichée car elle comporte des erreurs.

  9. #9
    Candidat au Club
    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 !

  10. #10
    Expert éminent sénior
    Et donc c'est la courbe que tu attendais ?
    On peut voir ton code final ?
    Cette signature n'a pas pu être affichée car elle comporte des erreurs.

  11. #11
    Candidat au Club
    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

    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 :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    s = (366-i)/365;


    Autre chose, p(i)=i ne sert à rien puisque la valeur est automatiquement écrasée juste après
    Mes compétences :
    • conception mécanique 3D (Autodesk Fusion 360)
    • développement informatique (MATLAB, Python, C, VBA)
    • impression 3D (Ultimaker)
    • programmation de microcontrôleur (Microchip PIC et Arduino)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  13. #13
    Candidat au Club
    ok mais que faire alors, je ne vois pas où vous voulez en venir .

  14. #14
    Expert éminent sénior
    De plus pourquoi fais-tu :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    bar(k,p(i))
    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 :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    bar(k,p);
    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.
    Cette signature n'a pas pu être affichée car elle comporte des erreurs.

  15. #15
    Rédacteur/Modérateur

    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)
    Mes compétences :
    • conception mécanique 3D (Autodesk Fusion 360)
    • développement informatique (MATLAB, Python, C, VBA)
    • impression 3D (Ultimaker)
    • programmation de microcontrôleur (Microchip PIC et Arduino)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  16. #16
    Candidat au Club
    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

    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)
    Mes compétences :
    • conception mécanique 3D (Autodesk Fusion 360)
    • développement informatique (MATLAB, Python, C, VBA)
    • impression 3D (Ultimaker)
    • programmation de microcontrôleur (Microchip PIC et Arduino)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  18. #18
    Rédacteur/Modérateur

    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)
    Mes compétences :
    • conception mécanique 3D (Autodesk Fusion 360)
    • développement informatique (MATLAB, Python, C, VBA)
    • impression 3D (Ultimaker)
    • programmation de microcontrôleur (Microchip PIC et Arduino)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  19. #19
    Rédacteur/Modérateur

    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é ²
    Mes compétences :
    • conception mécanique 3D (Autodesk Fusion 360)
    • développement informatique (MATLAB, Python, C, VBA)
    • impression 3D (Ultimaker)
    • programmation de microcontrôleur (Microchip PIC et Arduino)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  20. #20
    Candidat au Club
    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.

###raw>template_hook.ano_emploi###