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 :

Trouver la valeur minimale d'un argument de sortie d'une fonction


Sujet :

MATLAB

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 6
    Points : 2
    Points
    2
    Par défaut Trouver la valeur minimale d'un argument de sortie d'une fonction
    Bonjour,

    Dans le cadre de mon stage, j'ai créé une fonction à deux variables (Longueur et rayon) qui me permet d'obtenir en sortie la masse totale d'un réservoir, la quantité de LH2 qui y est stocké ainsi que la longueur totale de ce réservoir:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function [Mtotal, MLH2, Ltotal] = Tank_sizingLRtest(L,r)
    Je souhaite réutiliser cette fonction dans un autre programme. Dans ce nouveau programme, MLH2 sera fixé, et je souhaite calculer la longueur et le rayon optimums (avec 1<r<4 et 50<L<80) pour avoir Mtotal minimum. Je difinis également un intervalle d'incertitude sur cette valeur de MLH2 (+ ou - 100 kg)

    Voici le script que j'ai commencé à écrire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    MLH2=52296;
    for r=1:4
        for L=50:80  
                [Mtotal, MLH2, Ltotal] = Tank_sizingLRtest(L,r)
            if MLH2-100<MLH2<MLH2+100       
                disp(L) 
                disp(r)
            end  
        end
    end
    Etant novice sur ce logiciel, je me sens un peu perdu et un peu d'aide ne serait pas de refus.

    Merci par avance,

  2. #2
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 52 884
    Points
    52 884
    Par défaut
    Stocke les valeurs de chaque itération dans des tableaux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for r = 1:4
        for L = 50:80  
            [Mtotal(r,L-49), MLH2(r,L-49), Ltotal(r,L-49)] = Tank_sizingLRtest(L,r);
        end
    end
    Tu pourras visualiser la surface de réponse de la masse totale :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    figure
    surf(50:80, 1:4, Mtotal)
    Ensuite, tu crées un masque binaire avec la valeur de MLH2 fixée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    MLH2_fixed = 52296;
    idx = MLH2>(MLH2_fixed-100) & MLH2<(MLH2_fixed+100);
    Tu mets toutes les valeurs de Mtotal qui ne correspondent pas à ce masque à +Inf :

    Tu cherches le minimum :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [Mmin, k] = min(Mtotal(:));
    Tu récupères les valeurs de r et de L correspondantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    [Lmin,rmin] = ind2sub(size(Mtotal), k)
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Merci pour avoir répondu aussi rapidement. J'ai pu tester votre solution et le programme ne semble pas donner les bons résultats. En effet, les valeurs de Lmin et rmin obtenues ne sont pas celles qui correspondent à Mtotal minimum.

    J'ai regardé en détail le code, celui-ci détecte parfaitement Motal minimum pour MLH2 compris dans l'intervalle souhaité. Le problème réside dans la récupération des valeurs de r et L correspondantes.

    Le problème se situerait donc à la dernière ligne du code ?

  4. #4
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Je pense avoir trouvé l'erreur, voici ma proposition :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    [rmin,Lmin] = ind2sub(size(Mtotal), k);
    Lmini=Lmin+49
    rmini=rmin
    Inversion de rmin et Lmin dans la matrice ainsi que rajout des 49 soustraits précédemment ? Ca semble fonctionner..

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Serait-il possible également d'ajouter un message indiquant, lorsque cela est nécessaire, que les bornes de L et de r initialement choisies ne permettent pas de trouver une masse MLH2 dans l'intervalle choisi ?

  6. #6
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 52 884
    Points
    52 884
    Par défaut
    Citation Envoyé par pen_duick Voir le message
    Serait-il possible également d'ajouter un message indiquant, lorsque cela est nécessaire, que les bornes de L et de r initialement choisies ne permettent pas de trouver une masse MLH2 dans l'intervalle choisi ?
    Il suffit de tester si il y a au moins un 1 logique dans le vecteur idx :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    idx = MLH2>(MLH2_fixed-100) & MLH2<(MLH2_fixed+100);
    if any(idx(:))
       % recherche du minimum
    else
       fprintf('Pas de masse  MLH2 dans l intervalle choisi');
    end
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  7. #7
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Merci, le programme marche bien maintenant. Cependant, je rencontre un autre problème:

    En effet, je souhaiterais que r varie de 1 à 2 par pas de 0.1.

    J'ai donc modifié ma boucle for en conséquence, mais une erreur apparaît puisque les indices r et L ne peuvent seulement être des réels positifs, ou des entiers..

  8. #8
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 52 884
    Points
    52 884
    Par défaut
    Deux possibilités

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    kr = 0;
    for r = 1:0.1:2
        kr = kr+1;
        kL = 0;
        for L = 50:80  
            kL = kL+1;
            [Mtotal(kr,kL), MLH2(kr,kL), Ltotal(kr,kL)] = Tank_sizingLRtest(L,r);
        end
    end
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    r = 1:0.1:2;
    L = 50:80;
     
    for i = 1:numel(r)
        for j = 1:numel(L) 
            [Mtotal(i,j), MLH2(i,j), Ltotal(i,j)] = Tank_sizingLRtest(L(j),r(i));
        end
    end
    A toi de gérer les indices dans le reste du code…
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  9. #9
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Je vous remercie beaucoup pour la rapidité et la précision de vos réponses. Je mets ce sujet en "résolu".

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 18/02/2009, 15h40
  2. Récupérer les arguments d'entrées d'une fonction
    Par robotron dans le forum MATLAB
    Réponses: 4
    Dernier message: 29/10/2008, 13h55
  3. nombre d'argument non specifie dans une fonction
    Par elmcherqui dans le forum C++
    Réponses: 2
    Dernier message: 27/05/2008, 18h10
  4. Réponses: 1
    Dernier message: 10/05/2008, 23h36
  5. "too few arguments" à l'initialisation d'une fonction
    Par mr:titi7 dans le forum Débuter
    Réponses: 14
    Dernier message: 13/01/2008, 05h12

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