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 :

Afficher une surface à partir d'une équation "Somme de...jusqu'à"


Sujet :

MATLAB

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 80
    Points : 54
    Points
    54
    Par défaut Afficher une surface à partir d'une équation "Somme de...jusqu'à"
    Bonjour,

    Sous matlab je voudrais afficher en 3D la fonction Bm suivante:

    N = 200
    mmax = 32
    k(m) = N/mmax * m

    Bm = sum pour p variant de k(m) à N, de nchoosek(N, p) * (m/mmax)^p * (1-m/mmax)^(N-p)

    avec sur l'axe des x: m variant de 1 à 32
    avec sur l'axe des y: k(m) qui prend les valeurs N/mmax, N*2/mmax, ..., N
    et enfin la valeur Bm sur l'axe des z.

    Voila si qqn pouvais me mettre sur la bonne voie ?

    Merci

  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 304
    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 304
    Points : 52 886
    Points
    52 886
    Par défaut
    Pourrais-tu être plus précis ? Quel est le problème ?

    As-tu déjà calculé Bm ?
    Veux-tu afficher un nuage de points ou une surface ?

    As-tu déjà essayé de coder quelque chose ?
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, 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)

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 80
    Points : 54
    Points
    54
    Par défaut
    la fonction Bm est défini sur les entiers m=1, 2, 3, ... 32.
    les valeurs k(m) se déduisent de m.
    Donc si j'ai au moins l'affichage de points localisé ca me va. (apres si on peut avoir mieux du genre une nape (par interpolation donc) je suis preneur aussi.
    Oui j'ai déjà codé qqch en c++ qui me permet de calculer Bm donc cest qqch qui se calcul cest ok.

    Je fais appel à matlab pour afficher en 3D et en qqs lignes.

    Sinon en matlab j'ai cherché comment calculer les coef binomiaux : nchoosek.

    that's all

  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 304
    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 304
    Points : 52 886
    Points
    52 886
    Par défaut
    Dans un premier temps, utilise MESHGRID pour générer tous les couples (x,y) correspondant aux valeurs calculées de Bm et utilise plot3 pour les afficher :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Bm=...;
    [x,y]=meshgrid(...,...);
     
    figure
    plot3(x(:),y(:),Bm(:))
    On verra ensuite pour améliorer l'affichage
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, 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)

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 80
    Points : 54
    Points
    54
    Par défaut
    merci pour tes indications

    alors : [X,Y] = meshgrid(1:1:32, 200/32:200/32:200) pour générer (x, y)
    puis Y = floor(Y) car il faut des valeurs entieres.
    mais comment écrire
    Bm = sum pour p variant de k(m) à N, de nchoosek(N, p) * (m/mmax)^p * (1-m/mmax)^(N-p)

    en matlab ?

    (en fait est ce possible d'éviter l'écrire d'une boucle pour calculer les Bm, en utilisant une fonction de matlab?)

    thx

  6. #6
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 304
    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 304
    Points : 52 886
    Points
    52 886
    Par défaut
    Pour le début, tu peux faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    N = 200;
    mmax = 32;
    k=linspace(N/mmax,N,mmax);
    Ensuite j'ai un doute :

    Le second argument de NCHOOSEK dois être un entier. Or k (donc p) n'est pas constitué que d'entiers => bug
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, 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)

  7. #7
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 304
    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 304
    Points : 52 886
    Points
    52 886
    Par défaut
    Citation Envoyé par jhonnyBravo Voir le message
    (en fait est ce possible d'éviter l'écrire d'une boucle pour calculer les Bm, en utilisant une fonction de matlab?)
    Je ne pense pas (à cause de l'appel à NCHOOSEK). Mais tu peux préallouer la matrice Bm pour optimiser ton code

    => Qu'est-ce que la préallocation de mémoire ?
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, 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)

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 80
    Points : 54
    Points
    54
    Par défaut
    j'ai essayé ca :

    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
     
    N=200;
    mmax=32 ;
     
    Bm=zeros(1, 32) ;
    for m =1:32
        km = floor(N*m/mmax)  ;
        for p = km:N
            Bm(m) = Bm(m) + nchoosek(N, p) * (m/mmax)^p * (1-m/mmax)^(N-p) ;
        end
    end
     
    [x,y] = meshgrid(1:1:mmax, N/mmax:N/mmax:N) ;
    y = floor(y)  ;
    figure
    plot3(x(:),y(:),Bm(:))
    j'obtiens ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    In nchoosek at 55
      In mybin at 9
    Warning: Result may not be exact. Coefficient is greater than 10^15,
             and is only good to 15 digits.
    les nombres sont trop grands, en c++ j'utilisé une libraire pour faire du calcul sur les grands nombres.

    Une solution ?

  9. #9
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 304
    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 304
    Points : 52 886
    Points
    52 886
    Par défaut
    Citation Envoyé par jhonnyBravo Voir le message
    en c++ j'utilisé une libraire pour faire du calcul sur les grands nombres.
    Tu devrais pouvoir englober ta librairie dans un fichier Mex : MEX-files Guide
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, 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)

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 80
    Points : 54
    Points
    54
    Par défaut
    merci, je m'en suis sorti, c'est zolie

  11. #11
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 304
    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 304
    Points : 52 886
    Points
    52 886
    Par défaut
    Citation Envoyé par jhonnyBravo Voir le message
    je m'en suis sorti
    Comment ?
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, 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)

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 80
    Points : 54
    Points
    54
    Par défaut
    Pour certaine valeurs matlab s'en sort très bien (jai comparé avec les résultats obtenus avec mon code c++) et à la place de nchoosek
    j'ai utilisé
    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
     
    % binomial.m by David Terr, Raytheon, 5-11-04
     
    % Given nonnegative integers n and m with m<=n, compute the 
    % binomial coefficient n choose m. 
     
    function bc = binomial(n,m)
     
    if 2*m <= n
        m1 = m;
    else
        m1 = n-m;
    end
     
    if n <= 100
        size = abs( n-m1 ) + 1;
        ps = pascal( size );
        bc = ps( size, m1+1 );
    else    % suggested by Greg von Winckel to improve speed for large input
        bc = exp( gammaln(n+1) - gammaln(n-m+1) - gammaln(m+1) );
    end
    téléchargeable sur le site de mathworks.

    et l'algo est en fait:
    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
     
    N=200;
    mmax=32 ;
     
    Km = zeros(1, 32);
    for m=1:32
        Km(m) = floor(N*(m/mmax)^1); 
    end
     
    Bm=zeros(32, 32) ;
    for m =1:32
        for i=1:32 
            for p = Km(i):N
                Bm(i, m) = Bm(i, m) + binomial(N, p) * (m/mmax)^p * (1-m/mmax)^(N-p) ;
            end
            Bm(i, m) = -log10(mmax*Bm(i, m));
        end
    end
     
     
    [x,y] = meshgrid(1:1:mmax, N/mmax:N/mmax:N) ;
    y = floor(y)  ;
    figure
    plot3(x(:),y(:),Bm(:), '+')
    M'enfin ce qui pourrait servir à quelquun dautre aurait été comment gérer le calcul sur les grands nombres, question ouverte.

  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 304
    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 304
    Points : 52 886
    Points
    52 886
    Par défaut
    Quelques modifications à ton code :
    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
    N=200;
    mmax=32 ;
     
    Km=floor(linspace(N/mmax,N,mmax));
     
    Bm=zeros(32, 32) ;
    for m =1:32
        for i=1:32 
            for p = Km(i):N
                Bm(i, m) = Bm(i, m) + binomial(N, p) * (m/mmax)^p * (1-m/mmax)^(N-p) ;
            end
            Bm(i, m) = -log10(mmax*Bm(i, m));
        end
    end
     
    figure  
     
    [x,y] = meshgrid(1:1:mmax, Km) ;
    plot3(x(:),y(:),Bm(:), 'r+')
     
    hold on
     
    surf(1:1:mmax,Km,Bm)
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, 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)

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 80
    Points : 54
    Points
    54
    Par défaut
    thx

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

Discussions similaires

  1. Tracage d'une surface à partir d'une grille
    Par CocoRicOo dans le forum MATLAB
    Réponses: 3
    Dernier message: 01/05/2011, 16h01
  2. [Batch] Créer une chaine à partir d'une variable et d'une autre chaine
    Par mlle lain dans le forum Scripts/Batch
    Réponses: 1
    Dernier message: 10/11/2009, 16h26
  3. Saisir une image à partir d'une photo ou d'une vidéo
    Par lohengrin56 dans le forum Flash/Flex
    Réponses: 0
    Dernier message: 07/07/2009, 16h17
  4. Réponses: 2
    Dernier message: 05/01/2009, 12h45
  5. Réponses: 5
    Dernier message: 22/05/2008, 14h42

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