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 :

Affichage 3D de p(r,phi,z)


Sujet :

MATLAB

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 10
    Points : 6
    Points
    6
    Par défaut Affichage 3D de p(r,phi,z)
    Bonjour à tous,

    Je cherche actuellement à représenter la distribution de pression dans un cylindre avec MATLAB.
    Une image sera plus utile qu'un long discours, je voudrais avoir un résultat à peu près comme ça :


    J'ai une expression de la pression, en coordonnées cylindriques. Et après avoir essayer plusieurs solutions trouvées sur internet je n'ai pas trouvé mon bonheur.

    Dans l'absolu, je n'ai pas besoin de représenter tout mon volume. Une solution à laquelle j'ai pensé est de créer un cylindre comme sur cette image
    auquel on ajouterait les surfaces à chaque extrémité. Mais je n'ai pas réussi à réaliser cela.

    Quelqu'un a-t-il une solution?

    PS:Mon niveau en MATLAB est plutôt débutant

  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 302
    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 302
    Points : 53 166
    Points
    53 166
    Par défaut
    Quelle est la forme de tes données ?
    Sont-elles réparties sur une grille régulière le long du cylindre ?
    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
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    J'ai simplement une equation de la forme (j'ai mis les variables en gras) :

    p(r,ϕ,z)= cos⁡(lπz/L).cos⁡(nϕ).J(α.r/R)
    avec J une fonction de bessel du premier ordre.

    donc pour la répartition des valeurs c'est moi qui décide.
    Je peut donc créer les vecteurs R, ϕ et z avec un espacement régulier.

  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 302
    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 302
    Points : 53 166
    Points
    53 166
    Par défaut
    Un exemple :
    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
    [theta,z] = meshgrid(0:pi/50:2*pi,1:30);
    rho = ones(size(theta));
    p = z.*cos(theta);
     
    [x,y,z] = pol2cart(theta,rho,z);
     
    figure
     
    surf(x,y,z,p,'edgecolor','none')
     
    hold on
     
    patch(x(1,:),y(1,:),z(1,:),p(1,:)); % Face inferieure
    patch(x(end,:),y(end,:),z(end,:),p(end,:)); % Face superieure
     
    axis vis3d
    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
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    Merci beaucoup pour ta réponse et ta rapidité,
    Je testerais ça lundi matin! (je n'ai pas matlab chez moi!)

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    J'ai aujourd'hui essayer le code proposé, mais malheuresement un problème persiste. En effet, sur les deux surfaces patch, la répartition des couleurs ne se fait pas suivant mon équation. Sur l'image suivante, il y a à gauche le résultat que j'ai actuellement. Or je voudrais que la surface "patch" soit comme celle de droite (image qui a été créé avec surf, donc c'est une surface 3D, qui est ici vu du dessus)


    Est-il possible de modifier la fonction patch pour répondre à mon besoin?
    (Je n'ai pas encore vraiment compris comment fonctionne la fonction patch)

    Edit: Dans le code au dessus il y a :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rho = ones(size(theta));
    Dans ce cas rho a toujours la meme valeur, pour mes surfaces inférieurs et supérieur, dois-je modifié cela?

  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
    Bonjour,

    peux tu nous montrer le code qui t'a permis d'obtenir ces 2 tracés?
    Pour une bonne utilisation des balises code c'est ici!
    Petit guide du voyageur MATLABien : Le forum La faq Les tutoriels Les sources


    La nature est un livre écrit en langage mathématique. Galilée.

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    Alors voici le code que j'ai utilisé pour avoir une seule surface :
    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
     
    n=2;%bessel fonction oredr n
    m=1;%mth root
     
    alpha=find_pth_bessel_root(n,m) %fonction qui retourne un coefficient alpha fonction de m et n
    N=400; %nb of point
    R=0.15;%diameter
     
     
    R1=linspace(0,R,N);
    theta1=linspace(0,2*pi,N);
    [r,theta]=meshgrid(R1,theta1);
    X=r.*cos(theta);
    Y=r.*sin(theta);
     
    p=besselj(n,alpha*r/R).*cos(n*theta);
     
    surf(X,Y,p,'edgecolor','none');
    colormap jet;
    Le résultat de ce code est :

    ensuite j'ai essayé d'utiliser le code de DUT :
    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
     n=2;%bessel fonction oredr n
    m=1;%mth root
    l=0;
     
    alpha=find_pth_bessel_root(n,m)
    Nt=400; %nb of point
    Nl=400; %nb of point
    R=0.15;%diameter
    L=0.1%cylinder length
     
     
     
     
    [theta,z]=meshgrid(linspace(0,2*pi,Nt),linspace(0,L,Nl));
    rho=R*ones(size(theta));
     
    p=cos(l*pi*z/L).*besselj(n,alpha*rho/R).*cos(n*theta);
     
    [x,y,z]=pol2cart(theta,rho,z);
     
    figure(2)
    surf(x,y,z,p,'edgecolor','none');
    colormap jet;
     
    hold on
     
    patch(x(1,:),y(1,:),z(1,:),p(1,:));
    patch(x(end,:),y(end,:),z(end,:),p(end,:));
    Qui donne le résultat de mon dernier poste à gauche.

  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
    Dans son code, Dut a calculé la fonction de Bessel uniquement sur les points de contour du cylindre, et pas au niveau des 2 disques aux extrémités du cylindre. La fonction patch permet de tracer un (ou des) polygones définis par des sommets. Tel que l'a utilisé Dut, la fonction patch interpole la couleur à l'intérieur du polygone en fonction des valeurs de chaque sommet.

    Donc a priori, tu as eu raison de recalculer la fonction de Bessel pour ces points et d'utiliser un tracé avec surf, par contre tu n'a pas défini ta variable z, d'ou la déformation que tu observes.

    Voici un code rapide pour tracer le cylindre et le disque en z=0 :
    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
     
     n=2;%bessel fonction oredr n
    m=1;%mth root
    l=0;
     
    alpha=find_pth_bessel_root(n,m)
    Nt=400; %nb of point
    Nl=400; %nb of point
    R=0.15;%diameter
    L=0.1%cylinder length
     
     
     
     
    [theta,z]=meshgrid(linspace(0,2*pi,Nt),linspace(0,L,Nl));
    rho=R*ones(size(theta));
     
    p=cos(l*pi*z/L).*besselj(n,alpha*rho/R).*cos(n*theta);
     
    [x,y,z]=pol2cart(theta,rho,z);
     
    figure(2)
    surf(x,y,z,p,'edgecolor','none');
    colormap jet;
     
     
    N=400; %nb of point
     
    R1=linspace(0,R,N);
    theta1=linspace(0,2*pi,N);
    [r,theta]=meshgrid(R1,theta1);
    X=r.*cos(theta);
    Y=r.*sin(theta);
    Z=zeros(size(X));
     
    p=besselj(n,alpha*r/R).*cos(n*theta);
    hold on
    surf(X,Y,Z,p,'edgecolor','none');
    colormap jet;
    On peut surement l'optimiser mais c'est pour que tu vois le principe. Je te laisse faire pour z=L.
    Pour une bonne utilisation des balises code c'est ici!
    Petit guide du voyageur MATLABien : Le forum La faq Les tutoriels Les sources


    La nature est un livre écrit en langage mathématique. Galilée.

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    Merci beaucoup!

    En fait c'était tout simple et j'étais pas si loin du but! Je comprend un peu mieux comment marche surf maintenant!

    Le sujet est résolu

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

Discussions similaires

  1. Pb affichage avec un PaintBox (pour eviter scintillement)
    Par juan64 dans le forum C++Builder
    Réponses: 7
    Dernier message: 08/04/2004, 09h21
  2. [VB6] [Flexgrid] Format d'affichage des numériques
    Par yansolo dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 19/10/2002, 21h00
  3. Affichage de documents PDF
    Par Dajon dans le forum C++Builder
    Réponses: 5
    Dernier message: 10/10/2002, 11h36
  4. probléme d'affichage d'une fiche
    Par sb dans le forum Composants VCL
    Réponses: 7
    Dernier message: 29/08/2002, 09h43
  5. Affichage en passant par un buffer...
    Par Sirotilc dans le forum MFC
    Réponses: 5
    Dernier message: 27/05/2002, 21h00

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