corrigé - Université Paris

Transcription

corrigé - Université Paris
Université Paris-Dauphine
Département MIDO
DUMI2E troisième année
Optimisation numérique
Gérard Lebourg
année /
Examen d’appel
On cherche à minimiser, sur le cône positif C = { x ∈ RN | xi ≥ 0, i = 1..N } de RN , une fonction
F : RN 7→ R, convexe et de classe C 1 sur C, problème que l’on désigne dans la suite par (P). On se propose
de résoudre numériquement ce problème à l’aide de la procédure GUMP utilisée en TPs. On rappelle que GUMP
se présente comme une fonction Matlab prenant trois arguments :
1. une structure pb contenant la donnée du problème à résoudre
2. une structure algo précisant l’algorithme de descente utilisé
3. un entier itermax limitant - éventuellement - le nombre d’itérations : la valeur : itermax =inf
(+∞ en Matlab) est possible.
GUMP utilise une structure trial, actualisée à chaque passage dans la boucle de l’algorithme, dont les
« champs » contiennent toute l’information attachée au point courant, en particulier :
1. le champ trial.x contient la valeur du point courant
2. les champs trial.f et trial.g contiennent respectivement les valeurs du critère et de son gradient au
point trial.x
3. le champ trial.d contiendra la direction de recherche calculée par l’algorithme au point trial.x
1. (4 pts) La structure pb, passée pour argument à GUMP, ne comportera que deux champs :
1. le champ pb.init contiendra l’initialisation de l’algorithme. On utilisera pb.init=zeros(N,1).
2. le champ pb.crit contiendra une « poignée » @myfun sur une fonction myfun (un « oracle ») prenant
pour argument un point x de RN , et retournant, en fonction du nombre d’arguments avec lesquels elle
est appelée, la valeur du critère F au point x dans une variable f , ainsi, éventuellement, que celle de
son gradient dans une variable g .
Donner le code Matlab de myfun en supposant : A M × N matrice réelle donnée, b vecteur donné de RM ,
et : F (x) = kA ? x − bk2 . Déclarer A et b comme variables globales.
function [f,g] = myfun(x)
global A,b
z=A?x-b ; f=z?z ;
if nargout>1
g=2?A’?z ;
end ;
2. (3 pts) Le champ algo.searchdir de la structure algo, qui sera passée pour argument à GUMP, devra
contenir une « poignée » @mydir sur une fonction mydir. GUMP passera pour argument la structure trial à
cette fonction, qui devra retourner la direction de recherche mydir(trial) au point courant trial.x. On
utilisera le code :
function d= mydir(trial)
x= trial.x; g=trial.g;
d=trictrac(x,g);
function d= trictrac(x,g)
d=x-g;
I=find(d<0); % retourne l’ensemble I ⊂ [1, N ] des indices i tels que: di < 0
d(I)=0;
% di = 0 si: i ∈ I
d=d-x;
On s’intéresse dans cette question à la sous-fonction trictrac apparaissant dans le code de mydir. Prouver
que : x ∈ C, g ∈ RN , et : d =trictrac(x, g) impliquent :
a. x + d ∈ C
b. g 0 ? d ≤ −kdk2
c. d = 0 ⇒ (g ≥ 0)&(g 0 ? x = 0)
(indication : calculer di pour i ∈ I et i 6∈ I où I est défini comme dans le corps de trictrac)
−xi si
xi < gi (i ∈ I)
En sortie de la procédure trictrac : di =
.
−gi sinon
0
si
xi < gi
a. xi + di =
donc : x + d ∈ C.
xi − gi sinon
b. g 0 ? d =
P
i∈I
gi di +
P
i6∈I
gi di = −
P
i∈I
gi xi −
P
i6∈I
gi2
or : i ∈ I, x ∈ C ⇒ 0 ≤ xi < gi ⇒ x2i ≤ xi gi , donc : g 0 ? d ≤ −
P
i∈I
x2i −
P
i6∈I
c. Si : d = 0, xi = 0 < gi ou : gi = 0 pour tout indice i, donc g ≥ 0 et : g 0 ? x =
gi2 = −kdk2 .
P
gi xi = 0.
3. (5 pts) Le champ algo.stoppingtest de la structure algo devra contenir une « poignée » @mystop sur
une fonction booléenne mystop. GUMP passera pour argument la structure trial à cette fonction, une fois
la direction de recherche mydir(trial) calculée. La valeur mystop(trial)=1 permettra éventuellement
de générer un break : l’algorithme s’arretera - même si le nombre maximal itermax d’itérations n’est pas
atteint - et retournera la valeur du point courant trial.x. On utilisera le code :
function bool=mystop(trial)
bool=(trial.d==0)
a. Ecrire les KKT associées au problème (P) (on notera µ un vecteur de multiplicateurs associé aux
contraintes).
∇F (x) + µ = 0,
µ ≤ 0, µ0 ? x = 0
b. Déduire que x ≥ 0 est solution de (P) si et seulement si : ∇F (x) ≥ 0 et ∇F (x)0 ? x = 0 .
Si : x ≥ 0 est solution de (P) : ∇F (x) = −µ ≥ 0, et : ∇F (x) ? x = −µ ? x = 0. Réciproquemment, si :
∇F (x) ≥ 0 et : ∇F (x) ? x = 0, x vérifie les KKT avec : µ = −∇F (x). Or le problème est convexe, donc
les KKT sont sufisantes et x est solution de (P).
c. En utilisant 2.c, conclure que l’algorithme ne s’arretera avant itermax iterations que si il trouve auparavant une solution de (P).
L’algorithme ne s’arretera avant itermax itérations que si, à une certaine étape : d = 0. Mais 2.c implique
alors : g ≥ 0 et g 0 ? x = 0 avec : g = ∇F (x), et le point x retourne par l’algorithme sera, d’après la
question précédente, solution de (P).
4. (4 pts) Le champ algo.stepsize de la structure algo devra également contenir une « poignée » sur
une fonction Matlab à laquelle sera passée pour argument dans GUMP la structure trial. Cette fonction
devra retourner le pas calculé par l’algorithme au point trial.x dans la direction trial.d. On définira :
algo.stepsize=@backtrack. On rappelle que backtrack teste d’abord le pas : t = 1. Si ce pas vérifie la
condition d’Armijo avec la valeur fixée du paramètre : α = 0.1, le pas : t = 1 est accepté et backtrack
retourne la valeur 1. Sinon, backtrack réduit le pas en remplaçant t par l’abscisse du sommet de la parabole
tangente au graphe de la fonction de ligne ϕ définie par : ϕ(t) = F (trial.x + t ? trial.d) passant par le point
(t, ϕ(t)) jusqu’à ce que la condition d’Armijo soit vérifiée. Montrer que :
a. la suite xk des points calculés par l’algorithme, initialisée par x0 =pb.init=zeros(N,1), restera toujours
dans le cône positif C de RN .
Notons dk la direction de descente et tk le pas calculés par l’algorithme au point xk . D’après 2.a :
xk ∈ C ⇒ xk + dk ∈ C, et, puisque C est convexe et 0 ≤ tk ≤ 1 :
xk ∈ C ⇒ xk+1 = xk + tk dk = (1 − tk ) xk + tk (xk + dk ) ∈ C
Puisque : x0 ∈ C, la suite xk toute entière restera dans C.
b. la suite F (xk ) des valeurs correspondantes du critère sera décroissante.
Posons : gk = ∇F (xk ). La décroissance de la suite F (xk ) est conséquence directe de la règle d’Armijo
et de 2.b :
F (xk+1 ) ≤ F (xk ) + α tk gk0 ? dk ≤ F (xk ) − α tk kdk k2 < F (xk )
5. (5 pts) On suppose en fait F de classe C 2 sur le cône positif C de RN , et la norme spectrale de sa Hessienne
majorée, en tout point de C, par une constante K. Prouver que le pas calculé, à chaque étape, par backtrack
sera toujours supérieur à min(1, 1/K).
Il suffit de prouver que l’abscisse du sommet de toute parabole passant par le point (0, ϕ(0)), tangente en
ce point au graphe de ϕ, et passant par un point de la forme (t, ϕ(t)) (t > 0), est supérieure à 1/K. Mais
toute parabole passant par le point (0, ϕ(0)), et tangente en ce point au graphe de ϕ, est le graphe d’une
fonction de la forme : ψa (t) = ϕ(0) + ϕ0 (0) t + a2 t2 , et l’abscisse −ϕ0 (0)/a de son sommet est d’autant plus
proche de zéro que a est grand (ϕ0 (0) < 0). Si elle passe également par un point de la forme (t, ϕ(t)) (t > 0),
il résulte de la formule de Taylor :
ϕ(0) + ϕ0 (0) t +
a 2
2 t
= ϕa (t) = ϕ(t) ≤ ϕ(0) + t ϕ0 (0) +
K 2
2 t
kdk2 = ϕK kdk2 (t)
donc t : a ≤ K kdk2 , et l’abscisse −ϕ0 (0)/a de son sommet est au moins ègale à : −ϕ0 (0)/ K kdk2 . Mais,
d’après 2. b : ϕ0 (0) = −∇F (x)0 ? d ≥ kdk2 , d’où le résultat.
6. (5 pts) On suppose en outre vérifiée l’hypothèse :
(H)
xk ∈ C, kxk k → +∞ ⇒ F (xk ) → +∞
Prouver que :
a. la suite xk des points calculés par l’algorithme avec itermax=inf aura au moins un point d’adhérence.
D’après 4, la suite xk reste dans l’ensemble fermé : S0 = { x ∈ C | F (x) ≤ F (x0 ) }. Lorsque la fonction
F est coercive sur C (hypothèse (H)), S0 est compact, et xk a nécessairement des points d’adhérence.
b. tout point d’adhérence de la suite xk sera solution du problème (P).
(utiliser 2.b)
F étant coercive sur le fermé C, elle y est minorée, et la règle d’Armijo, combinée avec 2.b, implique : dk = trictrac(xk , gk ) → 0 (voir la réponse de 4.b). Si la sous-suite xξ(k) converge vers
x ∈ C, gξ(k) = ∇F (xξ(k) ) → g = ∇F (x), et, en supposant la fonction trictrac continue, on déduira : 0 = trictrac(x, g), donc g ≥ 0 et g 0 ? x = 0 (2.c), c’est à dire : x solution de (P) (3.b). Le
résultat valant quelque soit la sous-suite extraite de xk , on conclura que tout point d’adhèrence de xk
est bien solution de (P). Reste à vérifier la continuité de trictrac en observant que sa ième fonction
composante est, pour tout indice i de 1 à N , la fonction continue : (x, g) 7→ di = − min(xi , gi ).
c. la distance de xk a l’ensemble des solutions de (P) tendra nécessairement vers zéro.
(raisonner par l’absurde)
Par l’absurde : sinon il existe une sous-suite xξ(k) de xk et un réel ε > 0 tels que : d(xξ(k) , S) ≥ ε, où S
désigne l’ensemble des solutions de (P). Mais la suite xξ(k) restant dans le compact S0 , elle admettrait
alors nécéssairement une sous-suite xζ(k) qui devrait converger vers une solution de (P) tout en vérifiant :
d(xζ(k) , S) ≥ ε : une contradiction.

Documents pareils