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 :

Minimum globale d'une fonction à deux variable.


Sujet :

MATLAB

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2019
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2019
    Messages : 8
    Points : 7
    Points
    7
    Par défaut Minimum globale d'une fonction à deux variable.
    Bonjour,

    Pour la résolution d'un problème de mécanique je cherche à trouver le minimum globale ( ou local dans un certain espace compacte) d'une fonction de transfert qui est la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    abs((x/y (x/y - (2 π×50)^2 - 2×0.005 sqrt(x/y)×2 π×50))/((x/y - (2 π×50)^2)^2 + 4×0.005^2×x/y (2 π×50)^2))
    J'ai donc essayé la fonction fminsearch de MATLAB pour trouver ce minimum, mais j'ai quelques difficulté à mettre en place ce calcul. Je précise que je suis débutant j'apprends tout juste à utiliser MATLAB.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    X=linspace(0,1,1000)
    Y=linspace(0,1,1000)
    [x,y]=meshgrid(X,Y);
    z=abs(((x./y).*((x./y)-(2*pi*50)^2-2*0.005*sqrt(x./y)*2*pi*50))./(((x./y)-(2*pi*50)^2).^2+4*0.005^2*(x./y)*(2*pi*50)^2));
    surf(x,y,z)
    x0=[0,0]
    A = fminsearch(z,x0);
    Ci-dessus le programme que j'ai utilisé mais qui ne fonctionne pas ...

  2. #2
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2019
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2019
    Messages : 90
    Points : 254
    Points
    254
    Par défaut
    Bonjour,

    Avec ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    X=linspace(0,1,1000)
    Y=linspace(0,1,1000)
    [x,y]=meshgrid(X,Y);
    z=abs(((x./y).*((x./y)-(2*pi*50)^2-2*0.005*sqrt(x./y)*2*pi*50))./(((x./y)-(2*pi*50)^2).^2+4*0.005^2*(x./y)*(2*pi*50)^2));
    tu crées une matrice z dont les éléments on la valeur de la fonction en chacun des points du maillage. Il est alors possible de chercher le point du maillage ayant la plus petite valeur avec la fonction min(), puis éventuellement de remonter aux valeurs de (x,y) associées (cf. infra). Il n'y a alors pas besoin d'algo de minimisation, et la résolution est limitée à la résolution de la grille (soit, ici, 1/1000).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    [zMin, minIndex] = min(z(:)) ; % trouve la valeur minimale de la fonction et son indice dans la matrice
    [row,col] = ind2sub(size(z),minIndex) ; % trouve les "coordonnées" du minimum dans la matrice
    xMin = X(col) ;
    yMin = Y(row) ;
    Une autre manière de faire consiste à utiliser fminsearch (ou plutôt fmincon puisque tu travailles sur un domaine borné). Pour celà, il faut définir la fonction à minimiser comme une fonction, c'est à dire qu'elle doit prendre des arguments (x,y) en entrée et calculer la valeur de z associée. Pour celà, on peut utiliser une fonction anonyme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    clear x y % inutile, placé ici uniquement pour montrer que les variables (x,y) dans la ligne suivant sont muettes
    z=@(x,y) abs(((x./y).*((x./y)-(2*pi*50)^2-2*0.005*sqrt(x./y)*2*pi*50))./(((x./y)-(2*pi*50)^2).^2+4*0.005^2*(x./y)*(2*pi*50)^2));
    z0=@(x) z(x(1), x(2)) ; % nécessaire car la fonction appelée par fminsearch ne doit prendre qu'un argument alors que la fonction z est ici définie avec deux arguments d'entrée.
    x0=[0,0]
    A = fminsearch(z0,x0);
    A = fmincon(z0, x0,[], [], [], [], [0 0], [1 1]) ;% alternative

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2019
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2019
    Messages : 8
    Points : 7
    Points
    7
    Par défaut
    Bonjour Antoane,

    Merci pour ton aide !
    En revanche j'ai essayé les 2 codes que tu m'as proposé, mais aucun ne marche =/.
    Voici le message d'erreur du code 1:
    Input arguments to function include colon operator. To input the colon
    character, use ':' instead.
    
    [zMin, minIndex] = min(z(:)) ; % trouve la valeur minimale de la fonction
    et son indice dans la matrice
    Voici le message d'erreur du code 2:
    Exiting: Maximum number of function evaluations has been exceeded
             - increase MaxFunEvals option.
             Current function value: 0.000000

  4. #4
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2019
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2019
    Messages : 90
    Points : 254
    Points
    254
    Par défaut
    Bonsoir,

    Quelle version de matlab utilises-tu ?
    Je n'ai pas la première erreur avec la 2019a.

    Pour ce qui est de la seconde erreur, c'est du au choix de x0. Essaye x0 = [0.5 0.5] par exemple.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2019
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2019
    Messages : 8
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par Antoane Voir le message
    Bonsoir,

    Quelle version de matlab utilises-tu ?
    Je n'ai pas la première erreur avec la 2019a.

    Pour ce qui est de la seconde erreur, c'est du au choix de x0. Essaye x0 = [0.5 0.5] par exemple.
    Bonjour Antoane,

    J'ai la version 2018a personnellement.

    En modifiant x0 ça marche !Mais je n'ai pas l'impression que ça me donne les valeurs de x et de y.
    Optimization completed: The relative first-order optimality measure, 4.999886e-07,
    is less than options.OptimalityTolerance = 1.000000e-06, and the relative maximum constraint
    violation, 0.000000e+00, is less than options.ConstraintTolerance = 1.000000e-06.

    Optimization Metric Options
    relative first-order optimality = 5.00e-07 OptimalityTolerance = 1e-06 (default)
    relative max(constraint violation) = 0.00e+00 ConstraintTolerance = 1e-06 (default)

    Parcontre je ne comprends pas ces 2 lignes de code, pourrais-tu me les expliquer stp ?
    z0=@(x) z(x(1), x(2)) ; % nécessaire car la fonction appelée par fminsearch ne doit prendre qu'un argument alors que la fonction z est ici définie avec deux arguments d'entrée.
    A = fmincon(z0, x0,[], [], [], [], [0 0], [1 1])

  6. #6
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2019
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2019
    Messages : 90
    Points : 254
    Points
    254
    Par défaut
    Bonjour,
    Citation Envoyé par rachid999 Voir le message
    En modifiant x0 ça marche !Mais je n'ai pas l'impression que ça me donne les valeurs de x et de y.
    Optimization completed: The relative first-order optimality measure, 4.999886e-07,
    is less than options.OptimalityTolerance = 1.000000e-06, and the relative maximum constraint
    violation, 0.000000e+00, is less than options.ConstraintTolerance = 1.000000e-06.

    Optimization Metric Options
    relative first-order optimality = 5.00e-07 OptimalityTolerance = 1e-06 (default)
    relative max(constraint violation) = 0.00e+00 ConstraintTolerance = 1e-06 (default)
    A(1) et A(2) sont les valeurs de x et de y minimisant la fonction.


    z=@(x,y) abs(((x./y).*((x./y)-(2*pi*50)^2-2*0.005*sqrt(x./y)*2*pi*50))./(((x./y)-(2*pi*50)^2).^2+4*0.005^2*(x./y)*(2*pi*50)^2));
    z0=@(toto) z(toto(1), toto(2)) ; % nécessaire car la fonction appelée par fminsearch ne doit prendre qu'un argument alors que la fonction z est ici définie avec deux arguments d'entrée.
    z est une fonction (dite "anonyme") prenant deux scalaires comme arguments d'entrée. C'est une fonction qui, pour un couple (x,y) donné, va calculer la valeur de z associée.
    z0 est une fonction (dite "anonyme") prenant un unique argument en entrée, et cet argument est un vecteur de longueur 2. Cet argument, que j'ai appelé ici toto pour clarifier, regroupe les valeurs de x et de y dans un unique vecteur. en appelant z0(toto), on appelle en fait z(toto(1), toto(2)). Donc si toto=[x,y], alors z0(toto) = z(x,y).
    z0 est donc un moyen d'appeler z avec un unique argument d'entrée. C'est nécessaire car la fonction fmincon ne fonctionne qu'avec des fonctions ne prenant qu'un unique argument d'entrée.

    A = fmincon(z0, toto0,[], [], [], [], [0 0], [1 1])
    Avec cette ligne, la fonction fmincon va aller chercher le minimum de la fonction z0 (et donc de la fonction z) en cherchant à partir du point toto0, et en gardant toto dans les limites [0, 0] < toto < [1 1].
    Autrement dit : fmincon va chercher le mininum de la fonction z en començant par le point de coordonnées x=toto(1) , y=toto(2), et en faisant en sorte que 0<x<1 et 0<y<1.
    Les "[]" permettent d'indiquer à la fonction que les contraintes d'inégalités ne sont pas utilisées (voir l'aide : https://de.mathworks.com/help/optim/ug/fmincon.html).

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2019
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2019
    Messages : 8
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par Antoane Voir le message
    Bonjour,

    A(1) et A(2) sont les valeurs de x et de y minimisant la fonction.



    z est une fonction (dite "anonyme") prenant deux scalaires comme arguments d'entrée. C'est une fonction qui, pour un couple (x,y) donné, va calculer la valeur de z associée.
    z0 est une fonction (dite "anonyme") prenant un unique argument en entrée, et cet argument est un vecteur de longueur 2. Cet argument, que j'ai appelé ici toto pour clarifier, regroupe les valeurs de x et de y dans un unique vecteur. en appelant z0(toto), on appelle en fait z(toto(1), toto(2)). Donc si toto=[x,y], alors z0(toto) = z(x,y).
    z0 est donc un moyen d'appeler z avec un unique argument d'entrée. C'est nécessaire car la fonction fmincon ne fonctionne qu'avec des fonctions ne prenant qu'un unique argument d'entrée.


    Avec cette ligne, la fonction fmincon va aller chercher le minimum de la fonction z0 (et donc de la fonction z) en cherchant à partir du point toto0, et en gardant toto dans les limites [0, 0] < toto < [1 1].
    Autrement dit : fmincon va chercher le mininum de la fonction z en començant par le point de coordonnées x=toto(1) , y=toto(2), et en faisant en sorte que 0<x<1 et 0<y<1.
    Les "[]" permettent d'indiquer à la fonction que les contraintes d'inégalités ne sont pas utilisées (voir l'aide : https://de.mathworks.com/help/optim/ug/fmincon.html).
    Ok super merci beaucoup pour ton aide et tes explications !

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

Discussions similaires

  1. Intégrale simple d'une fonction à deux variables
    Par Pineau_R dans le forum MATLAB
    Réponses: 1
    Dernier message: 04/08/2017, 12h37
  2. Réponses: 5
    Dernier message: 07/11/2013, 12h12
  3. tracé d'une fonction à deux variables
    Par gogo1741 dans le forum Fortran
    Réponses: 2
    Dernier message: 24/04/2012, 01h26
  4. tracé d'une fonction à deux variables
    Par humanite dans le forum MATLAB
    Réponses: 1
    Dernier message: 05/12/2011, 21h22
  5. Variables globales dans une fonction?
    Par Death83 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 26/07/2006, 02h53

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