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 :

Simulation d'une fonction [Débutant]


Sujet :

MATLAB

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 401
    Points : 102
    Points
    102
    Par défaut Simulation d'une fonction
    Bonjour à tous,

    J'aurais besoin de réaliser la chose suivante : j'ai écris une fonction appelée simulation4. Cette fonction prend quatre paramètres en entrée, comme suit par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    simulation4(55,700,5000,16);
    Je voudrais écrire un script qui test cette fonction pour les 4 paramètres choisis aléatoirement et cela pour, par exemple, 50 essais. Je voudrais donc que la fonction simulation4 soient lancée 50 fois et que certaines valeurs qui sont calculées dans la fonction soient retranscrites dans un fichier .xls.

    Je pense me débrouiller pour écrire ce que je souhaite dans le fichier .xls mais je n'ai aucune idée de comment réaliser une telle simulation. J'imagine qu'il faudra écrire une nouvelle fonction mais comment faire ? Dans cette fonction il s'agit que simulation4 soit appellée 50 fois avec 4 paramètres aléatoires. Mais voilà je ne veux pas des nombres "absurdes" ou sans intérêt du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    simulation4(1.12,5.68,8.21,1.01)
    Il me faut des nombres positifs supérieures à 10 et 50 pour le premier paramètre, entre 100 et 700 pour le second, entre 3000 et 5000 pour le troisième et entre 1 et 16 pour le dernier. Il faudrait donc de plus "encadrer" les paramètres aléatoires choisis.

    EDIT:

    Après réflexion je viens d'entamer quelque chose comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    warning('off','MATLAB:xlswrite:AddSheet')
    ii=0;
    while(ii<=50)
     
        %Appel de la fonction de simulation avec des paramètres aléatoires
        %encadrés selon les spécifications ci-dessus. Mais il faut faire un
        %test.
     
        simulation4(round(10+40*rand()),round(100+600*rand()),round(3000+4000*rand()),round(1+16*rand()));
     
        ii=ii+1;
     
    end
    J'appel donc bien effectivement simulation4 avec des paramètres aléatoires "contrôlés" comme je le désirais mais je ne connais pas la valeur de ces paramètres. Or, j'aimerais justement les connaître et les écrire dans un fichier .xls (cela pour chaque indice ii).

    EDIT2:

    J'ai finalement réglé le problème des paramètres à renvoyer. En effet, dans la fonction simulation4, je ne renvoyais rien ; pour pallier au problème je renvoie simplement ce qui m'intéresse : les paramètres d'entrée et deux autres paramètres issus de la fonction et le code devient donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    warning('off','MATLAB:xlswrite:AddSheet')
    ii=0;
    while(ii<=50)
     
        %Appel de la fonction de simulation avec des paramètres aléatoires
        %encadrés selon les spécifications ci-dessus. Mais il faut faire un
        %test.
     
        [nbr_de_reflux nbr_de_reflux_trouver ampli_bruit ampli_reflux ampli_air nbr_pic]=simulation4(round(10+40*rand()),round(100+600*rand()),round(3000+4000*rand()),round(1+16*rand()));
     
        ii=ii+1;
     
    end
    simulation4 va donc s’exécuter 50 fois avec à chaque fois des paramètres aléatoires. Le problème restant est que malgré les domaines aléatoires contrôlés, il se peut que la fonction simulation4 n'aille pas jusqu'au bout. Pour certaines raisons, et selon des grandeurs calculées dans cette fonction, la fonction s'arrête à un moment donné puisqu'un certain if a été vérifié et je renvoie un message d'erreur :"cas problématique". Ma question est comment gérer ces cas là ? Dans ce cas là nbr_reflux et nbr_reflux_trouver n'existent pas et je ne pourrais donc pas les écrire dans un .xls. Je voudrais donc sauter un tel cas et continuer le while en écrivant seulement les données lorsque nbr_reflux et nbr_reflux_trouver existent bien. Je pense à un try catch mais je n'ia pas une idée précise.

  2. #2
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 401
    Points : 102
    Points
    102
    Par défaut
    Bon, j'ai continué mais j'arrive à certains problèmes. Voici la fonction complète :

    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
    function simulation_de_simulation
     
    warning('off','MATLAB:xlswrite:AddSheet')
    ii=0;
     
     
    T1='ampli_bruit';
    T2='ampli_reflux';
    T3='ampli_air';
    T4='nbr_pic';
    T5='nbr_reflux';
    T6='nbr_reflux_trouver';
     
    Tableau_cellule1 = cell(1,6);
    Tableau_cellule1{1,1} = T1;
    Tableau_cellule1{1,2} = T2;
    Tableau_cellule1{1,3} = T3;
    Tableau_cellule1{1,4} = T4;
    Tableau_cellule1{1,5} = T5;
    Tableau_cellule1{1,6} = T6;
     
    %Préparation de l'Excell en mettant sur la ligne A1 les éléments 
     
    xlswrite('simulaiton_de_simulation',Tableau_cellule1,'result','A1');
     
    while(ii<=50)
     
    [nbr_de_reflux nbr_de_reflux_trouver ampli_bruit ampli_reflux ampli_air nbr_pic]=simulation4(round(10+40*rand()),round(100+600*rand()),round(3000+4000*rand()),round(1+16*rand()));
     
        %Test : on regarde si les paramètres nbr_reflux et nbr_reflux_trouver
        %existent bien.
     
        if(~isempty(nbr_de_reflux)& ~isempty(nbr_de_reflux_trouver));
     
        %Ecriture des données dans le Excell lorsqu'on trouve bien des reflux.
     
     
        end
     
        ii=ii+1;
     
    end
    end
    Au départ j'écris dans un fichier .xls nommé simulation_de_simulation.xls sur la ligne A1 6 chaînes de caractères. Ensuite je réalise la simulation aléatoire de simulation4 et le problème c'est que j'ai besoin de tester si nbr_de_reflux et nbr_de_reflux_trouver sont vides. S'ils ne sont pas vides je voudrais écrire des choses dans .xls sinon je voudrais continuer. J'utilise plutôt un if qui teste si les deux paramètres problématiques sont non vides.

    Quand les paramètres sont non vides, j'ai besoin d'écrire en dessous de la ligne A1 du .xls les valeurs correspondantes des paramètres renvoyés par simulation4. Mais je ne sais pas comment écrire : la première ligne à écrire le sera sur A2 puis A3 ect.

    Si vous voulez, je pourrais faire un tableau de cellule et mettre sur la ligne A2 les paramètres issus de la fonction et dans l'ordre. Mais le souci est que je ne veux pas spécifier de ligne. Par exemple, admettons que les paramètres soient non vides dés que ii=1, je voudrais alors écrire les résultats comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    if(~isempty(nbr_de_reflux)& ~isempty(nbr_de_reflux_trouver));
     
    Tableau_cellule = cell(1,6);
    Tableau_cellule{1,1} = ampli_bruit;
    Tableau_cellule{1,2} = ampli_reflux;
    Tableau_cellule{1,3} = ampli_air;
    Tableau_cellule{1,4} = nbr_pic;
    Tableau_cellule{1,5} = nbr_de_reflux;
    Tableau_cellule{1,6} = nbr_de_reflux_trouver;
     
    xlswrite('simulation_de_simulation',Tableau_cellule,'result','A2');
     
    end
    En A2 je mets donc sur cette ligne les divers paramètres. Mais voilà, je ne sais pas comment dire d'écrire ainsi les résultats sans imposer de ligne. J'ai besoin décrire les lignes les une en dessous des autres selon que le if est vérifié, sinon on saute à l'indice suivant. Bref, j'ai besoin de spécifier l'écriture dans le .xls comme suit :"écrire Tableau_cellule à partir de la ligne A2 pour le premier ii tel que nbr_de_reflux et nbr_de_reflux_trouver sont non vides puis reprendre à la ligne suivante pour le prochain ii où ces deux paramètres sont non vides". Ainsi par exemple si la prochaine fois où nbr_de_reflux et nbr_de_reflux_trouver sont non vides est pour ii=10, j'ai besoin d'écrire le contenu de Tableau_cellule en A3 et ainsi de suite.

  3. #3
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 401
    Points : 102
    Points
    102
    Par défaut
    J'ai réussi à trouver une solution alternative qui est la suivante : je crée effectivement le fichier .xls en le remplissant au fur et à mesure. Là où les deux paramètres du if sont vides, je mets des 'XX' afin de me rappeler que la ligne obtenu ne va pas m'intéresser. Ce n'est certes pas ce que je souhaitais faire initialement (remplir le xls au fur et à mesure sans rien n'écrire qui soit en rapport avec les lignes où les deux paramètres du if n'existent pas). Si vous savez comment faire cela, je reste preneur.

    Voici toutefois le code que j'ai utilisé :

    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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    function simulation_de_simulation
     
    %Cette fonction a pour but de simuler la fonction de simulation écrite
    %jusque-là : on appelle 50 fois la fonction de simulation avec 4 paramètres
    %choisis aléatoirement mais de façon contrôlée (on ne doit avoir des
    %paramètres abérrants). On écrit pour chaque essai qui donne un résultat
    %certains nombres dans un .xls.
     
    %on appelle 50 fois simulation4(a,b,c,d) où on choisit a,b,c,d aléatoires tels
    %que a soit entre 10 et 50, b entre 100 et 700, c entre 3000 et 5000, d
    %entre 1 et 16. Bien sûr on utilise un try catch car l'appel de simulation4
    %peut donner un cas d'erreur ou de non sens et on reporte donc dans le .xls
    %seulement les cas fonctionnels.
     
    warning('off','MATLAB:xlswrite:AddSheet')
    ii=1;
     
    %Données utiles lors de l'écriture dans le .xls
     
    T1='ampli_bruit';
    T2='ampli_reflux';
    T3='ampli_air';
    T4='nbr_pic';
    T5='reflux';
    T6='reflux trouver';
     
    Tableau_cellule1 = cell(1,6);
    Tableau_cellule1{1,1} = T1;
    Tableau_cellule1{1,2} = T2;
    Tableau_cellule1{1,3} = T3;
    Tableau_cellule1{1,4} = T4;
    Tableau_cellule1{1,5} = T5;
    Tableau_cellule1{1,6} = T6;
     
    %Préparation du .xls en mettant sur la ligne A1 les éléments 
     
    xlswrite('simulation_de_simulation',Tableau_cellule1,'result','A1');
     
    while(ii<=100)
     
        %Appel de la fonction de simulation avec des paramètres aléatoires
        %encadrés selon les spécifications ci-dessus. Mais il faut faire un
        %test.
     
        [nbr_de_reflux nbr_de_reflux_trouver ampli_bruit ampli_reflux ampli_air nbr_pic]=simulation4(round(10+40*rand()),round(100+600*rand()),round(3000+4000*rand()),round(1+16*rand()));
     
        %Test : on regarde si les paramètres nbr_reflux et nbr_reflux_trouver
        %existent bien.
     
        if(~isempty(nbr_de_reflux)& ~isempty(nbr_de_reflux_trouver));
     
        %Ecriture des données dans le Excell lorsqu'on trouve bien des reflux.
     
        Tableau_cellule1{1,1} = ampli_bruit;
        Tableau_cellule1{1,2} = ampli_reflux;
        Tableau_cellule1{1,3} = ampli_air;
        Tableau_cellule1{1,4} = nbr_pic;
        Tableau_cellule1{1,5} = nbr_de_reflux;
        Tableau_cellule1{1,6} = nbr_de_reflux_trouver;
     
        %Il faut spécifier la ligne où on veut écrire de la forme Ai où i est
        %l'indice de la ligne.
     
     
        indice_ligne=strcat('A',num2str(ii+1));
        xlswrite('simulation_de_simulation',Tableau_cellule1,'result',indice_ligne);
     
        else
     
        %Si le cas est problématique, on inscrit simplement XX sur les colonnes 
        %reflux et reflux trouver.
     
        Tableau_cellule1{1,1} = ampli_bruit;
        Tableau_cellule1{1,2} = ampli_reflux;
        Tableau_cellule1{1,3} = ampli_air;
        Tableau_cellule1{1,4} = nbr_pic;
        Tableau_cellule1{1,5} = 'XX';
        Tableau_cellule1{1,6} = 'XX';
     
        indice_ligne=strcat('A',num2str(ii+1));
     
        xlswrite('simulation_de_simulation',Tableau_cellule1,'result',indice_ligne);
     
        end
     
     
        ii=ii+1;
     
    end
    end

  4. #4
    Membre actif
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    189
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2013
    Messages : 189
    Points : 242
    Points
    242
    Par défaut
    salut,

    je pense que le plus simple est de faire un compteur, que tu incrementes a chaque fois que ton test est validé.

    au debut de ta fonction, avant le while, rajoute

    ensuite, une fois qie ton test est verifié, fait

    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
    if(~isempty(nbr_de_reflux)& ~isempty(nbr_de_reflux_trouver));
    
    compteur = compteur+1
    
    cellule_cible = horzcat('A',num2str(compteur+1)) % +0 +1 ou +2, chais pas trop, flemme de verifier 
    
    Tableau_cellule = cell(1,6);
    Tableau_cellule{1,1} = ampli_bruit;
    Tableau_cellule{1,2} = ampli_reflux;
    Tableau_cellule{1,3} = ampli_air;
    Tableau_cellule{1,4} = nbr_pic;
    Tableau_cellule{1,5} = nbr_de_reflux;
    Tableau_cellule{1,6} = nbr_de_reflux_trouver;
    
    xlswrite('simulation_de_simulation',Tableau_cellule,'result',cellule_cible);
    
    end

  5. #5
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 401
    Points : 102
    Points
    102
    Par défaut
    Merci Dombrai pour ton effort de code. Je vais regarder ce que cela donne demain. Mais si je comprends bien, en gros dans la cellule_cible on va ranger la ligne où il faut écrire les résultats. Par exemple si pour ii=1 le if est vérifié, on aura 'A2' effectivement, mais par exemple si ce if est vérifié une seconde fois seulement au rang ii=10 on aura alors un certain 'A10' ou 'A11' (à vérifier). A moins que je ne me trompe car j'écris à chaud sans tester. J'ai fait à peu près la même chose dans le code de mon avant-dernier post mais j'ai rajouté un else afin de gérer les cas en dehors du if parce que sinon je vais me retrouver avec des lignes non remplies. Pour reprendre mon exemple : entre A1 et A10, je n'aurais donc rien si je ne m'abuse, ce que je ne veux pas. Ce que j'aurais aimé c'est que le xls se remplisse à partir de la ligne A2 et que le remplissage se fasse au fur et à mesure dans l'ordre. Donc si le if est vérifié en ii=10 une seconde fois, j'aimerais que les résultats soit écrits en A3 ; si ensuite c'est pour ii=14, je voudrais les résultats en A4 ect. Mais c'est délicat car les indices ii où le if est vérifié sont aléatoires. Bref tu vois le souci ?

  6. #6
    Membre actif
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    189
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2013
    Messages : 189
    Points : 242
    Points
    242
    Par défaut
    Citation Envoyé par abel413 Voir le message
    Par exemple si pour ii=1 le if est vérifié, on aura 'A2' effectivement, mais par exemple si ce if est vérifié une seconde fois seulement au rang ii=10 on aura alors un certain 'A10' ou 'A11' (à vérifier). A moins que je ne me trompe car j'écris à chaud sans tester.
    ....

    Donc si le if est vérifié en ii=10 une seconde fois, j'aimerais que les résultats soit écrits en A3 ; si ensuite c'est pour ii=14, je voudrais les résultats en A4 ect. Mais c'est délicat car les indices ii où le if est vérifié sont aléatoires. Bref tu vois le souci ?
    et ben c'est justement ce que mon code fait.

    La variable "compteur" est différente du ii qui gère ta boucle, et n'est augmentée que si le test est vérifié.

    Pour reprendre ton exemple :

    ii = 1, test verifié, compteur passe de 0 à 1, on ecrit en A2
    ii = 2, test non verifié, compteur reste à 1, on n'ecrit rien
    ii = 3, test non verifié, compteur reste à 1, on n'ecrit rien
    ii = 4, test verifié, compteur passe de 1 à 2, on ecrit en A3
    ii = 5, test non verifié, compteur reste à 2, on n'ecrit rien
    ii = 6, test non verifié, compteur reste à 2, on n'ecrit rien
    ii = 7, test verifié, compteur passe de 2 à 3, on ecrit en A4

    etc.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 10/09/2014, 21h07
  2. Réponses: 1
    Dernier message: 12/09/2013, 22h10
  3. Optimisation d'une fonction par recuit simulé
    Par jeanmichB dans le forum Algorithmes et structures de données
    Réponses: 22
    Dernier message: 08/08/2012, 16h46
  4. Réponses: 3
    Dernier message: 13/06/2010, 00h44
  5. [Turbo Pascal] Allocation et désallocation de pointeurs dans une fonction
    Par neird dans le forum Turbo Pascal
    Réponses: 13
    Dernier message: 17/11/2002, 20h14

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