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 :

Calcul et tracé d'une surface 3D [Débutant]


Sujet :

MATLAB

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2011
    Messages : 34
    Par défaut Calcul et tracé d'une surface 3D
    Salut à tous
    J'ai un petit problème d'implémentation.
    Matlab refuse de prendre en compte ma fonction avec le message
    ??? Subscript indices must either be real positive integers or logicals
    Pour le code suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    clear all
    l=0.1; m=0.01; n=48; a=15; p=4; vpm=20600; 
    x=0.1:0.01:5;
    y=0.1:0.01:4.9;
    marge=zeros(length(x),1);
    r2=((-vpm).*((((1+(y+l+m)).^(-n))-1)/(y+l+m)));
    r1=((-vpm).*((((1+(x+l+m)).^(-n))-1)/(x+l+m)));
    d=((a)-(n/p));
    marge(x,y)=1-(((r2-r1)/r1)/(d));
    [xx,yy]=meshgrid(x,y);
    figure; surf(xx,yy,marge(x,y));
    Je pense que l'erreur est basique mais je suis débutant.
    Le but étant de tracer un plan en trois dimensions avec comme variables x,y (y<x car y décroissance de x) et marge(x,y)

  2. #2
    Membre éprouvé
    Homme Profil pro
    Ingénieur opto-électronique
    Inscrit en
    Avril 2010
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur opto-électronique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2010
    Messages : 129
    Par défaut
    Bonjour.

    Ton problème vient de cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    marge(x,y)=1-(((r2-r1)/r1)/(d));
    X et y sont des float, selon la définition que tu leurs a donné. Lorsque tu crées une matrice (ce qui est le cas de "marge"), les numéros de ligne et de colonnes doivent être entiers positifs.

    Une solution serait la suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    marge((x-0.09)*100,(y-0.09)*100)=...
    Reste que lorsque tu fais ça (comme dans ce que tu essayais de faire avant), tu crées une matrice de taille (approximativement) 500*500, alors qu'avant tu as initialisé cette variable comme un vecteur de taille 500*1.
    Assures toi bien de ce que tu veux obtenir, un vecteur colonne ou une matrice

  3. #3
    Membre actif
    Inscrit en
    Novembre 2009
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 94
    Par défaut
    je propose:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    [xx,yy]=meshgrid(x,y);
     Z=zeros(size(xx));
     Z(:)=1-(((r2-r1)/r1)/(d));
     figure;
     surf(xx,yy,Z)

    (d'autant plus que tu crées marge comme une matrice n*1 et ensuite tu veux le manipuler comme une matrice n*p.)

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Subscript indices must either be real positive integers or logicals qui concerne ta ligne marge(x,y) = ... ainsi que celle du plot.
    J'aurais quelques remarques:
    Tu sembles pre-allouer ta variable marge comme un tableau 1D, mais tu sembles vouloir marge(x,y), donc que veux-tu faire exactement?
    De plus r1 et r2 doivent être des scalaires ou plutôt des vecteurs? Dans ce dernier cas, ce serait plutôt:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    r2=-vpm*(((1+(y+l+m)).^(-n)-1)./(y+l+m));
    r1=-vpm*(((1+(x+l+m)).^(-n)-1)./(x+l+m));
    Une dernière chose: certaines paranthèses que tu as mises sont inutiles.
    exemple: d=a-n/p;

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2011
    Messages : 34
    Par défaut Merci!
    Citation Envoyé par Winjerome Voir le message
    Bonjour,

    Subscript indices must either be real positive integers or logicals qui concerne ta ligne marge(x,y) = ... ainsi que celle du plot.
    J'aurais quelques remarques:
    Tu sembles pre-allouer ta variable marge comme un tableau 1D, mais tu sembles vouloir marge(x,y), donc que veux-tu faire exactement?
    De plus r1 et r2 doivent être des scalaires ou plutôt des vecteurs? Dans ce dernier cas, ce serait plutôt:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    r2=-vpm*(((1+(y+l+m)).^(-n)-1)./(y+l+m));
    r1=-vpm*(((1+(x+l+m)).^(-n)-1)./(x+l+m));
    Une dernière chose: certaines paranthèses que tu as mises sont inutiles.
    exemple: d=a-n/p;

    Merci beaucoup!
    Je souhaite en fait que r1 soit un vecteur calculé à partir de x pour des valeurs de 0.1 à 5; de même poour r2 pour des y de 0.1 à 4.9.
    Pour ensuite faire un taux de variation au prorata de d. Après ces taux diminueront un seuil de 1 marge=1-...%

    thxsmuch

  6. #6
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2011
    Messages : 34
    Par défaut Must be a matrice or a vector, help
    Salut à tous

    Encore une fois sur le même 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
    l=0.1; m=0.01; n=48; a=15; p=4; vpm=20600; 
    x=0.001:0.001:0.1;
    y=0.001:0.0001:0.1;
    N1=length(x);
    N2=length(y);
    [xx,yy]=meshgrid(x,y);
    marge=zeros(length(x),length(y));
    for i=1:N1
        for j=1:N2
            x(i)=-vpm*(((1+((i./1000)+l+m)).^(-n)-1)./((i./1000)+l+m));
            y(j)=-vpm*(((1+(((j+9)./10000)+l+m)).^(-n)-1)./((j+9)./10000)+l+m);
            d=a-(n/p);
            marge(i,j)=1-(((y(j)-x(i))./x(i))./d);
        end
    end
    x=Points(:,0.001:0.001:0.1);
    y=Points(:,0.001:0.0001:0.1);
    dx=1;
    dy=1;
    x_edge=[floor(min(x)):dx:ceil(max(x))];
    y_edge=[floor(min(y)):dy:ceil(max(y))];
    [X,Y]=meshgrid(x_edge,y_edge);
    Z=griddata(x,y,marge(i,j),X,Y);figure;
    Le but étant de calculer une marge à partir de deux variable, x et y, qui sont eux-mêmes deux taux.
    Je pense que le code est bon après avoir eu l'aide hier de monsieurs sympathiques.
    Il me reste un problème

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ??? Error using ==> surf at 75
    Z must be a matrix, not a scalar or vector.
     
    Error in ==> mger at 17
    figure; surf(xx,yy,Z);
    J'ai tenté de le résoudre avec des Points et griddata sans succès, je veux juste faire un plan trois dimensions, la marge(i,j) en fonction de x et y. (pas x(i) et pas y(j))

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ??? Undefined variable Points.
     
    Error in ==> mger at 16
    x=Points(:,0.001:0.001:0.1);
    Molto grazie!

    Rémi

  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
    Par défaut
    Bonjour,

    qu'est censé faire cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    x=Points(:,0.001:0.001:0.1);
    ?

    Tu n'as pas créer de variables Points, et de toute manière la sélection par des indices soit se faire avec des entiers, pas des nombres décimaux.

    Quand à la première erreur, apparemment tu ne nous as pas donné le code associé...
    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
    Invité
    Invité(e)
    Par défaut
    Alors déjà première remarque:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    x=Points(:,0.001:0.001:0.1);
    y=Points(:,0.001:0.0001:0.1);
    La variable Points que tu veux utiliser n'est pas définie, de plus même si elle l'était, tu ferais la même erreur que dans ton premier message: les indices de tableaux doivent être des entiers positifs non nuls.
    Ensuite toujours dans ton premier message, tu calculais des variables intermédiaires r1 et r2 pour obtenir le contenu de marge, or ici tu remplaces le contenu des variables x et y.
    Pour finir, tu as une erreur sur l'utilisation de la fonction surf, mais je ne vois pas cette ligne dans le code que tu nous donnes (je présume que c'est la ligne suivante), de plus je te conseille de revoir les résultat de ces lignes qui selon moi n'est pas ce que tu cherches:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    x_edge=[floor(min(x)):dx:ceil(max(x))];
    y_edge=[floor(min(y)):dy:ceil(max(y))];
    [X,Y]=meshgrid(x_edge,y_edge);
    Z=griddata(x,y,marge(i,j),X,Y);figure;

  9. #9
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2011
    Messages : 34
    Par défaut Problème graphique 3D
    Bonjour à tous,

    Voilà le code qui me pose problème (encore!)=

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    l=0.0; m=0.01; n=48; a=15; p=4; vpm=25393; 
    x=0.001:0.001:0.1;
    y=0.001:0.0001:0.1;
    N1=length(x);
    N2=length(y);
    z=zeros(length(x),length(y));
    for i=1:N1
        for j=1:N2
            z(i,j)=1-((((vpm*((1-((1+(((j+9)./10000)+l+m)./4).^(-n)))./(((j+9)./10000)+l+m)./4))-(vpm*((1-((1+((i./1000)+l+m)./4).^(-n)))./((i./1000)+l+m)./4)))/(vpm*((1-((1+((i./1000)+l+m)./4).^(-n)))./((i./1000)+l+m)./4)))/a-(n/p));
        end
    end
    plot3(i/1000,(j+9)/10000,z(i,j),'-r.');
    developpez com graph question.pdf

    Je ne parviens pas à dessiner une surface, pourtant z(i,j) varie en fonction de deux variables et il n'y pas de soucis sur l'integer... Ce point rouge me pique les yeux

    Merci à vous!

    Rémi

  10. #10
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par mantus
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    plot3(i/1000,(j+9)/10000,z(i,j),'-r.');
    Ici tu ne traces qu'un seul point :
    • ta variable i est égale à sa dernière valeur d'itération: N1
    • De même pour j = N2
    • Toujours pareil z(i,j) représente une seule valeur: z(N1,N2)

    Alors que toi tu veux tracer tous les points. Tu dois donc fournir toutes les coordonnées x et y et leurs valeurs correspondantes.
    Ce que tu avais très bien essayé de faire au début en utilisant les fonctions meshgrid et surf (ou plot3),

  11. #11
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2011
    Messages : 34
    Par défaut toujours pas
    Salut


    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
     
    figure;
    l=0.0; m=0.01; n=48; a=15; p=4; vpm=25393;
    x=0.001:0.001:0.1;
    y=0.001:0.0001:0.1;
    N1=length(x);
    N2=length(y);
    z=zeros(length(x),length(y));
    for i=1:N1
    for j=1:N2
    z(i,j)=1-((((vpm*((1-((1+(((j+9)./10000)+l+m)./4).^(-n)))./(((j+9)./10000)+l+m)./4))-(vpm*((1-((1+((i./1000)+l+m)./4).^(-n)))./((i./1000)+l+m)./4)))/(vpm*((1-((1+((i./1000)+l+m)./4).^(-n)))./((i./1000)+l+m)./4)))/a-(n/p));
    end
    end
    [i,j]=meshgrid(1:N1,1:N2);
    surf(i/1000,(j+9)/10000,z(i,j));
    Que j'utilise "surf" ou "plot3" rien n'y fait, la surface est un point rouge. J'ai pourtant tenté de déclarer meshgrid avec i et j ou même x et y pour que surf le prenne en compte; même indiqué dans un autre endroit.

    Il m'indique aussi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ??? Maximum variable size allowed by the program is exceeded
    Ou invariablement:

    ??? Error using ==> surf at 75 
    Data dimension must agree
    Merci

  12. #12
    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
    Par défaut
    Bonjour,

    Par exemple, tu peux faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [i,j]=meshgrid(1:N1,1:N2);
    surf(i,j,z)
    ou :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    surf(x,y,z,'EdgeColor','none')
    Pour l'erreur, c'est un problème d'espace mémoire disponible. Tu peux lire ceci :
    1107 - Avoiding 'Out of Memory' Errors
    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.

  13. #13
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2011
    Messages : 34
    Par défaut merci
    Thxsmuch
    it runs well!

    merci bcp

    Rémi

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

Discussions similaires

  1. Tracé d'une surface avec une base de disque
    Par Winounet dans le forum MATLAB
    Réponses: 7
    Dernier message: 27/05/2014, 12h23
  2. Tracé d'une surface.
    Par george33 dans le forum MATLAB
    Réponses: 5
    Dernier message: 05/03/2010, 18h24
  3. Calculer les facettes d'une surface via Numpy
    Par rambc dans le forum Calcul scientifique
    Réponses: 0
    Dernier message: 24/12/2009, 16h25
  4. Calculer la normale d'une surface
    Par choko83 dans le forum OpenGL
    Réponses: 5
    Dernier message: 09/12/2008, 19h51
  5. Calcul normale facette d'une surface
    Par yabbiyou dans le forum MATLAB
    Réponses: 2
    Dernier message: 13/12/2007, 13h55

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