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 :

Fonction à deux variables


Sujet :

MATLAB

  1. #1
    Membre averti
    Homme Profil pro
    Etudiant M.Sc
    Inscrit en
    Février 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Etudiant M.Sc

    Informations forums :
    Inscription : Février 2012
    Messages : 9
    Par défaut Fonction à deux variables
    Bonjour à tous,

    J'essaie de tracer une fonction à deux variables f(x,y) sur MATLAB et je n'y arrive pas... J'ai une fonction dont l'expression change en fonction du signe de x, la voici (l et ang sont des paramètres que je ne fais pas varier) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    function [d] = beam_length(x,y,l,ang)
    if x>0
        d=sqrt(l^2+(x^2+y^2)+2*l*sqrt(x^2+y^2)*sin(acos(x./sqrt(x^2+y^2))*(1-2*ang/pi)));
    end
    if x==0
        d=sqrt(l^2+(x^2+y^2)+2*l*sqrt(x^2+y^2)*sin(pi/2*(1-2*ang/pi)));
    end
    if x<0
        d=sqrt(l^2+(x^2+y^2)+2*l*sqrt(x^2+y^2)*sin((pi-acos(-x./sqrt(x^2+y^2)))*(1-2*ang/pi)));
    end
    end
    Je souhaite donc la représentation graphique de d=beam_length(x,y) en 3D. Pour cela je crée ma grille avec meshgrid et ensuite j'applique ma fonction:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [x,y]=meshgrid(-0.5:0.01:0.5);
    r=beam_length(x,y,1.414,pi/4)
    Error in ==> beam_length at 2
    if x>0
    
    ??? Output argument "d" (and maybe others) not assigned during call to "beam_length.m (beam_length)".
    Voila donc le problème, je pense qu'il fait le test de signe sur le vecteur x au lieu de le faire sur l'élément mais je n'arrive pas à changer cela.

    Merci beaucoup pour votre aide

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

    Merci à l'avenir de mettre le message d'erreur en entier.

    Voir Output argument "***" (and maybe others) not assigned during call to "***"
    Ici x est une matrice, et x>0, x==0 et x<0 sont vrais si et seulement si TOUS les éléments sont vrais, ainsi aucune des conditions if n'est vraie. Il en résulte que d n'est jamais fixé, d'où l'erreur.

  3. #3
    Membre averti
    Homme Profil pro
    Etudiant M.Sc
    Inscrit en
    Février 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Etudiant M.Sc

    Informations forums :
    Inscription : Février 2012
    Messages : 9
    Par défaut
    Merci Jérôme pour cette explication.

    Dans ce cas comment je fais pour contourner cette spécificité ? As-tu une piste à me proposer ?

    Merci

  4. #4
    Expert confirmé
    Avatar de duf42
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Novembre 2007
    Messages
    3 111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Formateur en informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 111
    Par défaut
    Bonjour,

    Les fonctions ALL et/ou ANY pourraient peut-être t'être utile ici.

    Duf

  5. #5
    Membre émérite
    Avatar de ol9245
    Homme Profil pro
    Chercheur
    Inscrit en
    Avril 2007
    Messages
    985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Avril 2007
    Messages : 985
    Billets dans le blog
    1
    Par défaut
    1/ si tu veux que ta fonction length_beam travaille correctement avec des arguments tableaux (ce qui est une très bonne pratique de programmation Matlab ), il faut que tu utilises les opérations membre à membre (.* ./ .^) en remplacement des opérations matricielles (* / ^).

    2/ pour tes test, quand tu teste x, tu teste une matrice et tu veux récupérer de quoi 'arroser' les bons x pour le calcul. On fai ça comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    xplus = (x>0) ;
    d = zeros(taille finale) ;
    d(xplus) = mon_calcul_pour_les_x>0 ;
    d(~xplus) = mon_calcul_pour_les_x<=0 ;

  6. #6
    Membre averti
    Homme Profil pro
    Etudiant M.Sc
    Inscrit en
    Février 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Etudiant M.Sc

    Informations forums :
    Inscription : Février 2012
    Messages : 9
    Par défaut
    Bonjour Olivier et merci de ta réponse.

    Je ne comprends pas bien ton code du coup ça ne fonctionne pas tout le temps qu'en j'essaie sur Matlab. Voila la 1ère fonction que j'ai écris pour le tester:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    function [ d ] = test(x,y)
    xplus = (x>0) ;
    d = zeros(101,101) ;
    d(xplus) = 7 ;
    d(~xplus) = 4;
    end
     
    >> [x,y]=meshgrid(-0.5:0.01:0.5);
    >> r=test(x,y)
    La ça fonctionne sans problème, par contre si je fais intervenir x ou y voici la réponse:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    function [ d ] = test(x,y)
    xplus = (x>0) ;
    d = zeros(101,101) ;
    d(xplus) = (x)+7 ;
    d(~xplus) = 4;
    end
     
    ???  In an assignment  A(I) = B, the number of elements in B and
     I must be the same.
     
    Error in ==> test at 4
    d(xplus) = x+7 ;
    J'arrive donc au même problème comment lui faire comprendre que je veux qu'il prenne les éléments de x et pas la matrice ! De même si j'utilise .*

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    function [ d ] = test(x,y)
    xplus = (x>0) ;
    d = zeros(101,101) ;
    d(xplus) = x.*y ;
    d(~xplus) = 4;
    end
     
    >> r=test(x,y)
    ???  In an assignment  A(I) = B, the number of elements in B and
     I must be the same.
     
    Error in ==> test at 4
    d(xplus) = x.*y ;
    Merci encore pour votre aide

  7. #7
    Invité
    Invité(e)
    Par défaut
    Sauf dans le cas d'un scalaire à assigner, le nombre d'éléments à gauche et à droite se doit d'être le même.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    d(xplus) = 7 ;
    d(~xplus) = 4;
    Ici 7 et 4 étant des scalaires, pas de problème : tous les éléments sont assignés à la valeur du scalaire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    d(xplus) = (x)+7 ;
    d(xplus) = x.*y ;
    Là, d(plus) correspond aux éléments positifs stricts de x tandis que (x)+7 et x.*y contiennent autant d'éléments que x.
    D'où l'erreur In an assignment A(I) = B, the number of elements in B and I must be the same..
    Ainsi donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    d(xplus) = x(xplus)+7 ;
    d(xplus) = x(xplus).*y(xplus) ;

  8. #8
    Membre averti
    Homme Profil pro
    Etudiant M.Sc
    Inscrit en
    Février 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Etudiant M.Sc

    Informations forums :
    Inscription : Février 2012
    Messages : 9
    Par défaut
    Merci beaucoup à tous ma fonction fonctionne désormais parfaitement.

    Bonne journée

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

Discussions similaires

  1. fonction à deux variables
    Par guefrachi dans le forum MATLAB
    Réponses: 6
    Dernier message: 21/06/2010, 10h39
  2. [Débutant] extremum fonction à deux variables
    Par Medde dans le forum MATLAB
    Réponses: 13
    Dernier message: 25/06/2009, 13h57
  3. Fonction à deux variables.
    Par bigboy dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 04/04/2009, 12h11
  4. Fonctions à deux variables
    Par niblos79 dans le forum MATLAB
    Réponses: 2
    Dernier message: 12/11/2007, 09h33
  5. fonctions à deux variables
    Par prince19 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 02/06/2007, 10h03

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