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 :

Creer une fonction avec option


Sujet :

MATLAB

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 200
    Points : 46
    Points
    46
    Par défaut Creer une fonction avec option
    Salut à tous, j'ai un problème; le script de ma fonction fonctionne, donc je ne pense pas que le problème vienne de là.

    Mais je souhaite créer ma fonction, avec comme option "type" qui sera soit EWMA soit EMP mais j'ai l'impression que ça ne fonctionne 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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    function [VAR_EWMA,VAR_EMP] = param(data,lambda,alpha,type)
     
     
    if strcmp(type,'EWMA') ==1 
     
         A = size(data);
     
     
     
        for i=250:1:A(1)
     
            data2=data(i-250+1:i,:);
            results = Covariance(data2,lambda);
     
            B = size(results.vol_ewma);
     
            for z = 1:1:B(2);
                correlation(1,z) = (results.cov_ewma(1,z)/( results.vol_ewma(1,1) * results.vol_ewma(1,z)));
            end
                somme = real(sqrt((results.vol_ewma(1,2:1:B(2))*correlation(2:1:B(2))'*results.vol_ewma(1,1))));
     
                VAR_EWMA(i,1)=somme*-norminv(alpha,0,1) ;
     
        end
     
    elseif strcmp(type,'EMP') ==1
     
        A = size(data);
     
     
        for i=250:1:A(1)
     
            data2=data(i-250+1:i,:);
            results = Covariance(data2,lambda);
     
            B = size(results.vol_emp);
            for z = 1:1:B(2);
                correlation(1,z) = (results.cov_emp(1,z)/( results.vol_emp(1,1) * results.vol_emp(1,z)));
            end
                somme = real(sqrt((results.vol_emp(1,2:1:B(2))*correlation(2:1:B(2))'*results.vol_emp(1,1))));
                VAR_EMP(i,1)=somme*-norminv(alpha,0,1) ;
     
        end
     
    end
    et je comprend pas comment l'appeler si je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [Var_EWMA]=param(data,0.94,0.975,'EWMA');
    ça fonctionne mais l'intérêt d'utiliser type si il faut le faire à la main !

    Par contre si je mets :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [Var_EMP]=param(data,0.94,0.975,'EMP');
    J'ai cette erreur :

    Error in param (line 4)
    if strcmp(type,'EWMA') ==1

    Output argument "VAR_EWMA" (and maybe others) not assigned during call to
    "/Users/Siegelbaum/Downloads/MATLAB_GT_REACTIVE_BETA/param.m>param".
    Pareil si je mets les 2 arguments.

    Merci pour votre aide

  2. #2
    Membre éprouvé
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Points : 1 277
    Points
    1 277
    Par défaut
    Ce n'est pas très clair...

    0/ <if strcmp() == 1> se simplifie en <if strcmp()>

    1/ Tel que tu as écris ton if, c'est soit l'un soit l'autre mode, donc ça n'a aucun sens de renvoyer les deux (VAR_EWMA n'existe pas en mode EMP, ce qui plantera puisque tu la renvoie). Solution -> renvoyer soit une seule variable (définie en fonction du mode), soit renvoyer les 2 toujours (donc plus d'argument mode), soit 1 ou les 2 (mode devient une liste de modes)

    2/
    ça fonctionne mais l'intérêt d'utiliser type si il faut le faire à la main !
    Comment veux-tu qu'il décide tout seul quel mode utiliser ?

    3/
    L'erreur que j'ai c'est qu'il semble me créer Var_EWMA mais pas A ... enfin je comprend rien là.
    En interne (pendant que la fonction est appelée), il va bien créer les 2 variables. Mais comme tu ne renvoie que VAR_EWMA et pas A, tu ne récupérera pas A en appelant ta fonction. Il faut que la fonction le renvoie si tu veux t'en servir depuis l’extérieur.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 200
    Points : 46
    Points
    46
    Par défaut
    Merci pour ta réponse j'ai edite.

    Donc je suis obligé de mettre en appel : VAR_EMP quand je mets EMP et VAR_EWMA quand je mets en type EWMA ?! c'est pas possible de laisser les 2 et de renvoyer rien pour celui qui n'est pas appelé?

    En fait ça fonctionne pour EWMA mais il ne comprend pas quand je mets comme type EMP ...

    Je comprend pas pourquoi le if passe pas.

  4. #4
    Membre éprouvé
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Points : 1 277
    Points
    1 277
    Par défaut
    Je comprend pas pourquoi le if passe pas.
    Il passe, mais la fonction essaye de renvoyer 2 arguments, dont un qui n'existe pas (puisque tu n'es pas passé dans le 1er if)

    c'est pas possible de laisser les 2 et de renvoyer rien pour celui qui n'est pas appelé?
    Non, mais par contre il suffit de renvoyer un seul argument, sélectionnée en fonction du mode. Pourquoi renvoyer 2 variables alors qu'une seule est définie ???

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    function [VAR_] = param(data,lambda,alpha,type)
    if strcmp(type,'EWMA') ==1 
      % ... 
      VAR_ = VAR_EWMA;
    elseif strcmp(type,'EMP') ==1
      % ....  
      VAR_ = VAR_EMP;
    end
    Ensuite, tu fais simplement
    Et v contiendra ce que tu attends en fonction du mode que tu as passé.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 200
    Points : 46
    Points
    46
    Par défaut
    ça tourne au poil merci !

    Impeccable

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 200
    Points : 46
    Points
    46
    Par défaut
    j'ai voulu ajouter le graphique alors la fonction est comme ça :
    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
    function [VAR_,f1] = param(data,lambda,alpha,type,profondeur)
     
     
    if strcmp(type,'EWMA') ==1 
     
        .... 
              VAR_=VAR_EWMA;
     
        end
     
    elseif strcmp(type,'EMP') ==1
     
       ....
               VAR_EMP(i,1)=somme*-norminv(alpha,0,1) ;
               VAR_=VAR_EMP;
     
        end
     
    end
     
    f1=figure ;
     
    plot((1:length(VAR),data(1:end,1),'b',(1:length(VAR),VAR,'r')         
     
    legend(' P&L',' VaR (\alpha%)',0)
    et l'appel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [VAR,f1]=param(data,0.94,0.975,'EWMA',500);
    Le problème c'est que j'ai la variable VAR qui se crée dans le workspace mais j'ai ça comme erreur pour le graphique :

    Cannot find an exact (case-sensitive) match for 'VAR'

    The closest match is: var in /Applications/MATLAB_R2013a.app/toolbox/matlab/datafun/var.m


    Error in param (line 53)
    plot((1:length(VAR)),data(1:end,1),'b',(1:length(VAR)),VAR,'r')
    En gros si je comprend bien il ne reconnait pas VAR comme une variable ?!
    Quand je mets le code dans la commande par contre ça fonctionne !

  7. #7
    Membre éprouvé
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Points : 1 277
    Points
    1 277
    Par défaut
    Soit tu fais le dessin dans la fonction, enquel cas tu as oublié un underscore (VAR_ et non VAR), du coup il essaye de trouver une fonction s'appelant VAR.
    Soit tu le fais à l'extérieur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    [VAR]=param(data,0.94,0.975,'EWMA',500);
    plot((1:length(VAR),data(1:end,1),'b',(1:length(VAR),VAR,'r')         
    legend(' P&L',' VaR (\alpha%)',0)

Discussions similaires

  1. creer une fonction avec arguments
    Par bigmousse69 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 09/04/2009, 10h10
  2. creer un order sur une fonction avec criteria
    Par maouth dans le forum Hibernate
    Réponses: 12
    Dernier message: 09/09/2008, 15h57
  3. creer une fonction avec arguments
    Par niglo dans le forum ASP
    Réponses: 3
    Dernier message: 03/06/2005, 08h04
  4. Appeler une fonction avec/sans parenthèses
    Par haypo dans le forum Algorithmes et structures de données
    Réponses: 8
    Dernier message: 29/12/2002, 18h48
  5. Une fonction avec des attributs non obligatoires
    Par YanK dans le forum Langage
    Réponses: 5
    Dernier message: 15/11/2002, 13h39

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