Optimisation avec MATLAB
Présentation générale
Plusieurs fonctions spécifiques existent dans MATLAB pour résoudre des problèmes d'optimisation. Certaines fonctions sont disponibles dans la version de base du logiciel (polyfit/polyval, fminsearch et fminbnd) alors que les autres ne sont accessibles que par l'intermédiaire de l'optimization toobox.
Dans une grande majorité des cas, la fonction objectif du problème matlab doit être exprimée dans une fonction MATLAB externe ou anonyme. Selon la nature du problème d'optimisation à traiter, il est nécessaire de choisir la bonne fonction MATLAB apte à résoudre un tel problème. Dans le tableau suivant, sont regroupées les principales fonctions selon la nature des problèmes qu'elles peuvent résoudre.
Problème monodimensionnel sans contrainte | Méthode de la recherche dorée | fminbnd |
|---|---|---|
Problème multidimensionnel sans contrainte | Méthode de Nedler et Mead | fminsearch |
Problème multidimensionnel sans contrainte | Méthode de quasi-Newton | fminunc |
Problème multidimensionnel sans contrainte - identification paramétrique | Méthode de Gauss-Newton | lsqnonlin |
Identification paramétrique - cas d'un polynôme | Méthode des moindres carrés | polyfit / polyval |
Problème linéaire multidimensionnel avec contraintes | Méthode du Simplex (cf. cours de Recherche Opérationnelle) | linprog |
Problème non-linéaire multidimensionnel avec contraintes | Méthode Sequential Quadratic Programming | fmincon |
Fonction fminsearch (matlab)
La fonction fminsearch code la méthode de Nedler et Mead et permet de résoudre un problème multidimensionnel sans contrainte. C'est un méthode d'ordre 0, qui n'utilise aucune information concernant les gradients de la fonction objectif. La syntaxe générale de cette fonction peut faire appel à une fonction externe (premier cas) ou à une fonction anonyme (second cas):
[x,fval,exitflag,output] = fminsearch('fun',x0,options)
ou
[x,fval,exitflag,output] = fminsearch(@(x) fun(x),x0,options)
Arguments d'entrée :
fun: dans le premier cas,funest une fonction externe où est exprimée la fonction objectif qu'on cherche à minimiser. Dans le second cas,funest une fonction anonyme où est exprimée la fonction objectif qu'on cherche à minimiser.Entête de la fonctionexterne
fun:function f = fun(x);x0: vecteur des valeurs initiales pour démarrer la méthode. La dimension dex0est égale au nombre de variables du problème ;options (pas obligatoire) ; voir ci-dessous.
Arguments de sortie :
x: valeur finale des variables, ce sont les solutions si la méthode a convergé ;fval: valeur finale de la fonction à minimiser ;exitflag(pas obligatoire) : indicateur de fin d'exécution : 1 arrêt car solution trouvée, 0 car nombre d'itérations maximal atteint ;
output(pas obligatoire) : nombres d'itérations et d'évaluations de fonction réalisés.
Fonction fminbnd (matlab)
La fonction fminbnd code une méthode partiellement basée sur la méthode de la recherche dorée (optimisation monodimensionnelle sans contrainte). La syntaxe générale de cette fonction peut faire appel à une fonction externe (premier cas) ou à une fonction anonyme (second cas):
x,fval,exitflag,output] = fminbnd(‘fun',x1,x2,options)
ou
[x,fval,exitflag,output] = fminbnd(@(x) fun(x),x1,x2,options)
Arguments d'entrée :
fun: dans le premier cas,funest une fonction externe où est exprimée la fonction objectif qu'on cherche à minimiser. Dans le second cas,funest une fonction anonyme où est exprimée la fonction objectif qu'on cherche à minimiser. Entête de la fonctionfun:function f = fun(x)x1etx2: bornes inférieure et supérieure du domaine dans lequel la solution est recherchée.options(pas obligatoire) ; voir ci-dessous.
Arguments de sortie : voir les arguments de sortie de fminsearch.
Fonction fminunc (optimization toolbox)
La fonction fminunc code une méthode de type quasi-Newton pour l'optimisation multidimensionnelle sans contrainte. C'est une méthode d'ordre 2, la matrice hessienne est évaluée. La syntaxe générale de cette fonction peut faire appel à une fonction externe (premier cas) ou à une fonction anonyme (second cas):
[x,fval,exitflag,output] = fminunc('fun',x0,options)
ou
[x,fval,exitflag,output] = fminunc(@(x) fun(x),x0,options)
Arguments d'entrée et de sortie : voir fminsearch
Fonction lsqnonlin (optimization toolbox)
La fonction lsqnonlin code la méthode de Gauss-Newton pour l'optimisation multidimensionnelle sans contrainte. lsqnonlin est dédiée aux problèmes d'identification paramétrique puisque la fonction objectif doit s'exprimer sous la forme de termes élevés au carré ; chaque terme représentant la différence entre une valeur donnée et une valeur calculée par un modèle. La syntaxe générale de cette fonction peut faire appel à une fonction externe (premier cas) ou à une fonction anonyme (second cas):
[x,resnorm,residual,exitflag,output] = lsqnonlin(‘fun',x0,lb,ub,options)
ou
[x,resnorm,residual,exitflag,output] = lsqnonlin(@(x) fun(x),x0,lb,ub,options)
Arguments d'entrée :
fun: dans le premier cas,funest une fonction externe où sont exprimés les termes intervenant dans la fonction objectif qu'on cherche à minimiser. Dans le second cas,funest une fonction anonyme où sont exprimés les termes intervenant dans la fonction objectif qu'on cherche à minimiser. L'entête de la fonctionfunest ainsi :function F = fun(x);Fest un vecteur contenant l'ensemble des termes formant la fonction objectif (égale à la somme des termes deFélevés au carré) ;x0: vecteur des valeurs initiales pour démarrer la méthode. La dimension dex0est égale au nombre de variables du problème ;lbetub: bornes inférieure et supérieure des éléments dex: domaine dans lequel la solution est recherchée.lbetubont la même dimension quex;options (pas obligatoire) ; voir ci-dessous.
Arguments de sortie :
x: valeur finale des variables, ce sont les solutions si la méthode a convergé ;resnorm: valeur finale de la fonction à minimiser ;residual: vecteur des résidus, c'est à dire le vecteur sortie defunpour la valeur finale dexexitflag(pas obligatoire) : indicateur de fin d'exécution : 1 arrêt car solution trouvée, 0 car nombre d'itérations maximal atteint ;output(pas obligatoire) : nombres d'itérations et d'évaluations de fonction réalisés.
Fonction fmincon (optimization toolbox)
La fonction fmincon code des plusieurs méthodes (dont SQP) de résolution de problème d'optimisation multidimensionnelle avec contraintes. L'utilisateur avisé peut choisir la méthode numérique ou sinon laisser la fonction fmincon choisir automatiquement la méthode la plus adaptée. La syntaxe générale de cette fonction peut faire appel à une fonction externe (premier cas) ou à une fonction anonyme (second cas) :
[x,fval,exitflag,output,lambda,grad,hessian] = fmincon(‘fun',x0,A,B,Aeq,Beq,lb,ub,'nonlcon',option)
ou
[x,fval,exitflag,output,lambda,grad,hessian] = fmincon(@(x) fun(x),x0,A,B,Aeq,Beq,lb,ub,'nonlcon',option)
Arguments d'entrée :
fun: dans le premier cas,funest une fonction externe où est exprimée la fonction objectif qu'on cherche à minimiser. Dans le second cas,funest une fonction anonyme où est exprimée la fonction objectif qu'on cherche à minimiser. Entête de la fonctionfun:function f = fun(x) ;x0: vecteur des valeurs initiales pour démarrer la méthode. La dimension dex0est égale au nombre de variables du problème ;AetB: respectivement une matrice et un vecteur qui permettent d'exprimer les contraintes linéaires de type inégalité sous la forme :A*x <= B.AetBont autant de lignes que de contraintes inégalité linéaires ;Aa autant de colonnes que le nombre de variables de contrôle ;AeqetBeq: respectivement une matrice et un vecteur qui permettent d'exprimer les contraintes linéaires de type égalité sous la forme :Aeq*x = Beq.AeqetBeqont autant de lignes que de contraintes égalité linéaires ;Aeqa autant de colonnes que le nombre de variables de contrôle ;lbetub: bornes inférieure et supérieure des éléments dex.lbetubont la même dimension quex;‘
nonlcon' : nom de la fonction externe MATLAB dans laquelle sont définies les éventuelles contraintes non-linéaires égalité et inégalité. L'entête de nonlcon.m est :function [c,ceq] = nonlcon(x)cest un vecteur qui contient les résidus des contraintes inégalité (toutes les composantes decdoivent être négatives à la solution).ceqest un vecteur qui contient les résidus des contraintes égalité (toutes les composantes deceqdoivent être nulles à la solution).nonlconpeut être également définie comme une fonction anonyme ;options(pas obligatoire) ; voir ci-dessous.
Arguments de sortie :
x: valeur finale des variables, ce sont les solutions si la méthode a convergé ;fval: valeur finale de la fonction à minimiser ;exitflag(pas obligatoire) : indicateur de fin d'exécution : 1 arrêt car solution trouvée, 0 car nombre d'itérations maximal atteint ; il existe d'autres valeurs possible.
output(pas obligatoire) : nombres d'itérations et d'évaluations de fonction réalisés.lambda: structure qui contient la valeur des multiplicateurs de Lagrange à la valeur finale dexgrad: vecteur gradient à la valeur finale dexhessian: matrice hessienne à la valeur finale dex
Options
Les options par défaut peuvent être modifiées par l'intermédiaire de la fonction optimset qui est utilisée ainsi (par exemple avec fminbnd) :
options = optimset(‘propriete1',valeur1, ‘propriete2',valeur2, etc ...)
[x,fval,exitflag,output] = fminbnd('fun',x1,x2,options)
Les principales options modifiables sont entre autres :
'display': on choisira la valeur‘iter'pour la propriété‘display'afin d'avoir des informations sur le processus de convergence affichées à l'écran à chaque itération. Par défaut, les affichages ne sont proposés qu'en fin d'exécution.'MaxIter': si le nombre d'itérations n'est pas suffisant, il peut être modifié en choisissant une valeur entière plus grande.'MaxFunEvals': si le nombre d'évaluations de la fonction objectif n'est pas suffisant, il peut être modifié en choisissant une valeur entière plus grande.'tolX': si on veut changer le critère d'arrêt basé les variations des variables de contrôle, il peut être modifié en choisissant une valeur réelle (plus cette valeur est petite, plus les tolérances sont serrées).'Diagnostics': on choisira la valeur‘on'pour avoir un diagnostic du problème traité avant le début des calculs itératifs.
Exemple : Exemple d'utilisation : fmincon
On cherche à résoudre le problème suivant :
\(Min \quad -x_1x_2\)
\(h_1(x_1,x_2)=20*x_1+15*x_2-30=0\)
\(g_1(x_1,x_2)=(x_1/2)^2+x_2^2-1≤0\)
\(0≤x_1\) et \(0≤x_2\)
C'est un problème avec une contrainte linéaire égalité, une contrainte non-linéaire inégalité et des bornes sur les variables de contrôle.
x0=[0.5 0.8] ; % valeurs initiales pour x1 et x2 prises respectivement égales à 0.5 et 0.8
lb=[0 0] ; % definition des bornes inférieures
ub=[ ] ; % pas de bornes supérieures
Aeq=[20 15] ; Beq=[30] ; % définition des coefficients de la première contrainte linéaire égalité
A=[ ] ; B=[ ] ; % pas contrainte linéaire inégalité
fun=@(x) -x(1)*x(2) ; % definition de la fonction objectif (intermédiaire d'une fonction anonyme)
[x,fval,exitflag,output] = fmincon(@(x) fun(x),x0,A,B,Aeq,Beq,lb,ub,'nonlcon')
Dans une fonction externe nonlcon.m, va être définie la contrainte non linéaire inégalité :
function [c,ceq]=nonlcon(x)
ceq = [] ; % pas de contrainte non linéaire égalité
c(1)=(x(1)/2)^2+x(2)-1 ; % definition de la contrainte non lineaire égalité sous la fome c(x) <=0
end