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 :

Minimisation d'une fonction


Sujet :

MATLAB

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2014
    Messages : 6
    Points : 5
    Points
    5
    Par défaut Minimisation d'une fonction
    Bonjour,
    Je me heurte à un problème sur Matlab qui devrait pourtant se résoudre de manière plutôt simple il me semble pour des utilisateurs expérimentés...car comme vous le comprenez je suis vraiment novice!
    Pour faire simple, je cherche à savoir comment optimiser une fonction? je voudrais que matlab me détermine avec quelle dose (c'est de la pharmacocinétique) je minimise ma fonction (ou maximise si c'est plus simple). faut-il que dans ma fonction ma variable "dose" apparaisse forcément? faut-il bien utiliser "fminsearch"?? comment l'utilise t-on concrètement car très peu d'exemples...

    Merci par avance de votre aide!

  2. #2
    Modérateur
    Avatar de le fab
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    1 882
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 882
    Points : 3 432
    Points
    3 432
    Par défaut
    salut

    fminsearch est en effet une solution
    tu as d'autres fonctions disponibles (fminbnd, fmincon ...) selon si tu as des contraintes à spécifier pour ton problème
    regardes ce topic récent par exemple pour voir comment on utilise fminsearch

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2014
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    Je n'y arrive toujours pas. Le problème est que je suis vraiment novice sur Matlab (seulement depuis quelques semaines!). J'ai récupéré un script qu'on a réussi à modifier pour l'utiliser dans le travail que j'effectue pour ma thèse (pharmacologie).
    L'objectif de ce script serait de pouvoir trouver une dose D qui nous permettrait de minimiser "CUMPROBA". Je ne comprends pas comment avec l'utilisation de fminsearch je peux lui traduire ça...
    Voici les principales lignes du code pour comprendre le problème

    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
     
    ...
     %boucle de résolution
        while(n < nombre);
            n = n+1; 
            assignin('caller', 'n', n);
     
            dose = D;
     
            R = dose./perf; % débit de perf en mg/h
     
     
            [t, Y1] = ode45(@BU1diff, tspan1, y1,[], R, Ke);
            assignin('caller', 'Y1', Y1);
     
            %conditions initiales pour diff2
            ytemp = Y1(((1/pas).*borne1), :);
            y1 = y0 + ytemp';
     
            [t, Y2] = ode45(@BU2diff, tspan2, y1,[], Ke);
            assignin('caller', 'Y2', Y2);
     
            % nouvelles conditions initiales pour diff2
            ytemp = Y2(((1/pas).*(borne2 - borne1)), :);
            y1 = y0 + ytemp';
     
            tspan1 = tspan1 + borne2;
            assignin('caller', 'tspan1', tspan1);
     
            tspan2 = tspan2 + borne2;
            assignin('caller', 'tspan2', tspan2);
     
            Qi = [Y1;Y2];
     
            Q16 = [Q16;Qi]; % matrice des qté pour les 31 valeurs
     
            CONCi = Qi./Vd;
     
            CONC16 = [CONC16; CONCi];
     
       %résultats
    PROB = PARAM(:,3);
        assignin('caller', 'PROB', PROB);
     
        TARGET = (AUCavg>=3.68 & AUCavg<=6.14);
     
        F = TARGET.*PROB';
     
        CUMPROBA = sum(F);
        assignin('caller', 'CUMPROBA', CUMPROBA);
     
     
     
    function dy = BU1diff(t, y, R, Ke);
    dy = [R - Ke.*y(1)];
     
    function dy = BU2diff(t, y, Ke);
    dy = [- Ke.*y(1)];
    Si quelqu'un peut m'aider...Merci beaucoup !

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

    L'utilisation classique de fminsearch est de la forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    x = fminsearch(fun,x0);
    avec :
    • fun le handle de la fonction que tu cherches à minimiser ;
    • x0 une valeur de départ se rapprochant (de préférence) de la solution cherchée.

    la fonction à minimiser doit se présenter comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    function f = myfun(x)
    f = ...
    l'entrée x pouvant être, selon le cas d'étude, un scalaire, vecteur ou tableau 2D. Dans ton cas si j'ai bien compris il s'agit de D.
    Et la sortie f (Dans ton cas CUMPROBA), elle scalaire, qui est à calculer en fonction de l'entrée x : c'est cette sortie que la fonction fminsearch va chercher à minimiser en rentrant différentes valeurs de x.
    Pour une fonction nommée myfun à minimiser, on effectuera l'appel suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    x0 = ...
    x = fminsearch(@myfun, x0);
    Il arrive souvent que l'on veuille faire passer des arguments supplémentaires, du genre constantes, dans un soucis de non-recopie inutile de code, mais aussi dans l'intention de pouvoir les faire varier depuis l'extérieur, on créera alors une fonction anonyme sur la ligne d'appel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    x0 = ...
    param1 = ...
    param2 = ...
    . . .
    paramN = ...
    x = fminsearch(@(x) myfun(x,param1, param2, . . ., paramN) , x0);
    La définition de la fonction à minimiser prendra alors la forme suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function f = myfun(x, param1, param2, . . ., paramN)
    À toi donc de coder cette fonction "myfun" qui calculera CUMPROBA en fonction de D et d'autres éventuelles valeurs en paramètre.

Discussions similaires

  1. [fmincon] minimisation d'une fonction avec paramètre
    Par lefevrelaumonier dans le forum MATLAB
    Réponses: 5
    Dernier message: 05/12/2014, 08h50
  2. Réponses: 6
    Dernier message: 17/11/2012, 01h57
  3. Minimisation d'une fonction
    Par foufi86 dans le forum MATLAB
    Réponses: 4
    Dernier message: 13/05/2011, 16h51
  4. Minimisation d'une fonction en Fortran
    Par foscouch dans le forum Fortran
    Réponses: 4
    Dernier message: 07/06/2010, 16h23
  5. minimisation d'une fonction sur fortran
    Par lemale dans le forum Fortran
    Réponses: 1
    Dernier message: 21/05/2009, 15h40

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