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 :

problème de fonction


Sujet :

MATLAB

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2012
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 8
    Points : 5
    Points
    5
    Par défaut problème de fonction
    Bonjour ou Bonsoir
    j'ai un problème sur MATLAB j'ai une méthode qui prend en paramètre un caractère et une lettre t. Cette méthode me permet de faire un calcul à partir d'une fonction déjà créée dans un autre fichier, dont le nom est entré en paramètre, au point t.

    pour vous montrer la structure

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    méthode1(f,t)
    fone=inline([f '(t)']) %cette ligne va me permettre de reformer la fonction
    lorsque j'appelle la méthode avec la fonction f au point t
    je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    méthode1('f',t) (je dois mettre les guillemets )
    dans une autre méthode qu'on appellera méthode2 je crée une fonction k avec inline qui ne dépend pas des paramètres de la méthode 2, j'aimerais appliquer la méthode 1 à cette fonction mais je n'arrive pas.

    L'idée je pense serait d'isoler le nom de cette fonction k de manière à pouvoir l'utiliser en paramètre dans la méthode 1.

    Merci d'avance de votre aide.

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

    Il te serait plus simple d'utiliser un handle de fonction.
    Voir Que représente le symbole @ ?

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

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Avril 2007
    Messages : 985
    Points : 1 158
    Points
    1 158
    Billets dans le blog
    1
    Par défaut
    +1

    aparemment ta fonction methode prend une fonction comme argument.
    Matlab fait ça très bien.
    regarde comment ça marche dans l'aide sur fminsearch
    Tu verras que tu peux même créer une fonction "anonyme" en une seule ligne de code Matlab, récupérer son handle et le passer en argument.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    % The anonymous function shown here defines the function and returns a function handle called banana:
    banana = @(x)100*(x(2)-x(1)^2)^2+(1-x(1))^2;
     
    %Pass the function handle to fminsearch:
    [x,fval] = fminsearch(banana,[-1.2, 1])
    "La vraie grandeur se mesure par la liberté que vous donnez aux autres, et non par votre capacité à les contraindre de faire ce que vous voulez." Larry Wall, concepteur de Perl.

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2012
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    j'ai essayé de faire comme vous m'avez dit ca ne marche pas

    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
    function [ c ] = méthode1( f1,f2,t)
    [n1,n2]=méthode0(f1,f2,t);
    fo=inline([f1 '(t)'])
    fi=inline([f2 '(t)'])
    syms k        %construction de l'objet symbolique
    g=diff(fi(k)) %calcul de l'expression de la dérivée   
    f3=inline(g)
    j=diff(fo(k))
    f4=inline(j)
     
    c=(f3(t)*n1+f4(t)*n2)./(fo(t).^2+fi(t).^2)
    end
    function [ res ] = methode2(a )
    syms t
    h=inline([a '(t)'])
     
    [a1,a2]=f(t)
    aone=inline(a1)
    atwo=inline(a2)
     
    g=diff(aone(t))
    a1d=@(t)g
     
     
     
    p=diff(atwo(t))
    a2d=@(t)p
    a2d
    methode1(a1d,a2d,t)
     
     
    end

    juste pour information quand j'utilise la fonction méthode 1 avec une fonction que j'ai déjà créée je doit faire méthode('f1','f2',t)

    je voulais juste ajouter que la méthode 0 et la méthode 1 marche

    le message d'erreur:
    Error using horzcat
    The following error occurred converting from char to function_handle:
    Error using function_handle
    Too many output arguments.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2012
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    vous avez déjà dû remarquer qu'il y a une erreur dans le programme auparavant à la ligne 17.En effet je parle d'une fonction f alors que je ne l'ai pas défini avant
    .A l'exécution cette erreur n'était pas détectée car l'appel de la méthode se faisait sur f .pour corriger j'ai remplacé f par h ca donne donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    function [ res ] = methode2(a )
    syms t
    h=inline([a '(t)'])
    [a1,a2]=h(t)
    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
     
    >> methode2('f')
     
    h =
     
         Inline function:
         h(t) = f(t)
     
    Error using inline.subsref
    Too many output arguments.
     
    Error in methode2 (line 4)
    [x1,x2]=h(t)
     
    >>

  6. #6
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par matlabyk Voir le message
    j'ai essayé de faire comme vous m'avez dit ca ne marche pas
    juste pour information quand j'utilise la fonction méthode 1 avec une fonction que j'ai déjà créée je doit faire méthode('f1','f2',t)
    Ce ne sont pas les noms des fonctions qu'il te faut passer, mais leur handle :
    Ou si tu souhaites vraiment passer leur noms, tu peux utiliser la fonction

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2012
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    j"ai essayé je vous montre le message d'erreur



    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
    function [ c ] = méthode1( f1,f2,t)
    [n1,n2]=méthode0(f1,f2,t);
    fo=inline([f1 '(t)'])
    fi=inline([f2 '(t)'])
    syms k        %construction de l'objet symbolique
    g=diff(fi(k)) %calcul de l'expression de la dérivée   
    f3=inline(g)
    j=diff(fo(k))
    f4=inline(j)
     
    c=(f3(t)*n1+f4(t)*n2)./(fo(t).^2+fi(t).^2)
    end
    function [ res ] = methode2(a )
    syms t
    h=inline([a '(t)'])
     
    [a1,a2]=f(t)
    aone=inline(a1)
    atwo=inline(a2)
     
    g=diff(aone(t))
    a1d=@(t)g
     
     
     
    p=diff(atwo(t))
    a2d=@(t)p
    a2d
    methode1(@a1d,@a2d,t)
     
     
    end
    voila le message d'erreur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    >> methode2('f')
    Error: File: methode2.m Line: 16 Column: 11
    "a1d" was previously used as a variable,
     conflicting with its use here as the name of a function or command.
     See MATLAB Programming, "How MATLAB Recognizes Function Calls That Use Command Syntax" for details.

  8. #8
    Invité
    Invité(e)
    Par défaut
    Le handle de fonction remplace les fonctions inline
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    unction [ c ] = méthode1( f1, f2,t)
    [n1,n2]=méthode0(f1,f2,t);
    fo=inline([f1 '(t)'])
    fi=inline([f2 '(t)'])
    syms k        %construction de l'objet symbolique
    g=diff(f2(k)) %calcul de l'expression de la dérivée   
    f3=inline(g)
    j=diff(f1(k))
    Si a1d est déjà un handle, tu n'as pas à utiliser @ devant dans l'appel à methode1.

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2012
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    j'ai fait comme vous m'avez dit j'obtiens toujours un message d'erreur


    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
     
     
    function [ res ] = methode2(a )
    syms t
    h=@(t)a
     
    [a1,a2]=f(t)
    aone=@(t)a1
    atwo=@(t)a2
     
    aone(t)
     
    g=diff(aone(t))
    a1d=@(t)g
     
    p=diff(atwo(t))
    a2d=@(t)p
     
    methode1(a1d,a2d,t)
     
    end
    le message d'erreur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Error using inlineeval (line 15)
    Error in inline expression ==> a1d(t)
     Undefined function 'a1d' for input arguments of type 'sym'.
     
    Error in inline/subsref (line 24)
        INLINE_OUT_ = inlineeval(INLINE_INPUTS_, INLINE_OBJ_.inputExpr, INLINE_OBJ_.expr);

  10. #10
    Invité
    Invité(e)
    Par défaut
    Tes lignes du genre : X=@(t) Y n'ont pas de sens.
    D'après ce qui suit, X = Y serait plus juste.

    Ensuite, g=diff(aone<s>(t)</s>) aone dépend déjà de t.

  11. #11
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2012
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    j'ai essayé de faire comme vous m'avez dit il y a encore une erreur mais je pense qu'on s'approche de la solution
    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
    function [ res ] = methode2(a )
    syms t
    h=@(t)a
     
    [a1,a2]=f(t)
    aone=a1
    atwo=a2
    c=15000
    aone
    c=15555
    g=diff(aone)
    a1d=g
     
    p=diff(atwo)
    a2d=p
     
    methode1(a1d,a2d,t)
    le message d'erreur c'est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Error using mupadmex
    Error in MuPAD command: dimensions do not match [(Dom::Matrix(Dom::ExpressionField()))::_mult2]
     
    Error in sym/mtimes (line 189)
                X = mupadmex('symobj::mtimes',A.s,B.s);

  12. #12
    Invité
    Invité(e)

Discussions similaires

  1. C++ Problème de fonctions et pointeurs
    Par zmatz dans le forum C++
    Réponses: 3
    Dernier message: 01/10/2005, 16h20
  2. [MFC][WINSOCK] Problème avec fonction recv
    Par Le Farfadet dans le forum MFC
    Réponses: 4
    Dernier message: 23/09/2005, 11h00
  3. Problème de fonction
    Par Anduriel dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 26/05/2005, 20h30
  4. Problème avec fonction d'envoie de mail
    Par zyg dans le forum Réseau/Web
    Réponses: 1
    Dernier message: 23/02/2005, 08h48
  5. [Requête] Problème avec fonction "DATE_FORMAT()"
    Par sekiryou dans le forum Requêtes
    Réponses: 4
    Dernier message: 11/01/2005, 21h52

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