Chapitre 2
Chapitre 2
I Introduction 11
I-A Convergence . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
I-B Critères d’arrêt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
II Algorithme de Newton 13
II-A Algorithme de quasi-Newton . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
IV Algorithmes génétiques 30
I. Introduction
S. Kenouche est docteur en Physique de l’Université des Sciences et Techniques de Montpellier et docteur en Chimie de
l’Université A. Mira de Béjaia.
page web personnelle : http://www.sites.univ-biskra.dz/kenouche
Version corrigée, améliorée et actualisée le 10.10.2020.
M. Samir KENOUCHE
Avec X̂ = (x̂1 , x̂2 , ..., x̂n )T sont les coordonnées du point critique. On fait appel aux algorithmes d’optimisa-
A. Convergence
n o
L’étude de la convergence d’une méthode numérique est atteinte à travers la suite des itérés X (k)
k∈N
générés par l’algorithme. Ce dernier est dit convergent si pour tout X (0) ∈ Rn nous avons :
Avec X ∗ ∈ Rn est la solution approchée, de la valeur exacte, déterminée avec une tolérance fixée préalablement.
La condition (2) garantit, à partir d’une certaine itération, la satisfaction du critère d’arrêt pour la tolérance
exigée. Nous rappelons que le taux de convergence (ou ”vitesse” de convergence) et la complexité du problème
traité rentrent en ligne de compte lors de l’utilisation d’un algorithme d’optimisation. La convergence ne
signifie pas systématiquement l’existence d’un optimum même local. Le schéma numérique adopté doit être
à la fois rapide et robuste. Ces deux derniers critères sont contrôlés par l’étude du taux de convergence qui
quantifie l’erreur commise à chaque itération, soit :
en fonction de k e(k) k avec une échelle logarithmique. Ainsi, l’ordre noté p, de la méthode numérique s’obtient
à partir de :
L’ordre, p, est quantifié via la pente de l’équation ci-dessus. Il en ressort les conclusions suivantes :
1) Si p = 1 =⇒ X (k) converge linéairement vers la solution approchée. Dans ce cas on gagne la même
quantité de précision à chaque itération. Il en résulte :
k X (k+1) − X ∗ k
lim = =τ avec 0 < τ < 1 (5)
k→+∞ k X (k) − X ∗ k
Elle est dite superlinéaire si τ = 0.
2) Si p = 2 =⇒ X (k) converge quadratiquement vers la solution approchée. Dans ce cas on gagne le double
de précision à chaque itération.
3) Si p = 3 =⇒ X (k) converge cubiquement vers la solution approchée. Dans ce cas on gagne le triple de
précision à chaque itération. Il en résulte :
k X (k+1) − X ∗ k
lim = =τ avec τ ≥ 0 (6)
k→+∞ k X (k) − X ∗ kp
k X (k+2) − X (k+1) k
Kp (X, k) = (7)
k X (k+1) − X (k) kp
Bien évidemment, nous visons à ce que la convergence de l’algorithme soit la plus élevée possible afin de
tendre vers la solution en un minimum d’itérations pour la tolérance exigée. La convergence quadratique est
plus rapide que celle superlinéaire. A son tour cette dernière, est plus rapide que la convergence linéaire. Tenant
compte de l’équation (7), il vient que plus Kp (X, k) tend vers zéro plus le taux de convergence de la méthode
est élevé.
B. Critères d’arrêt
Les méthodes numériques, dites locales, procèdent de façon itérative. Typiquement, étant donné une valeur
initiale, un nouvel itéré est mis à jour afin de converger vers un point stationnaire. Ce processus est réitéré
jusqu’à la satisfaction d’un ou plusieurs critères d’arrêt de l’algorithme. D’un point de vue purement théorique,
le schéma itératif est infini. En pratique, la suite d’approximations successives est tronquée dés que l’on
considère avoir atteint la précision requise. Étant donné une tolérance , les critères d’arrêt pouvant êtres
envisagés sont :
k f (X (k+1) ) − f (X (k) ) k
< (10)
k f (X (k) ) k
Cours complet est disponible sur mon site web : http://sites.univ-biskra.dz/kenouche/
Il est possible d’envisager également un quatrième critère, celui du nombre d’itérations dépassant un seuil
fixé préalablement. Il se peut que le critère (23) ne soit pas satisfait même si l’algorithme converge. Les erreurs
d’arrondis dues à l’accumulation des opérations arithmétiques peuvent êtres du même ordre de grandeur que le
gain de précision obtenu à l’itération en cours. Le critère (8) est recommandé, le schéma itératif est interrompu
lorsqu’il ne produit plus de gain significatif en terme de précision. En outre, dans certaines situations la
divergence d’un algorithme ne signifie pas forcément l’inexistence de la solution, il faudra juste adapter le
nombre d’itérations et/ou la tolérance considérés. D’un point de vue purement pratique, une combinaison de
ces critères est prise en compte.
Les deux opérations d’optimisation sont pleinement équivalentes. La méthode de Newton est efficiente,
notamment parce qu’elle prend en compte la courbure de la fonction-objectif à travers le calcul de sa seconde
dérivée. Cette méthode est praticable si à chaque itération, la dérivée seconde est définie ou la matrice hessienne
est définie positive pour le cas X (k) ∈ Rn . Soit f : Rn −→ R une fonction de classe C 2 . Le développement en
série de Taylor d’ordre deux (modèle quadratique) est une fonction PX (k) (X) : Rn −→ R, avec :
1
PX (k) (X) = f (X (k) ) + (X − X (k) )T ∇f (X (k) ) + (X − X (k) )T ∇2 f (X (k) ) (X − X (k) ) (12)
2!
Chapitre2 Algorithmes d’optimisation 13
M. Samir KENOUCHE
Avec, ∇2 f (X (k) ) est la matrice Hessienne de f en X = X (k) soit Hf (X (k) ) = ∇2 f (X (k) ). Posons U =
∇f (X (k) )
∇f (X (k) ) = −U ∇2 f (X (k) ) ⇒ U = − (16)
∇2 f (X (k) )
∇f (X (k) )
X = X (k) − avec U = X − X (k) (17)
∇2 f (X (k) )
∇f (X (k) )
X (k+1) = X (k) − (18)
∇2 f (X (k) )
Ou bien avec une écriture équivalente :
1 4 1
f (X) = x + x32 − x33 + 6 x21 + 3 x22 + 6 x1 x2 (20)
4 3 3
La tolérance vaut = 10−5 et pour l’évaluation numérique prendre X (0) = (−0.6637, 0.1758, 1.5778)T .
Les résolutions analytique et numérique seront menées pendant la séance de cours. Le script Matlabr est
donné ci-dessous
clear␣all␣;␣clc␣;␣close␣all␣;
%␣Samir␣KENOUCHE␣-␣LE␣08/08/2019
%␣ALGORITHME␣DE␣NEWTON
fx␣=␣@(x)␣(1/4)*x(3)ˆ4␣+␣x(2)ˆ3␣-␣(1/3)*x(3)ˆ3␣+␣6*x(1)ˆ2␣+␣...
␣␣␣␣3*x(2)ˆ2␣+␣6*x(1)*x(2)␣;
rng(1110,’twister’)␣␣;␣%␣INITIALISATION␣DU␣GENERATEUR␣DES␣NOMBRES␣ALEATOIRES
xinit␣=␣randn(1,3)’␣;␣␣%␣INITIALISATION␣ALEATOIRE
it␣=␣0␣;␣itmax␣=␣20␣;␣␣%␣NOMBRE␣D’ITERATIONS
Cours complet est disponible sur mon site web : http://sites.univ-biskra.dz/kenouche/
err␣=␣10.ˆ(-5)␣;␣␣␣␣␣␣␣%␣TOLERANCE
while␣it␣<␣itmax
␣␣␣␣Hx(1,1)␣=␣12␣;␣Hx(1,2)␣=␣6␣;␣Hx(1,3)␣=␣0␣;
␣␣␣␣Hx(2,1)␣=␣6␣;␣Hx(2,2)␣=␣6*xinit(2)␣+␣6␣;␣Hx(2,3)␣=␣0␣;
␣␣␣␣Hx(3,1)␣=␣0␣;␣Hx(3,2)␣=␣0␣;␣Hx(3,3)␣=␣3*xinit(3)ˆ2␣-␣2*xinit(3)␣;
␣␣␣␣dfx␣=␣[12*xinit(1)␣+␣6*xinit(2)␣;␣...
␣␣␣␣␣␣␣␣␣3*xinit(2)ˆ2+␣6*xinit(1)␣+␣6*xinit(2)␣;␣xinit(3)ˆ3␣-␣xinit(3)ˆ2]␣;
␣␣␣␣xk␣=␣xinit␣-␣inv(Hx)*dfx␣␣;
␣␣␣␣␣␣␣␣␣if␣␣norm(inv(Hx)*dfx)␣<=␣err␣␣␣%␣TEST␣D’ARRET
␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣solution␣=␣xk␣;␣␣␣␣␣␣␣␣␣␣%␣OPTIMUM␣OBTENU
␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣f_min␣=␣fx(solution)␣;␣␣␣%␣MINIMUM␣DE␣LA␣FONCTION-OBJECTIF
␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣iteration_max␣=␣it␣;␣␣␣␣␣%␣NOMBRE␣D’ITERATIONS␣PERMETTANT␣LA␣CV
␣␣␣␣␣␣␣␣␣␣break
␣␣␣␣␣␣␣␣␣end
␣␣␣␣xinit␣=␣xk␣;␣it␣=␣it␣+␣1␣;␣␣␣␣␣␣␣␣␣␣%␣MISE␣A␣JOUR
end
%%␣SOLUTION␣:␣X*␣=(0,␣0,␣1)␣EN␣04␣ITERATIONS
Nota Bene: Toutes les méthodes numériques ont une structure d’une suite numérique. Ce qui les dis-
tinguent, c’est la formule du schéma numérique de la méthode en question. Toute suite de nombres réels (ou
de nombre complexe C) est convergente si et seulement si elle vérifie le critère de Cauchy.
n o
Définition d’une suite de Cauchy: Une suite X (k) est de Cauchy (ou vérifie le critère de
k∈N
Cauchy) si pour un rang k ∈ N suffisamment grand nous avons :
1. Rappelons que toute suite convergente dans R est une suite de Cauchy.
qk
2. Pour les puristes, nous opterons plutôt pour k X (k+1) − X (k) k ≤ k X (1) − X (0) k
1−q
!
y T H (k) yk dk dTk H (k) yk dTk + dk ykT H (k)
H (k+1) = H (k) + 1 + k T − (26)
y dk ykT dk ykT dk
Avec,
yk = ∇f (X (k+1 ) − ∇f (X (k )
D’autres versions de cet algorithme existent aussi, nous citerons notamment la formule de Davidon-Fletcher-
Powell, communément appelée DFP. L’inconvénient des méthodes de quai-Newton est que l’on exploite pas
toute l’information portant sur la forme de la fonction-objectif. Par ailleurs, l’initialisation de H0 ∈ Rn×n
se fait très souvent avec la matrice identité I ∈ Rn×n . La pratique montre que ce choix semble donner des
résultats très probants. Ci-dessous, l’écriture algorithmique de la méthode de Quasi-Newton
Exercice · + r
Nous appliquerons cette méthode pour chercher le minimum de la fonction-objectif à deux dimensions
suivante :
1 2 7 2
f (X) = x + y
2 2 (27)
(0)
Avec X = (7.5, 2.2)
%␣Le␣12.08.2019␣-␣Samir␣KENOUCHE
%␣Algorithme␣de␣BFGS␣-␣quasi-Newton
n␣=␣2␣;␣Hinit␣=␣eye(n,n)␣;
fxy␣=␣@(x,y)␣x.ˆ2*(1/2)␣+␣y.ˆ2*(7/2)␣;␣dfx␣=␣@(x)␣x␣;␣dfy␣=␣@(y)␣7.*y␣;
it␣=␣0␣;␣itmax␣=␣10␣;␣tol␣=␣␣1e-5␣;␣xinit␣=␣[7␣;␣2]␣;
while␣it␣<␣itmax
␣␣␣d␣=␣-␣Hinit*[dfx(xinit(1))␣;␣dfy(xinit(2))]␣;
␣␣␣lambdak␣=␣-(xinit(1)*d(1)␣+␣7*xinit(2)*d(2))/(d(1).ˆ2␣+␣7*d(2).ˆ2)␣;
␣␣␣dk␣=␣lambdak*d␣;␣xk␣=␣xinit␣+␣dk␣;
␣␣␣if␣norm(dk)␣<␣tol
␣␣␣␣␣solution␣=␣xk␣␣␣;␣%␣VECTEUR␣SOLUTION
␣␣␣␣␣nbr_it␣=␣it␣;␣␣␣␣␣%␣NOMBRE␣D’ITERATION␣PERMETTANT␣LA␣CV
␣␣␣␣␣␣␣break
␣␣␣end
␣␣␣yk␣=␣[dfx(xk(1))␣;␣dfy(xk(2))]␣-␣[dfx(xinit(1))␣;␣dfy(xinit(2))]␣;
␣␣␣Hk␣=␣Hinit␣+␣(1␣+␣(yk’*Hinit*yk)/(yk’*dk))*(dk*dk’)/(yk’*dk)␣-␣...
␣␣␣␣␣␣␣(Hinit*yk*dk’␣+␣dk*yk’*Hinit)/(yk’*dk)␣;
␣␣␣Hinit␣=␣Hk␣;␣xinit␣=␣xk␣;␣␣it␣=␣it␣+␣1␣;␣%␣MISE␣A␣JOUR
Cours complet est disponible sur mon site web : http://sites.univ-biskra.dz/kenouche/
end
solution
Les méthodes de Newton et de quasi-Newton peuvent rencontrer des problèmes tels que le calcul du Hessien
soit trop complexe ou qu’il n’existe pas. La nécessité d’appliquer une inversion matricielle à chaque itération,
ceci peut se révéler rédhibitoire pour des problèmes d’optimisation mobilisant beaucoup de variables. Ces
méthodes peuvent donc devenir impraticables. Une alternative consiste à utiliser la famille des algorithmes de
descente de gradient. Ces méthodes ne requièrent pas le calcul explicite ou l’approximation du Hessien. Elles
n’exigent pas de facto le stockage du Hessien (Rn×n ), mais seulement un ou quelques vecteurs (∈ Rn ).
→
−
Par définition, la dérivée directionnelle de f (x, y) dans la direction du vecteur unitaire d = a~i + b ~j au
f (x0 + λ a, y0 + λ b) − f (x0 , y0 ) →
−
→ (x0 , y0 ) = lim
f−
d
= ∇f (x0 , y0 ) d (28)
λ→0 λ
→
−
Théorème : La dérivée directionnelle est maximale lorsque d a la même direction que ∇f (x0 , y0 ) de plus
le taux de variation maximal de f (x, y) en (x0 , y0 ) est ||∇f (x0 , y0 )||.
→
− →
−
Ce théorème peut être prouvé en considérant que f− → (x0 , y0 ) = ∇f (x0 , y0 ) d = ||∇f (x0 , y0 )|| || d || cos(θ) =
d
→
−
||∇f (x0 , y0 )|| cos(θ). Ainsi f−
→ (x0 , y0 ) est maximale si cos(θ) = ±1 autrement dit si la condition ∇f (x0 , y0 )// d
d
→
−
est satisfaite. Dans le cas où θ = π/2 ⇒ ∇f (x0 , y0 ) ⊥ d . Ce résultat indique que si je me déplace dans une
direction perpendiculaire au ∇f , le taux de variation de la fonction f (x, y) est nul.
→
− →
−
– Si les deux vecteurs ∇f et d ont la même direction et le même sens, dans ce cas le vecteur unitaire d
désigne une direction de croissance maximale de f (x, y).
→
− →
−
– Si les deux vecteurs ∇f et d ont la même direction et de sens opposé, dans ce cas le vecteur unitaire d
désigne une direction de décroissance maximale de f (x, y). Cette condition est prouvée selon :
→
−
∇f (x0 , y0 ) × d = ∇f (x0 , y0 ) × (−∇f (x0 , y0 ))
= −∇f (x0 , y0 ) × ∇f (x0 , y0 )
= − ||∇(x0 , y0 )||2 >0
| {z }
| {z }
Cours complet est disponible sur mon site web : http://sites.univ-biskra.dz/kenouche/
<0
→
−
⇒ d = −∇f est une direction de descente
Théorème: Soit f une fonction C 1 sur un ouvert D de R2 et P0 un point d eD tel que f (P0 ) = k. Nous
supposons que le ∇f est non nul au point P0 = (x0 , y0 ). La tangente en P0 à la courbe d’équation f (x, y) = c
a comme équation :
x
o xk
o xk+1
y
0
dk
Cours complet est disponible sur mon site web : http://sites.univ-biskra.dz/kenouche/
−
x− −−→ → − −−−−→ →
−
avec λ ∈ R∗+
k xk+1 //dk ⇒ xk xk+1 = λ dk
−
x− −−→ −−−−→ −−→ −−−−→ −−→ −−−−→
k xk+1 = Oxk+1 − Oxk ⇒ Oxk+1 = Oxk + xk xk+1
−−−−→ −−→ →
−
⇒ Oxk+1 = Oxk + λ dk (38)
Afin d’illustrer le principe de fonctionnement de cet algorithme, nous chercherons à optimiser une fonction-
objectif d’une seule variable.
Exercice ¸ + r
Cherchons la minimisation de la fonction-objectif :
Cours complet est disponible sur mon site web : http://sites.univ-biskra.dz/kenouche/
Cette fonction est au moins de classe C 1 sur R. Exécutons le schéma numérique de l’algorithme de descente
de gradient à pas fixe pour x0 = 1.50000, λ = 0.02 et = 10−3 , soit :
h (k)
i
x(k+1) = x(k) + λ dk = x(k) − λ∇f (x(k) ) = x(k) − λ 8 x(k) + ex
Commençons par appliquer le schéma numérique ci-dessus,
Exercice ¹ + r
Soit la fonction-objectif ci-dessous :
( √
f (x) = cos(2 x) x2 + 1
(41)
Avec x0 = −2, x ∈ [−4, 0]
1) Écrire un script Matlabr de l’algorithme de descente de gradient permettant la minimisation de la
fonction-objectif.
Script Matlabr
clear␣all␣;␣close␣all␣;␣clc␣;
%␣Le␣05.08.2019␣-␣Samir␣KENOUCHE
%%%%%%%%%%%%%%%%%%%%%%%␣DSCENTE␣DE␣GRADIENT␣A␣PAS␣FIXE␣%%%%%%%%%%%%%%%%%%%%%%
syms␣x
fun␣=␣cos(2*x)␣+␣sqrt(xˆ2␣+␣1)␣;␣dfun␣=␣diff(fun,x)␣;
xi␣=␣-4:0.004:␣0␣;␣fx␣=␣subs(fun,␣x,␣xi)␣;␣dfx␣=␣subs(dfun,␣x,␣xi)␣;
xinit␣=␣-3␣;␣lambda␣=␣0.1/2␣;␣itmax␣=␣100␣;␣it␣=␣0␣;␣echelle␣=␣0.5␣;
tol␣=␣␣1e-3␣;␣plot(xi,fx,’LineWidth’,1)␣;␣hold␣on␣;
␣while␣it␣<␣itmax
␣␣␣␣J␣=␣subs(dfun,␣x,␣xinit)␣;
Cours complet est disponible sur mon site web : http://sites.univ-biskra.dz/kenouche/
␣␣␣␣xn␣=␣xinit␣-␣lambda*J␣;␣xinit␣=␣xn␣;
␣␣␣␣it␣=␣it␣+␣1;
␣␣␣␣fxn␣=␣subs(fun,␣x,␣xn)␣;␣dfxn␣=␣subs(dfun␣,␣x,␣xn)␣;
␣␣␣␣if␣abs(lambda*J)␣<␣tol
␣␣␣␣␣␣␣␣␣sol␣=␣xn
␣␣␣␣␣␣␣␣␣break
␣␣␣␣end
␣␣␣␣dk␣=␣-␣dfxn␣;␣%␣DIRECTION␣DE␣DESCENTE
␣␣␣␣plot(xn,␣fxn,’xr’,’MarkerSize’,7)␣;␣hold␣on␣;
␣␣␣␣plot(xn,␣fxn,’or’,’MarkerSize’,7)␣;␣hold␣on␣;
␣␣␣quiver(xn,fxn,dk,0,␣echelle,’Color’,␣’k’,’LineWidth’,1)␣;␣hold␣on;
␣end
h␣=␣gca␣;
str(1)␣=␣{’Plot␣of␣the␣function␣:’};
str(2)␣=␣{’$$y␣=␣\cos(2\,x)␣+␣\sqrt{xˆ2␣+␣1}$$’};
str(3)␣=␣{’With␣the␣minimum:’};
str(4)␣=␣{[’$$x_{min}␣=␣$$’,␣num2str(sol)]};
set(gcf,’CurrentAxes’,h)␣;
text(’Interpreter’,’latex’,␣’String’,str,’Position’,[-3.9␣1.5],’FontSize’,12)
Le minimum renvoyé par ce script est : sol = -1.3668. L’inconvénient de cette méthode est qu’elle réclame
une valeur initiale très proche de la solution approchée. Dans le cas contraire, l’algorithme ne convergera pas
vers le véritable minimum de la fonction. Nous faisons remarquer que le critère d’arrêt k X (k+1) − X (k) k est
totalement équivalent à celui de k λk ∇f X (k) k.
L’inconvénient d’utiliser un pas de descente constant (λ = cst) est que l’algorithme converge très lentement
si le pas est trop petit. De plus, l’algorithme peut devenir instable dans le cas où le pas est trop grand. On
comprend donc que le choix optimal de la valeur de λ devient délicat dans ce cas de figure. Il faudra par
conséquent ajuster la valeur de λ à chaque itération. Cette procédure est appelée recherche en ligne (line
search) 3 . Nous appliquerons à cet effet la méthode de gradient à pas optimal. L’idée de base de cette méthode
est de chercher λk diminuant d’avantage f (x(k) ) dans la direction dk = −∇f (x(k) ), selon :
0
ϕ(λk ) = argmin f (x(k) − λ ∇f (x(k) )) ⇔ ϕ (λk ) = 0 ⇔ ϕ(λopt ) ≤ ϕ(λk ) (42)
λ>0
Il convient de noter, qu’en toute rigueur le pas de descente n’est pas λ mais λ dk . L’opération d’optimisation
du pas de descente permet de répondre à la question : quelle distance doit-on parcourir ? Cherchons la valeur
du pas λk minimisant une fonction-objectif f (X (k+1) ), avec X ∈ Rn , dans la direction de descente dk . Nous
avons :
Ainsi,
∂f (X (k+1) )
(λ = λk ) = 0 ⇔ ∇f (X (k+1) ) ∇f (X (k) ) = 0 (47)
∂λ
Tenant compte de (44) il vient
h iT
∇f (X (k+1) ) ∇f (X (k) ) = A X (k+1) − b ∇f (X (k) ) = 0
h h i iT
= A X (k) − λk ∇f (X (k) ) − b ∇f (X (k) ) = 0
h iT
= A X (k) − b − A λk ∇f (X (k) ) ∇f (X (k) ) = 0
= (A X (k) − b)T ∇f (X (k) ) − λk ∇f (X (k) )T A ∇f (X (k) ) = 0
dTk gk
Cours complet est disponible sur mon site web : http://sites.univ-biskra.dz/kenouche/
Exercice º + r
Illustrons la méthode de gradient à pas optimal pour la fonction-objectif de deux variables suivante :
ϕ(X + λk ∇f (X)) = 4 (x + λk d1 )2 + 4 (y + λk d2 )2 − 2 (x + λk d1 ) (y + λk d2 ) − 6 (x + λk d1 + y + λk d2 )
calculons la dérivée :
0
ϕ (λk ) = 0
0
ϕ (λk ) = 8 (x + λk d1 ) d1 + 8 (y + λk d2 ) d2 − 2 (x + λk d1 ) d2 − 2 (y + λk d2 ) d1 − 6 (d1 + d2 ) = 0
6 (d1 + d2 ) + 2 (x d2 + y d1 ) − 8 (x d1 + y d2 )
=⇒ λk =
8 (d21 + d22 ) − 4 d1 d2
Il en résulte le schéma numérique de l’algorithme de descente de gradient à pas optimal :
6 (d1 + d2 ) + 2 (x d2 + y d1 ) − 8 (x d1 + y d2 )
(x(k+1) , y (k+1) ) = (x(k) , y (k) )− (8 x(k) − 2 y (k) − 6, −2 x(k) + 8 y (k) − 6)
8 (d21 + d22 ) − 4 d1 d2 | {z } | {z }
d1 d2
Cours complet est disponible sur mon site web : http://sites.univ-biskra.dz/kenouche/
Script Matlabr :
clc␣;␣clear␣all␣;␣close␣all␣;
%␣Le␣08/08/2019␣-␣Samir␣KENOUCHE
%␣METHODE␣DE␣GRADIENT␣A␣PAS␣OPTIMAL
␣fxy␣=␣@(x,y)␣4*(x.ˆ2␣+␣y.ˆ2)␣-␣2*x*y␣-␣6*(x+y)␣;␣␣itmax␣=␣5␣;␣it␣=␣0␣;
␣dfx␣=␣@(x,y)␣8*x␣-␣2*y␣-␣6␣;␣dfy␣=␣@(x,y)␣-2*x␣+␣8*y␣-␣6␣;
while␣it␣<␣itmax
␣␣␣xinit␣=␣[.3␣.4]␣;
␣␣␣df␣=␣-␣[dfx(xinit(1),xinit(2))␣dfy(xinit(1),xinit(2))]␣;
␣␣␣lambdak␣=␣(6*(df(1)␣+␣df(2))␣+␣2*(xinit(1)*df(2)␣+␣xinit(2)*df(1))␣-␣...
␣␣␣␣␣␣␣␣␣8*(xinit(1)*df(1)+␣xinit(2)*df(2)))/(8*(df(1).ˆ2␣+␣df(2).ˆ2)␣-␣...
␣␣␣␣␣␣␣␣␣4*df(1)*df(2))␣;␣␣␣␣␣␣%␣PAS␣OPTIMAL␣EXACTE
␣␣␣xk␣=␣xinit␣+␣lambdak*df␣␣␣␣␣%␣NOUVEL␣ITERE
␣␣␣xinit␣=␣xk␣;␣it␣=␣it␣+␣1␣;␣␣%␣MISE␣A␣JOUR
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%␣AFFICHAGE␣GRAPHIQUE␣%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
x␣=␣-10:0.3:␣8␣;␣y␣=␣-10:0.3:8␣;␣[xgrid,␣ygrid]␣=␣meshgrid(x,y)␣;
zgrid␣=␣fxy(xgrid,ygrid)␣;␣figure(’color’,[1␣1␣1])␣;
contourf(xgrid,ygrid,zgrid)␣;␣xlabel(’x’)␣;␣ylabel(’y’)␣;␣hold␣on␣;
plot(xk(1),xk(2),’rx’)␣;␣plot(xk(1),xk(2),’ro’)␣;
Exercice » + r
Nous appliquerons cette méthode pour chercher le minimum de la fonction :
1 2 7 2
f (x, y) =
x + y
2 2 (54)
Avec x = (7.5, 2.2)
0
Avec un raisonnement analogue que précédemment, nous obtenons l’expression analytique du pas optimal
−(x(k) d1 + 7 y (k) d2 )
λk = (55)
d21 + 7 d22
clear␣all␣;␣close␣all␣;␣clc␣;
%␣Le␣09/08/2019␣-␣Samir␣KENOUCHE
%␣GRADIENT␣A␣PAS␣OPTIMAL
fxy␣=␣@(x,y)␣x.ˆ2*(1/2)␣+␣y.ˆ2*(7/2)␣;␣dfx␣=␣@(x)␣x␣;␣dfy␣=␣@(y)␣7.*y␣;
it␣=␣0␣;␣itmax␣=␣40␣;␣echelle␣=␣0.6␣;␣␣tol␣=␣␣1e-6␣;␣xinit␣=␣[7.5␣2.2]␣;
x␣=␣-2:0.2:␣8␣;␣y␣=␣-6:0.2:6␣;␣[xgrid,␣ygrid]␣=␣meshgrid(x,y)␣;
zgrid␣=␣␣fxy(xgrid,␣ygrid)␣;␣figure(’color’,[1␣1␣1])␣;
contourf(xgrid,ygrid,zgrid)␣;␣hold␣on␣;␣xlabel(’x’)␣;␣ylabel(’y’)␣;
␣while␣it␣<␣itmax
␣␣␣dk␣=␣␣-␣[dfx(xinit(1))␣dfy(xinit(2))]␣;
␣␣␣lambdak␣=␣-(xinit(1)*dk(1)␣+␣7*xinit(2)*dk(2))/(dk(1).ˆ2␣+␣7*dk(2).ˆ2)␣;
␣␣␣xk␣=␣xinit␣+␣lambdak*dk␣;
␣␣%%%%%%%%%%%%%%%%%%%%%%%%%%%%%␣TEST␣D’ARRET␣%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
␣␣␣␣␣␣if␣norm(lambdak*dk)␣<=␣tol
␣␣␣␣␣␣␣␣␣solution␣=␣xk␣;␣␣␣␣␣␣␣␣␣␣␣%␣SOLUTION␣OBTENUE
␣␣␣␣␣␣␣␣␣nbre_it␣=␣it␣;␣␣␣␣␣␣␣␣␣␣␣␣%␣NOMBRE␣D’ITERATION␣PERMETTANT␣LA␣CV
␣␣plot(xk(1),␣xk(2),’xw’,’MarkerSize’,7)␣;␣hold␣on␣;
␣␣plot(xk(1),␣xk(2),’ow’,’MarkerSize’,7)␣;␣hold␣on␣;
␣␣quiver(xk(1),␣xk(2),␣-dfx(xk(1)),-␣dfy(xk(2)),...
␣␣␣␣␣␣echelle,’Color’,␣’r’,␣’LineWidth’,1)␣;
␣␣xinit␣=␣xk␣;␣␣it␣=␣it␣+␣1␣;␣␣␣␣␣␣%␣MISE␣A␣JOUR
␣end
␣f_min␣=␣fxy(solution(1),solution(2))␣;␣%␣MIN␣DE␣LA␣FONCTION-OBJECTIF
0
y
Cours complet est disponible sur mon site web : http://sites.univ-biskra.dz/kenouche/
−2
−4
−6
−2 −1 0 1 2 3 4 5 6 7 8
x
→
−
Dans le direction dk , à l’itération x(k+1) l’algorithme calcule le minimum de ∇f (x(k+1) ), soit
Définition: Soit une matrice A ∈ Rn×n définie positive. Deux directions dk+1 et dk de Rn sont conjuguées
par rapport à la matrice A si
dTk+1 A dk = 0 ∀k (59)
En outre, si A = I (matrice identité), les directions conjuguées dk+1 et dk sont orthogonales. Nous cherchons
ainsi dk+1 dans le plan formé par les directions orthogonales dk et gk+1 soit :
(−gk+1 + βk dk )T A dk = 0 ⇒ −gk+1
T
A dk + βk dTk A dk = 0
T
gk+1 A dk
⇒ βk = T
(61)
dk A dk
L’expression du pas optimal a déjà été déterminée précédemment (48) :
∇f (X (k) )T ∇f (X (k) )
λk = (62)
∇f (X (k) )T A ∇f (X (k) )
Cours complet est disponible sur mon site web : http://sites.univ-biskra.dz/kenouche/
dTk dk
2. Pas optimal λk =
dTk A dk
3. Nouvelle itération X (k+1) ←− X (k) + λk dk
g T A dk
4. Calcul du scalaire βk = k+1
dTk A dk
5. Direction conjuguée dk+1 = −gk+1 + βk dk
6. Mise à jour : k ←− k + 1
7. Fin
Soulignons qu’il existe plusieurs méthodes pour calculer le paramètre βk . Dans l’équation (61), nous avons
utilisé la méthode de Fletcher-Reeves. Nous citerons également les méthodes de Polack-Ribière et de Hestenes-
Stiefel.
Exercice ¼ + r
Illustrons la méthode de gradient conjugué pour la fonction-objectif de deux variables suivante :
y2
f (X) = 5 x2 + − 3 (x + y) avec X = (x, y)T (63)
2
Chapitre2 Algorithmes d’optimisation 28
M. Samir KENOUCHE
Prendre comme vecteur initial X (0) = [−2, 1]T et une tolérance = 10−4 . Le critère d’arrêt est :
clc␣;␣clear␣all␣;␣close␣all␣;
%␣Le␣10/08/2019␣-␣Samir␣KENOUCHE
%␣METHODE␣DU␣GRADIENT␣CONJUGUE
␣fxy␣=␣@(x,y)␣5*x.ˆ2␣+␣y.ˆ2*(1/2)␣-␣3*(x+y)␣;␣␣itmax␣=␣15␣;␣it␣=␣0;
␣dfx␣=␣@(x)␣10*x␣-␣3␣;␣dfy␣=␣@(y)␣y␣-␣3␣;␣tol␣=␣1e-04␣;
␣A␣=␣[10␣0␣;␣0␣1]␣;␣␣b␣=␣[3␣;␣3]␣;␣xinit␣=␣[-2␣;␣1]␣;
␣␣␣dkinit␣=␣␣-␣[dfx(xinit(1))␣;␣dfy(xinit(2))]␣;␣xtest␣=␣zeros(2,itmax);
while␣it␣<␣itmax
␣␣␣lambdak␣=␣(dkinit’*dkinit)/(dkinit’*A*dkinit)␣;
␣␣␣xmin␣=␣xinit␣+␣lambdak*dkinit␣;
␣␣␣if␣abs((fxy(xmin(1),␣xmin(2))␣-␣fxy(xinit(1),...
␣␣␣␣␣␣␣␣␣␣␣xinit(2)))/fxy(xinit(1),␣xinit(2)))␣<␣tol␣;
␣␣␣␣␣␣␣␣␣solution␣=␣xmin␣␣␣;␣%␣VECTEUR␣SOLUTION
Cours complet est disponible sur mon site web : http://sites.univ-biskra.dz/kenouche/
␣␣␣␣␣␣␣␣␣nbr_it␣=␣it␣;␣␣␣␣␣␣␣%␣NOMBRE␣D’ITERATION␣PERMETTANT␣LA␣CV
␣␣␣␣␣␣␣break
␣␣␣end
␣␣␣betak␣=␣([dfx(xmin(1))␣;␣dfy(xmin(2))]’*A*dkinit)/(dkinit’*A*dkinit)␣␣;
␣␣␣dk␣=␣␣-␣[dfx(xmin(1))␣;␣dfy(xmin(2))]␣+␣betak*dkinit
␣␣␣xinit␣=␣xmin␣;␣dkinit␣=␣dk␣;␣it␣=␣it␣+␣1␣;␣%␣MISE␣A␣JOUR
end
f_min␣=␣fxy(solution(1),solution(2))␣;␣%␣MIN␣DE␣LA␣FONCTION-OBJECTIF
%%%%%%%%%%%%%%%%%%%%%%%%%%␣AFFICHAGE␣GRAPHIQUE␣%%%%%%%%%%%%%%%%%%%%%%%%%%%%
x␣=␣-20:0.3:␣18␣;␣y␣=␣-20:0.3:18␣;␣[xgrid,␣ygrid]␣=␣meshgrid(x,y)␣;
zgrid␣=␣fxy(xgrid,ygrid)␣;␣figure(’color’,[1␣1␣1])␣;
contourf(xgrid,ygrid,zgrid)␣;␣␣xlabel(’x’)␣;␣ylabel(’y’)␣;␣hold␣on␣;
plot(solution(1),solution(2),’rx’)␣;␣plot(solution(1),solution(2),’ro’)␣;
%␣VERIFICATION␣:␣A␣*␣solution␣-␣b␣=␣0␣Avec␣XMIN␣=␣(0.30␣;␣3.0)
%␣ATTENTION␣AUX␣ERREURS␣D’ARRONDI
La méthode de gradient conjugué appliquée à une fonction-objectif d’ordre n converge au plus en n itérations.
Notons toutefois que les erreurs d’arrondi dans le calcul des directions conjuguées font que nous n’obtenons
pas toujours la solution exacte en n itérations. Cette méthode réclame un nombre d’itérations proportionnel
Avant de décrire les différents mécanismes du fonctionnement de ces algorithmes, nous donnerons, chemin
faisant, quelques définitions élémentaires. Un individu I (ou chromosome) est codé sous forme d’une chaine
binaire constituée de m gènes, I = {g1 , g2 , g3 , · · · , gm } tel que ∀i ∈ [1, m], gi ∈ V = {0, 1}. Important ! il existe
également le codage réel tel que gi ∈ R. Toutefois, dans cette section nous nous focaliserons exclusivement sur
le codage binaire. Pour une population constituée de n individus P = {I1 , I2 , I3 , · · · , In } et chaque individu
est codé en m gènes, nous obtenons :
I1 = g11 , g21 , g31 , · · · , gm
1
2 2 2 2
I2 = g1 , g2 , g3 , · · · , gm
P= I3 = g13 , g23 , g33 , · · · , gm
3
(64)
..
.
In = (g1n , g2n , g3n , · · · , gm
n
}
Chaque individu Ii (appelé aussi chromosome ou encore génome) de la population P est formé de m gènes,
Cours complet est disponible sur mon site web : http://sites.univ-biskra.dz/kenouche/
choisis de manière totalement aléatoire. Dans le cas du codage binaire, la fonction fitness (ou efficacité) f ∈ Rn+ .
Cette fonction sert à classer les individus en fonction de leur performance. Elle peut être vue également comme
une mesure d’adaptation des individus à leur environnement. En pratique, on utilise une fonction de décodage
δ permettant le passage du système binaire au système décimal, soit :
Plus de détails sur la conversion des systèmes de numération sont donnés en annexe (B). Dans ce qui suit,
nous décrirons succinctement les trois mécanismes de base de la sélection naturelle. Ensuite, nous prendrons
un exemple d’application numérique afin de faciliter la compréhension des différentes notions inhérentes aux
algorithmes génétiques.
4. Les algorithmes génétiques font partie des méthodes dites de recherche globale : cela signifie la possibilité d’atteindre un
optimum, ou du moins un meilleur point, même si ce dernier n’est pas dans le voisinage immédiat de l’itéré précédent. Toutes les
autres méthodes d’optimisation vues précédemment sont dites de recherche locale : Le nouvel itéré est recherché dans le voisinage
immédiat (d’où la notion de localité) de l’itéré précédent.
Ri
Psi = X w i (66)
Rw
i∈P
Il existe une panoplie de processus de sélection. Nous avons pris la méthode la plus intuitive. Autrement
dit, la probabilité de reproduction d’un individu dépend de sa valeur au regard de l’ensemble des valeurs de
la population.
b) Croisement: Nous vérifions d’abord s’il y a croisement (ou reproduction) selon une probabilité
de croisement typiquement Pc ∈ V (0.85, 1). Il existe plusieurs types de croisement, nous considérons ici
le croisement dit arithmétique. Soient une population de deux individus {I1 , I2 } et un nombre aléatoire
α ∈ V (0, 1). S’il y a croisement les rejetons ri = {r1 , r2 , r3 } (enfants) de la nouvelle génération s’obtiennent
selon :
r1 = α I1 + α I2
ri = r = (1 − α) I + α I
2 1 2 (67)
r = α I + (1 − α) I
3 1 2
L’opération de croisement atteint chaque gène de chaque individu, selon le processus ci-dessous.
α g11 + α g12
α g1 + α g2
Cours complet est disponible sur mon site web : http://sites.univ-biskra.dz/kenouche/
2 2
1 2
α g + α g
r1 =
3 3 (68)
..
.
1 2
α gm + α gm
(1 − α) g11 + α g12
(1 − α) g 1 + α g 2
2 2
1 2
(1 − α) g + α g
r2 =
3 3 (69)
..
.
1 2
(1 − α) gm + α gm
α g11 + (1 − α) g12
α g 1 + (1 − α) g 2
2 2
1 2
α g + (1 − α) g
r3 =
3 3 (70)
..
.
1 2
α gm + (1 − α) gm
Les individus de la nouvelle génération {r1 , r2 , r3 } ont hérité en théorie les meilleurs gènes des individus de
la génération précédente.
Avec β est un nombre aléatoire ∈ V (0, 1), gt est la génération courante, gT est la génération maximale et
b est le degré d’extinction.
Exercice ½ + r
En guise d’application numérique, soit à maximiser la fonction-objectif à une seule variable :
x∗ ∈ argmax 17 (x − x2 ) (73)
x∈Rn
x∗ ∈ argmin − 17 (x − x2 ) (74)
x∈Rn
Prendre une probabilité de croisement Pc = 0.75 et une probabilité de mutation Pm = 0.001. La population
initiale est formée de six individus. Ces derniers sont constitués de quatre gènes. Cet exemple simple vise à
Cours complet est disponible sur mon site web : http://sites.univ-biskra.dz/kenouche/
Exercice ¾ + r
Pour des problèmes d’optimisation plus complexes, nous utiliserons la fonction Matlabr prédéfinie ga. En
guise d’application de cette fonction, nous souhaitons optimiser la fonction-objectif précédente (63) dont nous
rappelons la formule :
y2
f (X) = 5 x2 + − 3 (x + y) avec X = (x, y)T
2
La syntaxe de la fonction Matlabr prédéfinie ga est donnée dans le script Matlabr ci-dessous :
clc␣;␣clear␣all␣;
%␣Samir␣KENOUCHE␣-␣Unconstrained␣optomization␣using␣algorithm␣genetic
%␣Le␣14/09/2019
addpath(’C:\Users\kenouche’)␣;
myfitness␣=␣@(x)␣5*x(1).ˆ2␣+␣x(2).ˆ2*(1/2)␣-␣3*(x(1)+x(2))␣;
cineq␣=␣[]␣;␣ceq␣=␣[]␣;␣␣␣%␣unconstrained␣problem
options␣=␣gaoptimset(’CreationFcn’,␣@gacreationlinearfeasible,␣...
␣␣␣␣’PlotFcns’,␣@gaplotbestf,␣’CrossoverFraction’,␣0.75,␣...
␣␣␣␣’InitialPopulation’,xinit,’MutationFcn’,@mutationadaptfeasible,␣...
␣␣␣␣’EliteCount’,␣2,’PopulationSize’,50,␣’TolFun’,␣1e-03,’Display’,’iter’)␣;
[xoptimal,fval,exitflag,output,population,scores]␣=␣ga(myfitness,␣...
␣␣␣␣nbrevars,[],[],[],[],LB,UB,␣cineq,␣ceq,␣options)␣;
disp(output.message)␣;
str␣=␣[’LES␣POINTS␣STATIONNAIRES␣OBTENUS␣:␣’␣num2str(xoptimal)]
%␣LES␣POINTS␣STATIONNAIRES␣OBTENUS␣:␣0.3␣␣3
En conclusion, nous soulignons que les trois processus d’un algorithme génétique sont régit par un certain
nombre de paramètres fixés préalablement. Ces derniers conditionnent la réussite de l’optimisation du problème
étudié. Parmi ces paramètres, nous citerons (1) La taille de la population P, et la taille de la chaine de codage
des individus. Si cette population est trop grande, le temps de calcul de l’algorithme peut se révéler très
contraignant. En revanche, si la taille de la population est petite, l’algorithme convergera vraisemblablement
vers un mauvais individu. (2) Le choix de la valeur de la probabilité de croisement Pc , celle-ci dépend de la
forme de la fonction fitness. En pratique, le choix de cette probabilité se fait de façon heuristique. Plus Pc est
élevée, plus la population subit des transformations profondes. (3) Le choix de la valeur de la probabilité de
mutation Pm . Elle est généralement faible puisqu’une valeur élevée risque de conduire à une solution divergente.
Cours complet est disponible sur mon site web : http://sites.univ-biskra.dz/kenouche/
Une dernière notion inhérente aux algorithmes génétiques est celle de l’élitisme. Cette opération consiste
à conserver le meilleur individu dans la génération ultérieure. Après le croisement, on compare le meilleur
individu de la génération courante avec le meilleur individu de la génération antérieure. A l’issue de cette
comparaison, le meilleur individu est conservé au détriment de l’autre qui est éliminé.
Exercice ¿ + r
1) Minimiser en utilisant l’algorithme génétique la fonction-objectif définie par :
D’abord nous commençons par écrire les contraintes dans un fichier M-file, qu’on appellera ensuite depuis
le script principal.
␣function␣[cineq,␣ceq]␣=␣myconstraint(x)
␣␣␣cineq␣=␣[1.5␣+␣x(1)*x(2)␣+␣x(1)␣-␣x(2)␣;
␣␣␣-x(1)*x(2)␣+␣10]␣;
␣␣␣ceq␣=␣[]␣;
␣return
clc␣;␣clear␣all␣;
%␣Samir␣KENOUCHE␣-␣Constrained␣optomization␣using␣algorithm␣genetic
%␣Le␣15/09/2019
addpath(’C:\Users\kenouche’)␣;
myfitness␣=␣@(x)␣100*(x(1)ˆ2␣-␣x(2))ˆ2␣+␣(1␣-␣x(1))ˆ2␣;
rng(1403,’twister’)␣;␣␣␣%␣Control␣random␣number␣generation
xinit␣=␣randn([1␣2])␣;␣␣%␣initialisation
nbrevars␣=␣2␣;␣␣␣␣␣␣␣␣␣␣%␣Number␣of␣variables
LB␣=␣[0␣0]␣;␣␣␣␣␣␣␣␣␣␣␣␣%␣Lower␣bound
UB␣=␣[1␣13]␣;␣␣␣␣␣␣␣␣␣␣␣%␣Upper␣bound
options␣=␣gaoptimset(’CreationFcn’,␣@gacreationlinearfeasible,␣...
␣␣␣␣’PlotFcns’,␣@gaplotbestf,␣’CrossoverFraction’,␣0.75,␣...
␣␣␣␣’InitialPopulation’,xinit,’MutationFcn’,@mutationadaptfeasible,␣...
␣␣␣␣’EliteCount’,␣1,’PopulationSize’,50,␣’TolFun’,␣1e-03,␣...
␣␣␣␣’Display’,’iter’)␣;
[xopti,fval,exitflag,output,population,scores]␣=␣ga(myfitness,␣nbrevars,␣...
␣␣␣␣[],[],[],[],LB,UB,␣@myconstraint,␣options)␣;
Cours complet est disponible sur mon site web : http://sites.univ-biskra.dz/kenouche/
disp(output.message)
str␣=␣[’Les␣points␣statonnaires␣obtenus␣:␣’␣num2str(xopti)]
%%␣Les␣points␣stationnaires␣obtenus␣:␣0.812202␣␣12.3122
Avec, D est un sous-ensemble de Rn . Les variables X = (x1 , x2 , ..., xn )T sont appelées variables d’optimisation
ou variables de décision. La fonction f , à valeurs réelles, définie par f : D ⊂ Rn → R est la fonction-objectif
ou fonction de coût. Dans cette section, on abordera les fonctions Matlabr prédéfinies, dédiées à la résolution
de problèmes d’optimisation sans contraintes. Toutes ces fonctions sont disponibles dans la boite à outil
Optimization Toolbox du logiciel. Les fonctions Matlabr prédéfinies destinées à la minimisation de fonctions
d’une seule variable sont fminbnd et fminunc. Notons que cette dernière peut également être utilisée pour les
fonctions de plusieurs variables. Ces commandes présentent une syntaxe très similaires.
options␣=␣optimset(’param␣1’,␣value␣1,␣’param␣2’,␣value␣2,␣...)
[x,␣fval,␣exitflag,␣output,␣grad,␣hessian]=␣fminunc(fun,␣x0,␣options)␣%␣pour␣fminunc
[x,␣fval,␣exitflag,␣output]␣=␣fminbnd(fun␣,lB,␣uB,␣options)␣␣␣␣␣␣␣␣␣␣␣%␣pour␣fminbnd
La différence entre les fonctions fminunc et fminbnd se situe au niveau de l’initialisation de la recherche de
la solution. En effet, fminunc démarre la recherche à partir d’une valeur initiale apportée par x0. En revanche,
fminbnd effectue sa recherche à partir d’un intervalle dont les bornes inférieure et supérieure sont indiquées
respectivement par les entrées lB et uB.
Exercice ¶ + r
1) Minimiser la fonction-objectif définie par :
2
f (x) = (x − 1) × exp(−x + 2 x + 1)
(76)
x ∈ [−4, 4]
Script Matlabr
clear␣all;␣clc␣;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
lB␣=␣-4␣;␣uB␣=␣4␣;␣xinit␣=␣1␣;
fx␣=␣@(x)␣(x-1).*exp(-x.ˆ2␣+␣2.*x␣+␣1)␣;
opts␣=␣optimset(’Display’,’iter’,’FunValCheck’,’on’,’TolX’,1e-8)␣;
%␣parametres␣d’optimisation
[xMin1,␣funEval1,␣exitTest1,␣output1,␣grad1,␣hessian1]␣=␣fminunc(fx,␣xinit,␣opts)␣;
%␣premiere␣possibilite
[xMin2,␣funEval2,␣exitTest2,␣output2]␣=␣fminbnd(fx,␣lB,␣uB,␣opts)␣;
%␣Deuxieme␣posibilite
%%%%%%%%%%%%%%%%%%%␣AFFICHAGE␣PAR␣DEFAUT␣1ER␣CAS␣%%%%%%%%%%%%%%%%%%%
␣Iteration␣␣Func-count␣␣␣␣␣␣␣f(x)
␣␣␣␣␣0␣␣␣␣␣␣␣␣␣␣␣2␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣0
␣␣␣␣␣1␣␣␣␣␣␣␣␣␣␣␣4␣␣␣␣␣␣␣␣␣-2.71828
␣␣␣␣␣2␣␣␣␣␣␣␣␣␣␣␣6␣␣␣␣␣␣␣␣␣-3.16544
␣␣␣␣␣3␣␣␣␣␣␣␣␣␣␣␣8␣␣␣␣␣␣␣␣␣-3.16849
Optimization␣terminated:
␣the␣current␣x␣satisfies␣the␣termination␣criteria␣using␣OPTIONS.TolX␣of␣1.000000e-08
>>␣xMin1␣=
␣␣␣␣␣␣␣␣␣␣␣␣␣0.2929
␣␣␣␣␣␣␣␣␣␣␣␣␣␣%␣MINIMUM␣OBTENU
>>␣funEval1␣=
␣␣␣␣␣␣␣␣␣␣␣␣␣-3.1690
␣␣␣␣␣␣␣␣␣␣␣␣␣␣%␣VALEUR␣DE␣LA␣FONCTION␣A␣LA␣DERNIERE␣ITERATION
>>␣exitTest1␣=
␣␣␣␣␣␣␣␣␣␣␣␣␣␣1
␣␣␣␣␣␣␣␣␣␣␣␣␣␣%␣TEST␣DE␣CONVERGENCE␣POSITIF
>>␣grad1␣=
␣␣␣␣␣␣␣␣␣␣-5.9605e-08
␣␣␣␣␣␣␣␣␣␣␣␣␣␣%␣VALEUR␣DU␣GRADIENT␣DE␣LA␣FONCTION-OBJECTIF
>>␣hessian1␣=
␣␣␣␣␣␣␣␣␣␣␣␣␣␣12.6783
␣␣␣␣␣␣␣␣␣␣␣␣␣␣%␣VALEUR␣DU␣HESSIEN␣DE␣LA␣FONCTION-OBJECTIF
>>␣xMin2␣=
␣␣␣␣␣␣␣␣␣␣␣␣␣␣0.2929
>>␣funEval2␣=
␣␣␣␣␣␣␣␣␣␣␣␣␣-3.1690
>>␣exitTest2␣=
␣␣␣␣␣␣␣␣␣␣␣␣␣␣1
L’argument opts, de type srtucture, compte les options d’optimisation spécifiées dans optimset. Le champ
de la structure opts indiqué par optimset(’Display’,’iter’, ...) affiche des détails pour chaque itération.
Si l’on désire afficher uniquement les détails de la dernière itération, on remplacera ’iter’ par ’final’. Dans
le cas où on ne veut afficher aucun détails, on mettra la valeur ’off’. Le champ indiqué par optimset(....,
’FunValCheck’,’on’,...) contrôle si les valeurs de la fonction sont réelles et affiche dans le cas contraire un
avertissement quand la fonction en question renvoie une valeur complexe ou NaN. On peut suspendre cette
vérification, en remplaçant la valeur ’on’ par ’off’. Le champ d’optimisation optimset(...., ’TolX’,
1e-08) correspond à la tolérance admise pour la solution approchée. D’autres champs d’optimisation existent
comme MaxFunEvals qui fixe le nombre maximum d’évaluation de la fonction à optimiser et MaxIter fixant
également le nombre maximum d’itération. Voir aussi GradObj, OutputFcn, PlotFcns, ... etc dont la description
est disponible dans le help de Matlabr .
La sortie xMin1 = 0.2929 est le minimum trouvé. Ce dernier est cherché autour de la valeur initiale xinit.
La sortie funEval1 = -3.1690 exprime l’évaluation de la fonction à la dernière itération, c’est-à-dire pour
fx(x = xMin1). L’argument exitTest = 1 signifie que l’algorithme a convergé vers la solution, une valeur
négative indiquerai le contraire. L’argument de sortie output1, de type structure, renvoie les champs suivants :
>>␣output1␣=␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣%␣pour␣la␣commande␣fminunc
Cours complet est disponible sur mon site web : http://sites.univ-biskra.dz/kenouche/
␣␣␣␣␣␣␣␣␣␣␣␣iterations:␣6
␣␣␣␣␣␣␣␣␣␣␣␣␣funcCount:␣14
␣␣␣␣␣␣␣␣␣␣␣␣␣␣stepsize:␣1
␣␣␣␣␣␣␣␣␣firstorderopt:␣5.9605e-08
␣␣␣␣␣␣␣␣␣␣␣␣␣algorithm:␣[1x38␣char]␣␣%␣’Quasi-Newton␣line␣search’
␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣message:␣[1x85␣char]␣␣%␣␣Optimization␣terminated␣...
>>␣output2␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣%␣␣pour␣la␣commande␣fminbnd
␣␣␣␣␣␣␣␣␣␣␣␣iterations:␣14
␣␣␣␣␣␣␣␣␣␣␣␣␣funcCount:␣15
␣␣␣␣␣␣␣␣␣␣␣␣␣algorithm:␣[1x46␣char]␣␣%␣’golden␣section␣search’
␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣message:␣[1x111␣char]␣%␣Optimization␣terminated␣...
La fonction a été évaluée 14 fois et l’algorithme converge vers la solution approchée au bout de la 6ième
itération. La sortie stepsize: 1 indique le pas final de l’algorithme moyenne dimension de Quasi-Newton. Le
mot Optimization affiché comme message, fait référence au faite que l’algorithme de minimisation fonctionne
selon le critère des moindres carrés. fminbnd présente les mêmes propriétés que celles de fminunc, à la différence
que fminbnd cherche le minimum dans un intervalle, donné en argument d’entrée avec la borne inférieure lB
(lower Bound) et la borne supérieure uB (upper Bound).
Nous allons désormais tester la fonction fminsearch qui s’utilise pour la minimisation de fonctions multi-
dimensionnelles. Sa syntaxe usuelle est analogue à celle de fminunc, à la différence près que fminsearch ne
renvoie ni le Jacobien ni le Hessien de la fonction à optimiser. Ceci provient du fait que cette fonction est
Exercice · + r
1) Minimiser la fonction-objectif de deux variables définie par :
∂ 2 f (X̂) ∂ 2 f (X̂)
∂x21 ∂x1 ∂x2 2 0
2 2 =⇒ =4>0 (79)
∂ f (X̂) ∂ f (X̂) 0 2
∂x2 ∂x1 ∂x22
À partir de ces résultats, il en découle que le point X̂ = (x̂1 = 0 ; x̂2 = 2) est le minimum recherché. Nous
résoudrons le même système de façon algorithmique en se servant de la fonction fminsearch. Voici le script
Matlabr
Cours complet est disponible sur mon site web : http://sites.univ-biskra.dz/kenouche/
clear␣all;␣clc␣;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
xinit␣=␣[1␣1]␣;␣fun␣=␣@(x)␣x(1).ˆ2␣+␣(x(2)␣-␣2).ˆ2;
opts␣=␣optimset(’Display’,’iter’,’FunValCheck’,’on’,’TolX’,1e-8)␣;
[xMin,␣funEval,␣exitTest,␣output]␣=␣fminsearch(fun,␣␣xinit,␣opts)␣;
%%%%%%%%%%%%%%%%%%%%%%%%%%%␣SORTIE␣PAR␣DEFAUT␣%%%%%%%%%%%%%%%%%%%%%%%%
␣Iteration␣␣␣Func-count␣␣␣␣␣Min␣f(x)
␣␣␣␣␣0␣␣␣␣␣␣␣␣␣␣␣␣1␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣2
␣␣␣␣␣1␣␣␣␣␣␣␣␣␣␣␣␣3␣␣␣␣␣␣␣␣␣␣␣1.9025
␣␣␣␣␣2␣␣␣␣␣␣␣␣␣␣␣␣5␣␣␣␣␣␣␣␣␣␣1.66563
␣␣␣␣␣3␣␣␣␣␣␣␣␣␣␣␣␣7␣␣␣␣␣␣␣␣␣␣1.38266
␣␣␣␣␣4␣␣␣␣␣␣␣␣␣␣␣␣9␣␣␣␣␣␣␣␣␣0.889414
␣␣␣␣␣5␣␣␣␣␣␣␣␣␣␣␣11␣␣␣␣␣␣␣␣␣0.353447
␣␣␣␣␣6␣␣␣␣␣␣␣␣␣␣␣13␣␣␣␣␣␣␣␣0.0265259
␣␣␣␣␣7␣␣␣␣␣␣␣␣␣␣␣14␣␣␣␣␣␣␣␣0.0265259
␣␣␣␣␣8␣␣␣␣␣␣␣␣␣␣␣16␣␣␣␣␣␣␣␣0.0265259
␣␣␣␣␣9␣␣␣␣␣␣␣␣␣␣␣18␣␣␣␣␣␣␣␣0.0265259
␣␣␣␣␣63␣␣␣␣␣␣␣␣␣␣125␣␣␣␣␣␣2.15781e-17
␣␣␣␣␣64␣␣␣␣␣␣␣␣␣␣127␣␣␣␣␣␣2.15781e-17
Optimization␣terminated:
␣the␣current␣x␣satisfies␣the␣termination␣criteria␣using␣OPTIONS.TolX␣of␣1.000000e-08␣and␣F(
X)␣satisfies␣the␣convergence␣criteria␣using␣OPTIONS.TolFun␣of␣1.000000e-04
>>␣xMin␣=
␣␣␣␣␣␣␣␣␣␣␣␣␣␣0.0000␣␣␣␣2.0000
>>␣funEval␣=
␣␣␣␣␣␣␣␣␣␣␣␣␣␣2.1578e-17
>>␣exitTest␣=
␣␣␣␣␣␣␣␣␣␣␣␣␣␣1
>>␣output
␣␣␣␣␣␣␣␣iterations:␣64
␣␣␣␣␣␣␣␣␣funcCount:␣127
Cours complet est disponible sur mon site web : http://sites.univ-biskra.dz/kenouche/
␣␣␣␣␣␣␣␣␣algorithm:␣[1x33␣char]␣%␣’Nelder-Mead␣simplex␣direct␣search’
␣␣␣␣␣␣␣␣␣␣␣message:␣[1x194␣char]␣%␣Optimization␣terminated:␣the␣current␣x␣satisfies␣the␣
termination
L’algorithme converge vers la solution approchée Xmin au bout de 64 itérations. Notons que cette convergence
est atteinte car les conditions d’arrêt de l’algorithme sont satisfaites, soit une tolérance TolX = 1e-8. En
choisissant par exemple une tolérance de TolX = 1e-3, l’algorithme converge vers la solution approchée (xMin
= [-0.0002 ; 2.0004]) au bout de 28 itérations seulement. Dans le cas où cette dernière n’est pas spécifiée,
la valeur par défaut est TolX = 1e-6. On comprend alors que le choix de la tolérance est conditionné par la
précision recherchée. Il est important de rappeler aussi que tous ces algorithmes d’optimisation sont basés sur
des processus itératifs, donc fortement dépendant du choix de la valeur initiale. Autrement dit, plus la valeur
initiale est proche de la solution approchée plus l’algorithme converge rapidement.
Comme il a été mentionné dans la section précédente, la fonction fminunc s’utilise aussi pour l’optimisation
de fonctions à plusieurs variables. Nous allons l’utiliser pour optimiser la fonction f (x1 , x2 ) = 2 x21 + x1 x2 +
2 x22 − 6 x1 − 5 x2 + 3
Script Matlabr
clear␣all;␣clc␣;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
xinit␣=␣[-1␣1]␣;
fx␣=␣@(x)␣2*x(1).ˆ2␣+␣x(1)*x(2)␣+␣2*x(2).ˆ2␣-␣6*x(1)␣-␣5*x(2)␣+␣3␣;
function␣[fun,␣Jacobien,␣Hessien]␣=␣myfun(x)
fun␣=␣2*x(1).ˆ2␣+␣x(1)*x(2)␣+␣2*x(2).ˆ2␣-␣6*x(1)␣-␣5*x(2)␣+␣3␣;
%␣Compute␣the␣objective␣function␣value␣at␣x
if␣nargout␣>␣1
%␣fun␣called␣with␣two␣output␣arguments
grad(1)␣=␣4*x(1)␣+␣x(2)␣-␣6␣;␣%␣Gradient␣of␣the␣function␣evaluated␣at␣x
grad(2)␣=␣x(1)␣+␣4*x(2)␣-␣5␣;
Jacobien␣=␣grad␣;
end
if␣nargout␣>␣2
Cours complet est disponible sur mon site web : http://sites.univ-biskra.dz/kenouche/
hessian(1,1)␣=␣4␣;␣␣hessian(2,1)␣=␣1␣;␣%␣Hessian␣evaluated␣at␣x
hessian(2,1)␣=␣1␣;␣␣hessian(2,2)␣=␣4␣;
Hessien␣=␣hessian␣;
end
return
Cette fonction est sauvegardée sous le nom myfun.m. L’appel de cette dernière se fait avec le script suivant :
clear␣all;␣clc␣;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
xinit␣=␣[1␣1]␣;
opts␣=␣optimset(’GradObj’,’on’,’Hessian’,’on’,’Display’,’iter’)␣;
[x,␣fval,␣exitflag,␣output]␣=␣fminunc(@myfun,␣xinit,␣opts)
l’instar de DiffMaxChange, DiffMinChange, FinDiffRelStep, ... etc. Consulter le help de Matlabr pour de
Exercice ¸ + s
– Justifier de l’existence d’un extremum des fonctions-objectif suivantes :
– Trouver les extremums des fonctions ci-dessus, analytiquement, ensuite en se servant de la fonction
prédéfinie fminsearch
La fonction linprog (Linear programming) solutionne un processus d’optimisation, écrit sous une formu-
lation linéaire minimisant la quantité :
A×x≤B
min f T x tel que Aeq × x = Beq (83)
X∈Rn lB ≤ x ≤ uB
linprog s’utilise avec deux types d’algorithmes Large-échelle (Large-Scale Optimization) et Moyenne-échelle
(Medium-Scale Optimization). Le premier type est utilisé pour des systèmes complexes en terme de taille et
sous certaines conditions qu’on ne va pas détailler ici. On se contentera d’utiliser le deuxième type et plus
précisément la méthode Simplex. La syntaxe usuelle de linprog est :
[x,␣fval,␣exitflag,␣output,␣lambda]␣=␣linprog(f,␣A,␣B,␣Aeq,␣Beq,␣lB␣,␣uB,␣x0,␣options)
Exercice ¹ + r
1) Minimiser la fonction-objectif définie par :
f (x) = −5 x1 − 4 x2 − 6 x3
x1 − x2 + x3 ≤ 20
3 x + 2 x + 4 x ≤ 42
1 2 3
X̂ = argmin f (X) tel que
X∈R3
3 x1 + 2 x 2 ≤ 30
0≤x ,0≤x ,0≤x
1 2 3
f (x) = 14 x1 + 6 x2
x1 + x2 ≤ 7.50
11 x + 3 x ≤ 0.40
1 2
X̂ = argmin f (X) tel que
X∈R2
12 x1 + 21 x2 ≤ 1.50
x ≥ 0, x ≥ 0
1 2
clear␣all␣;␣clc␣;
opts␣=␣optimset(’LargeScale’,␣’off’,’Simplex’,␣’on’)␣;
options␣=␣optimset(opts,␣’Display’,␣’iter’,␣’TolFun’,␣1e-5)␣;
f␣=␣[-5␣;␣-4␣;␣-6]␣;␣A␣=␣[1␣-1␣1␣;␣3␣2␣4␣;␣3␣2␣0]␣;
B␣=␣[20;␣42;␣30]␣;␣lB␣=␣[0␣;␣0␣;␣0]␣;␣uB␣=␣[inf␣;␣inf␣;␣inf]␣;
[x,␣fval,␣exitflag,␣output,lambda]␣=␣linprog(f,␣A,␣B,␣[],␣...
[],lB,␣uB,␣[],␣options)␣;
point_critique␣=␣sprintf(’%6.4f␣\n’,␣x)
Le champ d’optimisation opts = optimset(’LargeScale’, ’off’ ...) signifie qu’on utilisera l’algorithme
Moyenne-échelle pour résoudre ce problème. Le critère d’arrêt est considéré pour la fonction à travers options
= optimset(... ’TolFun’, 1e-5), autrement dit l’algorithme s’arrête une fois que la condition |f (xk+1 ) −
f (xk )| ≤ 1e − 5 est satisfaite. Ci-dessous, l’affichage généré par le script.
The␣default␣starting␣point␣is␣feasible,␣skipping␣Phase␣1.
Phase␣2:␣Minimize␣using␣simplex.
␣␣␣␣␣␣Iter␣␣␣␣␣␣␣␣␣␣␣␣Objective␣␣␣␣␣␣␣␣␣␣␣␣␣␣Dual␣Infeasibility
>>␣point_critique␣=␣␣␣␣␣␣␣%␣solution
␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣0.0000
␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣15.0000
␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣3.0000
>>␣fval␣=
␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣-78
>>␣exitflag␣=
␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣1
On constate que l’algorithme Simplex converge vers la solution approchée au bout de trois itérations. Ci-
dessous, le script Matlabr relatif à la maximisation.
clear␣all␣;␣clc␣;
opts␣=␣optimset(’LargeScale’,␣’off’,’Simplex’,␣’on’)␣;
options␣=␣optimset(opts,␣’Display’,␣’iter’,␣’TolFun’,␣1e-5)␣;
f␣=␣[-14␣;␣-6]␣;␣A␣=␣[1␣1␣;␣11␣3␣;␣12␣21]␣;
B␣=␣[7.50␣;␣0.40␣;␣1.50]␣;␣lB␣=␣[0␣;␣0]␣;␣uB␣=␣[inf␣;␣inf]␣;
Cours complet est disponible sur mon site web : http://sites.univ-biskra.dz/kenouche/
[x,␣fval,␣exitflag,␣output,lambda]␣=␣linprog(f,␣A,␣B,␣[],␣...
[],lB,␣uB,␣[],␣options)␣;
point_critique␣=␣sprintf(’%6.4f␣\n’,␣x)
The␣default␣starting␣point␣is␣feasible,␣skipping␣Phase␣1.
Phase␣2:␣Minimize␣using␣simplex.
␣␣␣␣␣␣Iter␣␣␣␣␣␣␣␣␣␣␣␣Objective␣␣␣␣␣␣␣␣␣␣␣␣␣␣Dual␣Infeasibility
␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣f’*x␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣A’*y+z-w-f
␣␣␣␣␣␣␣0␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣0␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣15.2315
␣␣␣␣␣␣␣1␣␣␣␣␣␣␣␣␣␣␣␣-0.509091␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣2.18182
␣␣␣␣␣␣␣2␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣-0.64␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣0
Optimization␣terminated.
>>␣point_critique␣=␣␣␣␣␣␣␣%␣point␣critique␣du␣maximum
␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣0.0200
␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣0.0600
>>␣fval␣=
␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣-0.6400
Désormais on se servira de la fonction fmincon. La topologie générale d’un processus d’optimisation avec
contraintes sur les variables, peut s’écrire suivant la notation compacte suivante :
A×x≤B
× x = Beq
Aeq
X̂ ∈ argminf (X) tel que C(x) ≤ x (84)
X∈Rn
Ceq(x) = x
lB ≤ x ≤ uB
Les quantités x, B, Beq, lB, et uB sont des vecteurs. A et Aeq sont des matrices, f (x), C(x) et Ceq(x)
sont des fonctions pouvant êtres également des fonctions non-linéaires. Afin de résoudre des problèmes d’opti-
misation sous contraintes, on se servira de fmincon. Cette fonction sert à optimiser des fonctions-objectifs
multidimensionnelles non-linéaires. Par défaut, l’algorithme d’optimisation est basé sur la méthode SQP
(Sequential Quadratic Programming). La syntaxe usuelle de fmincon s’écrit selon :
[x,␣fval,␣exitflag,␣output,␣lambda,␣grad,␣hessian]␣=␣fmincon(fun,␣x0,␣A,␣B,␣Aeq,␣Beq,␣lB,␣
uB,␣@nonlcon,␣options)
Les contraintes linéaires de type équation et inéquation sont écrites respectivement selon Aeq × x = Beq
et A × x ≤ B. Les contraintes non-linéaires de type équation et inéquation sont données respectivement par
Ceq(x) = x et C(x) ≤ x. La fonction M-file @nonlcon contient les contraintes non-linéaires de type équation et
Cours complet est disponible sur mon site web : http://sites.univ-biskra.dz/kenouche/
inéquation. Les autres arguments en entrée et en sortie ont la même signification que ceux des fonctions vues
précédemment. Il est très important de souligner que si un ou plusieurs arguments ci-dessus sont manquants,
on doit les remplacer par un ensemble vide []. L’ordre d’apparition des arguments en entrée est important,
on doit toujours commencer par les contraintes de type inégalité même si ce type de contrainte est vide. Nous
commencerons dans un premier temps par résoudre un problème d’optimisation sous contraintes linéaires.
Exercice º + r
– On se propose de minimiser la fonction-objectif définie par :
Script Matlabr
clc␣;␣clear␣all␣;
%%%%%%%%%%%%%%%%%%%␣Optimisation␣sous␣contraintes␣%%%%%%%%%%%%%%%%%%%
fun␣=␣@(x)␣2*x(1).ˆ2␣+␣x(1)*x(2)␣+␣2*x(2).ˆ2␣-␣6*x(1)␣-␣6*x(2)␣+␣15␣;
A␣=␣[1␣2␣;␣4␣0␣;␣0␣1]␣;␣B␣=␣[5␣7␣2]␣;
Aeq␣=␣[-2␣2]␣;␣Beq␣=␣-1␣;␣xinit␣=␣[-1␣1/2]␣;
%%%%%%%%%%%%%%%%%%%%%%%␣affichage␣par␣defaut␣%%%%%%%%%%%%%%%%%%%%%%%%
Iter␣F-count␣␣␣␣␣␣␣␣f(x)␣␣␣constraint
␣␣␣␣0␣␣␣␣␣␣3␣␣␣␣␣␣␣␣␣␣␣20␣␣␣␣␣␣␣␣␣␣␣␣4
␣␣␣␣1␣␣␣␣␣␣6␣␣␣␣␣␣␣8.4375␣␣␣␣1.332e-15
␣␣␣␣2␣␣␣␣␣␣9␣␣␣␣␣␣8.05206␣␣␣␣␣␣␣␣␣␣␣␣0
␣␣␣␣3␣␣␣␣␣12␣␣␣␣␣␣␣7.9875␣␣␣␣␣2.22e-16
Optimization␣terminated:␣first-order␣optimality␣measure␣less
␣than␣options.TolFun␣and␣maximum␣constraint␣violation␣is␣less
␣than␣options.TolCon.
No␣active␣inequalities.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
>>␣x␣=␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣%␣coordonnees␣du␣point␣critique
␣␣␣␣␣␣1.4500␣␣␣␣0.9500
Cours complet est disponible sur mon site web : http://sites.univ-biskra.dz/kenouche/
>>␣fval␣=
␣␣␣␣␣␣7.9875
>>␣exitflag␣=
␣␣␣␣␣␣1
>>␣output␣=
␣␣␣␣␣␣␣␣␣iterations:␣3
␣␣␣␣␣␣␣␣␣␣funcCount:␣12
␣␣␣␣␣␣␣lssteplength:␣1
␣␣␣␣␣␣␣␣␣␣␣stepsize:␣0.1607
␣␣␣␣␣␣␣␣␣␣algorithm:␣[1x44␣char]
␣␣␣␣␣␣firstorderopt:␣[1x1␣double]
␣␣␣␣constrviolation:␣[1x1␣double]
␣␣␣␣␣␣␣␣␣␣␣␣message:␣[1x144␣char]
>>␣lambda␣=
␣␣␣␣␣␣␣␣␣lower:␣[2x1␣double]
␣␣␣␣␣␣␣␣␣upper:␣[2x1␣double]
␣␣␣␣␣␣␣␣␣eqlin:␣0.3750
>>␣grad␣=
␣␣␣␣␣␣0.7500
␣␣␣␣␣-0.7500
>>␣hessian␣=
␣␣␣␣␣␣2.6500␣␣␣␣2.3500
␣␣␣␣␣␣2.3500␣␣␣␣2.6500
Nous résolvons dans l’exercice ci-dessous, un problème d’optimisation avec contraintes non-linéaires.
Exercice » + r
– On se propose de minimiser le fonction-objectif définie par :
On commence d’abord par écrire le fichier M-file correspondant aux contraintes non-linéaires. Ce fichier
bien entendu est sauvegardé sous le nom mycontr.m. Voici le script :
Cours complet est disponible sur mon site web : http://sites.univ-biskra.dz/kenouche/
function␣[C,␣Ceq]␣=␣mycontr(x)
%␣fonction␣definissant␣les␣contraintes␣non␣lineaires
C␣=␣[2␣+␣x(1)*x(2)␣-␣x(1)␣-␣x(2)␣;␣-x(1)*x(2)␣-␣10]␣;␣%␣inequation
Ceq␣=␣[]␣;␣%␣pas␣de␣contraintes␣non␣lineaires␣en␣equation
return
clc␣;␣clear␣all␣;
fun␣=␣@(x)␣exp(x(1))*(4*x(1)ˆ2␣+␣2*x(2)ˆ2␣+␣4*x(1)*x(2)␣+␣2*x(2)␣+␣1)
xinit␣=␣[-1␣1]␣;
options␣=␣optimset(’LevenbergMarquardt’,’on’,’Display’,’iter’,␣...
␣␣␣␣’TolX’,␣1e-4)␣;
[x,␣fval,␣exitflag,␣output,␣lambda,␣grad,␣hessian]␣=␣fmincon(fun,␣...
␣␣␣␣xinit,␣[],␣[],␣[],␣[],␣[],␣[],␣@mycontr,␣options)
%%%%%%%%%%%%%%%%%%%%%%%␣affichage␣par␣defaut␣%%%%%%%%%%%%%%%%%%%%%%%%
Iter␣F-count␣␣␣␣␣␣␣␣f(x)␣␣␣constraint
␣␣␣␣0␣␣␣␣␣␣3␣␣␣␣␣␣␣1.8394␣␣␣␣␣␣␣␣␣␣␣␣1
␣␣␣␣1␣␣␣␣␣␣6␣␣␣␣␣␣1.98041␣␣␣␣␣␣-0.1839
␣␣␣␣2␣␣␣␣␣␣9␣␣␣␣␣␣1.63636␣␣␣␣␣␣␣0.2596
␣␣␣␣3␣␣␣␣␣12␣␣␣␣␣␣0.34132␣␣␣␣␣␣␣␣4.524
␣␣␣␣4␣␣␣␣␣15␣␣␣␣␣0.530719␣␣␣␣␣␣␣0.3344
␣␣␣␣5␣␣␣␣␣18␣␣␣␣␣0.447582␣␣␣␣␣-0.08164
␣␣␣␣6␣␣␣␣␣21␣␣␣␣␣0.123147␣␣␣␣␣␣␣␣2.352
␣␣␣␣7␣␣␣␣␣24␣␣␣␣0.0575464␣␣␣␣␣␣␣0.3957
␣␣␣␣8␣␣␣␣␣27␣␣␣␣0.0335016␣␣␣␣␣␣␣0.1153
␣␣␣␣9␣␣␣␣␣30␣␣␣␣0.0331726␣␣␣␣0.0001285
␣␣␣10␣␣␣␣␣33␣␣␣␣␣0.033173␣␣␣␣1.589e-10
Optimization␣terminated:␣first-order␣optimality␣measure␣less
␣than␣options.TolFun␣and␣maximum␣constraint␣violation␣is␣less
␣than␣options.TolCon.
Active␣inequalities␣(to␣within␣options.TolCon␣=␣1e-06):
␣␣lower␣␣␣␣␣␣upper␣␣␣␣␣ineqlin␣␣␣ineqnonlin
␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣1
␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣2
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
>>␣x␣=
␣␣␣␣␣-9.0990␣␣␣␣1.0990
Cours complet est disponible sur mon site web : http://sites.univ-biskra.dz/kenouche/
>>␣fval␣=
␣␣␣␣␣␣0.0332
>>␣exitflag␣=
␣␣␣␣␣␣␣1
>>␣output␣=
␣␣␣␣␣␣␣␣␣iterations:␣10
␣␣␣␣␣␣␣␣␣␣funcCount:␣33
␣␣␣␣␣␣␣lssteplength:␣1
␣␣␣␣␣␣␣␣␣␣␣stepsize:␣[1x1␣double]
␣␣␣␣␣␣␣␣␣␣algorithm:␣[1x44␣char]
␣␣␣␣␣␣firstorderopt:␣[1x1␣double]
␣␣␣␣constrviolation:␣[1x1␣double]
␣␣␣␣␣␣␣␣␣␣␣␣message:␣[1x144␣char]
>>␣lambda␣=
␣␣␣␣␣␣␣␣␣lower:␣[2x1␣double]
␣␣␣␣␣␣␣␣␣upper:␣[2x1␣double]
>>␣grad␣=
␣␣␣␣0.0255
␣␣␣-0.0034
>>␣hessian␣=
␣␣␣␣0.0280␣␣␣␣0.0035
␣␣␣␣0.0035␣␣␣␣0.0096
Exercice ¼ + s
– On se propose de minimiser les fonctions-objectif définies par :
1 1
f (x1 , x2 ) = (x1 − 3)2 + (x2 − 1)2
2
2
x1 + x2 − 1 ≤ 0
x −x −1≤0
1 2
X̂ = argmin f (X) tel que
X∈R2
−x1 + x2 − 1 ≤ 0
−x − x − 1 ≤ 0
1 2
La fonction quadprog (Quadratic programming) solutionne un processus d’optimisation, écrit sous une
formulation quadratique qui minimise la quantité :
Cours complet est disponible sur mon site web : http://sites.univ-biskra.dz/kenouche/
1 T A×x≤B
minn f (X) = x H x + f T x tel que Aeq × x = Beq (85)
X∈R 2 lB ≤ x ≤ uB
[x,␣fval,␣exitflag,␣output,␣lambda]␣=␣quadprog(H,␣f,␣A,␣B,␣Aeq,␣Beq,␣lb,␣ub,␣x0,␣options)
Exercice ½ + r
– On se propose de minimiser les fonctions-objectif définies par :
f (x1 , x2 ) = x21 + 4 x1 + 5 x2
2 x1 + x2 ≥ 10
3 x + 6x ≤ 80
1 2
X̂ = argmin f (X) tel que
X∈R2
5 x 1 + 7 x 2 ≤ 50
x ,x ≥ 0
1 2
Réécrivons d’abord ce système selon la notation générale décrite par l’Eq. (85).
T T
1 x1 2 0 x1 4 x1
min2 +
X∈R 2 x 0 0 x2 5 x2
2
−2 −1 " # 10
x1
3 6 ≤
80
x2
5 7 50
D’après la définition sur les contraintes d’inégalités, elles doivent être écrites, inférieure ou égale à une
constante. La contrainte 2 x1 + x2 ≥ 10 est réécrite sous la forme −2 x1 − x2 ≤ 10. Voici le script Matlabr ,
pour la fonction à deux variables
clc␣;␣clear␣all␣;
H␣=␣[2␣0␣;␣0␣0]␣;␣f␣=␣[4␣;␣5]␣;
A␣=␣[-2␣-1␣;␣3␣6␣;␣5␣7]␣;␣B␣=␣[10␣;␣80␣;␣50]␣;␣lB␣=␣[0␣;␣0]␣;
Cours complet est disponible sur mon site web : http://sites.univ-biskra.dz/kenouche/
uB␣=␣[inf␣;␣inf]␣;
options␣=␣optimset(’LargeScale’,’off’,’TolX’,␣1e-7)␣;
[x,␣fval,␣exitflag,␣output,␣lambda]␣=␣quadprog(H,␣f,␣A,␣B,␣[],[],␣...
␣␣␣␣lB,␣uB,␣[],␣options)␣;
if␣exitflag␣>␣0
␣␣␣disp(’L’’algorithme␣a␣converge␣vers␣la␣solution␣:’)
␣␣␣point_critique␣=␣x
else
␣␣␣␣disp(’L’’algorithme␣n’’a␣pas␣converge␣!’)
end
Optimization␣terminated.
L’algorithme␣a␣converge␣vers␣la␣solution␣:
point_critique␣=
␣␣␣␣␣0
␣␣␣␣␣0
clc␣;␣clear␣all␣;
H␣=␣[2␣0␣;␣0␣0]␣;␣f␣=␣[4␣;␣5]␣;
A␣=␣[-2␣-1␣;␣3␣6␣;␣5␣7␣;␣-1␣0␣;␣0␣-1]␣;␣B␣=␣[10␣;␣80␣;␣50␣;␣0␣;␣0]␣;
options␣=␣optimset(’LargeScale’,’off’,’TolX’,␣1e-7)␣;
[x,␣fval,␣exitflag,␣output,␣lambda]␣=␣quadprog(H,␣f,␣A,␣B,␣[],[],␣...
␣␣␣␣[],␣[],␣[],␣options)␣;
if␣exitflag␣>␣0
␣␣␣disp(’L’’algorithme␣a␣converge␣vers␣la␣solution␣:’)
␣␣␣point_critique␣=␣x
else
␣␣␣␣disp(’L’’algorithme␣n’’a␣pas␣converge␣!’)
end
clc␣;␣clear␣all␣;
Cours complet est disponible sur mon site web : http://sites.univ-biskra.dz/kenouche/
H␣=␣[2␣1␣0␣;␣1␣4␣2␣;␣0␣2␣4]␣;␣f␣=␣[4␣;␣6␣;␣12]␣;
A␣=␣[-1␣-1␣-1␣;␣1␣1␣-2]␣;␣B␣=␣[-6␣;␣-2]␣;␣lB␣=␣[0␣;␣0␣;␣0]␣;
uB␣=␣[100␣;␣100␣;␣100]␣;␣xinit␣=␣[1␣;␣1␣;␣1]␣;
options␣=␣optimset(’Diagnostics’,’on’,’TolX’,␣1e-7)␣;
[x,␣fval,␣exitflag,␣output,␣lambda]␣=␣quadprog(H,␣f,␣A,␣B,␣[],[],␣...
␣␣␣␣lB,␣uB,␣xinit,options)␣;
if␣exitflag␣>␣0
␣␣␣disp(’L’’algorithme␣a␣converge␣vers␣la␣solution␣:’)
␣␣␣point_critique␣=␣x
else
␣␣␣␣disp(’L’’algorithme␣n’’a␣pas␣converge␣!’)
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Diagnostic␣Information
Number␣of␣variables:␣3
␣Number␣of␣linear␣inequality␣constraints:␣␣␣␣2
Algorithm␣selected
␣␣␣medium-scale:␣active-set
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
End␣diagnostic␣information
Comme on peut le constater, le champ optimset(’Diagnostics’,’on’, ...) renvoie des informations sur
la fonction-objectif, comme le nombre de variables, le nombre d’équation et d’inéquation ... etc.
Optimization␣terminated.
L’algorithme␣a␣converge␣vers␣la␣solution␣:
>>␣point_critique␣=
␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣3.3333
␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣0.0000
␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣2.6667
Exercice ¾ + s
– Minimiser les fonctions-objectif définies par :
x1 + 2 x2 ≤ 3
3 x + 2x ≥ 3
1 2
X̂ = argmin f (X) tel que
X∈R2
x1 − 2 x2 ≤ 2
x ,x ≥ 0
1 2
Pour conclure cette section, il recommandé également dans le même sillage de consulter les fonctions
d’optimisation prédéfinies fseminf, fminimax et fgoalattain.
f(x0,y0) f(x,y)
P0(x0,y0)
P(x,y)
d
~
Figure 4: Dérivée directionnelle au point P0 dans la direction d.
−−→ → − −−→ →
−
P0 P // d ⇒ P0 P = λ d avec λ ∈ R∗+
−−→ (86)
⇒ P0 P = λ (a~i + b ~j) = λ a~i + λ b ~j
−−→
D’un autre côté on peut définir le vecteur P0 P par rapport à l’origine O selon :
−−→ −→ −−→
P0 P = OP − OP0 (87)
= (x~i + y ~j) − (x0 ~i + y0 ~j) (88)
= x~i + y ~j − x0 ~i − y0 ~j (89)
= (x − x0 )~i + (y − y0 ) ~j (90)
Par identification des équations (86) et (90), il vient :
( (
x − x0 = λ a x = x0 + λ a
⇒ (91)
y − y0 = λ b y = y0 + λ b
→
−
Par voie de conséquence, la dérivée directionnelle de f (x, y) dans la direction du vecteur unitaire d = a~i+b ~j
au point f (x0 , y0 ) est :
f (x0 + λ a, y0 + λ b) − f (x0 , y0 )
→ (x0 , y0 ) = lim
f− (92)
d λ→0 λ
→
−
∇f (x0 , y0 ) × d = ∇f (x0 , y0 ) × (−∇f (x0 , y0 ))
= −∇f (x0 , y0 ) × ∇f (x0 , y0 )
= − ||∇(x0 , y0 )||2 >0
| {z }
| {z }
<0
→
−
⇒ d = −∇f est une direction de descente
2
Comme exemple d’application, calculons la dérivée directionnelle de la fonction f (x, y) = 2 e(x y) au point
(2, 3) dans la direction formant un angle de 75◦ avec l’axe des x positif. La solution est donnée ci-dessous :
Cours complet est disponible sur mon site web : http://sites.univ-biskra.dz/kenouche/
→
−
→ (2, 3) = ∇f (2, 3) d
f−
d
∂f ∂f
= (2, 3) × cos(75◦ ) + (2, 3) × sin(75◦ )
∂x ∂y
2 2
= 4 x y e(x y) × cos(75◦ ) + 2 x2 e(x y) × sin(75◦ )
= 24 e(4×3) × 0.25 + 8 e(4×3) × 0.96
= 6 e(12) + 7.70 e(12)
= 13.70 e(12)
55 = 1 × 32 + 1 × 16 + 1 × 4 + 1 × 2 + 1 × 1
55 = 1 × 25 + 1 × 24 + 1 × 22 + 1 × 21 + 1 × 20
55 = 1 × 25 + 1 × 24 + 0 × 23 + 1 × 22 + 1 × 21 + 1 × 20
55 = 110111
On utilise également la notation 55(10) = 110111(2) . Il est possible d’arriver au même résultat, en procédant
par des divisions successives du nombre 55 suivant la base 2. La condition d’arrêt correspond à un quotient
nul, ensuite on remonte les restes des divisions, selon :
Cours complet est disponible sur mon site web : http://sites.univ-biskra.dz/kenouche/
On obtient 55(10) = 110111(2) (de la droite vers la gauche). On peut proposer l’algorithme ci-dessous pour
transformer un nombre de la base décimale, par exemple le nombre 125, vers la base binaire.
%%%%%%%%%%%%%%%%%␣CONVERSION␣DECIMAL␣VERS␣LE␣BINAIRE␣%%%%%%%%%%%%%%%%
clc␣;␣clear␣all␣;
%␣Samir␣KENOUCHE␣-␣le␣09/08/2019
decNumber␣=␣125␣;␣base␣=␣2␣;␣binNumber␣=␣[];
quot␣=␣1␣;
while␣quot␣˜=␣0
␣␣␣␣quot␣=␣floor(decNumber/base)␣;␣reste␣=␣decNumber␣-␣quot*base␣␣;
␣␣␣␣decNumber␣=␣floor(decNumber/base);
␣␣␣␣binNumber␣=␣[reste␣binNumber]␣;
end
binNumber
%%%%%%%%%%%%%%%%%␣CONVERSION␣BINAIRE␣VERS␣LE␣DECIMAL␣%%%%%%%%%%%%%%%%
clc␣;␣clear␣all␣;
%␣Samir␣KENOUCHE␣-␣le␣09/08/2019
Cours complet est disponible sur mon site web : http://sites.univ-biskra.dz/kenouche/
binNumber␣=␣[1␣1␣0␣1␣1␣1]␣;␣base␣=␣2␣;␣decNumber␣=␣0␣;
for␣i␣=␣1␣:␣numel(binNumber)
␣␣␣decNumber␣=␣decNumber␣+␣binNumber(i)*baseˆ(numel(binNumber)␣-␣i)␣;
end
decNumber
Pour la conversion d’un nombre fractionnaire d’un système décimal vers le binaire, on procèdera comme suit :
?
55.8625(10) = xxxxxx(2)
On commence d’abord par écrire la partie entière en binaire : 55(10) = 110111(2) . Ensuite on multiplie par
2 la partie fractionnaire :
À partir de cet exemple, on note que la partie entière est codée, par des divisions successives par 2, sur
un nombre donné de bits. La partie fractionnaire est codée sur un nombre donné de bits en multipliant
successivement par 2 jusqu’à ce que la partie fractionnaire soit nulle ou le nombre de bits considéré est atteint.
Cette conversion donne :