[go: up one dir, main page]

0% ont trouvé ce document utile (0 vote)
220 vues12 pages

Optimization Rosenbrock2009

Télécharger au format pdf ou txt
Télécharger au format pdf ou txt
Télécharger au format pdf ou txt
Vous êtes sur la page 1/ 12

Zangré Ibrahim

Optimisation non linéaire sans contraintes


Rapport du TP2

Exercice 1 : Minimisation d’une fonctionnelle non quadratique

On définit sur R2 la fonctionnelle de Rosenbrock par :

f (x, y) = (x − 1)2 + 10(x2 − y)2 (1)


1. Etude théorique
(a) Points critiques de f :
f est C ∞ et on a :
 
2(x − 1) + 40x(x2 − y)
∇f (x, y) =  
2
−20(x − y)
et :
 
120x2 − 40y + 2 −40x
Hess [f ] (x, y) =  
−40x 20
On a : 
 (x − 1) + 20x(x2 − y) = 0
∇f (x, y) = 0 ⇐⇒
x2 − y = 0


 x−1=0
⇐⇒
x2 − y = 0


 x=1
⇐⇒

y=1  
1
Le seul point critique de f est donc X ∗ :=
1

1
(b)
On a f (X ∗ ) = 0 et ∀X ∈ R2 , f (X) ≤ f (X ∗ ) = 0 ; donc X ∗ est un minimum global de f ; comme c’est
l’unique point critique de f , alors c’est l’unique minimum global.

 
∗ 82 −40
(c) Soit H la matrice hessienne de f calculé au point X ; H = ; son polynôme caracté-
−40 20
√ √
51− 2561 51+ 2561
ristique est P = λ2 −102λ+40, dont les racines sont : λ1 = 2 (= λmin ) et λ2 = 2 (= λmax ) ;
le conditionnement de H est donné par :
λmax
κ(A) = ≈ 258, 096
λmin

(d)Devéloppment
 à l’ordre 2 de f en X ∗ :
u1
soit u := , alors :
u2
   
1
f (X ∗ + u) = f (X ∗ ) + ∇f (X ∗ ), u + Hu, u + kuk2 ǫ(u) = 41u21 + 10u22 − 40u1 u2 + kuk2 ǫ(u)
| {z } | {z } 2
0 ~0

2. Etude numérique

(a) Représentation de la fonctionnelle sur le pavé [−10, 10] × [−10, 10] :

Fonction Matlab :

function []=plotGraphe(h);

% h : pas de la discrétisation spaciale


x=-10:h:10;
y=-10:h:10;
[x,y]=meshgrid(x,y);
z=(x-1).^2+10.*(x.^2-y).^2;

surf(x,y,z);

Ce qui donne :

2
4
x 10

14

12

10

2
10
0
−10 0
−5
0
5
10 −10

Figure 1 – Représentation sur le pavé [−10, 10] × [−10, 10]

(b) Tracer de lignes de niveau de la fonctionnelle

Fonction Matlab :

function []=plot_ligne_de_nivau(a,delta,N);

% a :borne du pavé
% delta :pas de discrétisation
% N :nombre de lignes de niveau
% à afficher

x=-a:delta:a;
y=-a:delta:a;
[x,y]=meshgrid(x,y);
z=(x-1).^2+10.*(x.^2-y).^2;

[c,h]=contour(x,y,z,N);
colormap hsv

Ce qui donne :

3
10

−2

−4

−6

−8

−10
−10 −5 0 5 10

Figure 2 – Lignes de niveau

La “platitude” de la surface au voisinage du point X ∗ ralentit la convergence des algorithmes : à partir


d’un certain moment “on avance plus” !
3. Comparaison de deux méthodes de minimisation
(a) Méthode du gradient à pas optimal

i. Minimisation de la fonction α → f (X − α.∇f (X)) avec la fonction Matlab f minsearch :

function [alphaOptimal,fval]=pasOptimal(alpha0,X);

[dfx,dfy]=gradientF(X);

rosenbrok=@(alpha)((X(1)-alpha.*dfx)-1).^2+10.*((X(1)-alpha.*dfx).^2-(X(2)-alpha.*dfy)).^2;

[alphaOptimal,fval] = fminsearch(rosenbrok,alpha0);

ii, iii. Gradient à pas optimal


On utilisera un double critère d’arrêt de l’algorithme :
-un critère portant sur la précision de la méthode, par exemple portant sur le module du gradient
-et un critère portant sur le nombre d’itérations pour éviter que l’algorithme soit infini.

4
function [X_etoile]=AlgoPasOtptimal(X0,N,tol);

[dfx,dfy]=gradientF(X0);
X(:,1)=X0;
test=norm([dfx,dfy],2);
k=1;

while test>tol && k<=N

[dfx,dfy]=gradientF(X(:,k));
[alphaOptimal,fval]=pasOptimal(1,X(:,k));
X(:,k+1)=X(:,k)-alphaOptimal.*[dfx;dfy];
%X(k,:)=X(k-1,:)-0.5/(51+sqrt(2561)).*[dx2 dy2];

test=norm([dfx,dfy],2);

k=k+1;
end

X_etoile=X(:,k-1);

figure
hold on
plot_ligne_de_niveau(10,0.5,50)
plot(X(1,:),X(2,:),’g’);
plot(1,1,’*r’)
hold off

   
0 0, 9999
En partant du point X0 = ,avec N = 103 et tol = 10−3 , on obtient : X ∗ = : on représente
1 0, 9998
les lignes de niveau et la trajectoires des x(k) :

5
2

1.5

0.5

−0.5

−1

−1.5

−2
−2 −1.5 −1 −0.5 0 0.5 1 1.5 2

Figure 3 – Lignes de niveau et trajectoire des x(k)

(b) Méthode du gradient à pas fixe

Fonction Matlab : pasF ixe

function [X_etoile]=AlgoPasFixe(X0,beta,N,tol);

[dfx,dfy]=gradientF(X0);
X(:,1)=X0;
test=norm([dfx,dfy],2);
k=1;

while test>tol && k<=N

[dfx,dfy]=gradientF(X(:,k));
X(:,k+1)=X(:,k)-beta.*[dfx;dfy];

test=norm([dfx,dfy],2);

k=k+1;
end

X_etoile=X(:,k-1);

Xop=AlgoPasOtptimal([0;1],1e+2,1e-3);
figure

6
hold on
plotGraphe2(2,0.1,50)
plot(X(1,:),X(2,:),’r’,’LineWidth’,2)
legend(’pas fixe’);
plot(Xop(1,:),Xop(2,:),’color’,[0 1 1])
legend(’pas optimal’);
plot(1,1,’*b’)
hold off

 
3 −3 ∗ 0, 9989
Avec N = 10 et tol = 10 , on obtient : X = .
0, 9977
(c) Comparaison des méthodes

i. Trajectoires des x(k) générés par les gradients à pas optimal et à pas fixe :

1.5

0.5

−0.5

−1

−1.5

−2
−2 −1.5 −1 −0.5 0 0.5 1 1.5 2

Figure 4 – Pas optimal (vert) et pas fixe (rouge)

ii. Les lignes de niveau sont rares au voisinage de X ∗ ; cela est dû à la “platitude” de la fonc-
tionnelle au voisinage de ce point ; la valeur du pas donné par la recherche 1D optimale est à l’origine
du zizag des x(k) générés par le gradient à pas optimal (la courbe est plus lisse pour des petits pas : voir
gradient à pas fixe → fig4).

(k)
iii. On modifie les programmes prédédents pour qu’ils revoient laliste des points
 x obtenus
(k) ∗
par les deux algorithmes ; puis on calcule et on trace la courbe donnant ln kx − X k en fonction de

7
k;

Fonction Matlab :

function []=erreur();

Xop=AlgoPasOtptimal([0;1],1e+3,1e-3);
Xfix=AlgoPasFixe([0;1],0.01,1e+3,1e-3);
N_op=size(Xop,2);
N_fix=size(Xfix,2);
X_etoile=[1;1];

for i=1:N_op
erreur_op(i)=log(norm(Xop(:,i)-X_etoile,2));
end

for i=1:N_fix
erreur_fix(i)=log(norm(Xfix(:,i)-X_etoile,2));
end
hold on
plot((1:N_op),erreur_op,’g’)
plot((1:N_fix),erreur_fix,’r’)
hold off

soit :

1
pas optimal
pas fixe
0

−1

−2

−3

−4

−5

−6

−7
0 200 400 600 800 1000 1200

 
(k) ∗
Figure 5 – Fonction erreur ln kx −X k

Ces courbes ont une allure linéaire ; l’erreur kx(k) − X ∗ k peut être donnée par e−ck , avec c > 0. On voit

8
bien que la gradient conjugué converge plus vite que le gradient à pas fixe (pente plus grande en module).

Exercice 2 : Résolution de systèmes linéaires à l’aide de préconditioneurs

On souhaite résoudre le système d’inconnue x : An x = bn , avec :


 
2 −1 0 ... 0
 ..   
−1 2 −1 . 
  1

An =  0 .. .. .. 
∈ Mn (R), et bn = . . . ∈ Rn
 . . . 0 
 .  1
 .. −1 2 −1
0 ... 0 −1 2

1. Première méthode : le gradient conjugué.

Résoudre le système précédent revient à minimisé la fonctionnelle : Jn (x) = 21 (An x, x) − (bn , x)

Algorithme du gradient conjugué



x(0) donné, r(0) = An x(0) − b, d(0) = −r(0)

 (n) (n)
= x(n) + ρn d(n) , ρn = − (A(rn d(n)
,d )
 (n+1)
 x ,d(n) )



 r(n+1) = An x(n+1) − b


 (n+1) 2
d(n+1) = −r(n+1) + βn d(n) , βn = krkr(n) k2k

Focntion Matlab : Gradient conjugué

function [x_etoile,k]=gradientConjugue(n,x0,Niter,tol);

%Niter : nombre maximal d’itérations


%tol : test d’arrêt sur le module du gradient
%k : donne le nombre d’itérations nécéssaires pour
% atteindre la solution
A=An(n);
x(:,1)=x0;
r(:,1)=dJn(n,x(:,1));
d(:,1)=-r(:,1);
i=1;
k=0;
while test>tol && i<=Niter-1

k=k+1;

rho=-((d(:,i))’*r(:,i))/((d(:,i))’*(A*d(:,i)));
x(:,i+1)=x(:,i)+rho*d(:,i);

9
r(:,i+1)=dJn(n,x(:,i+1));
beta=(norm(r(:,i+1),2)/norm(r(:,i),2))^2;
d(:,i+1)=-r(:,i+1)+beta*d(:,i);

test=norm(d(:,i),2);

i=i+1;

end

x_etoile=x(:,i-1);

2. La méthode du gradient conjugué préconditionné.

Si M est une matrice inversible, le système An x = bn est identique à : M −1 An x = M −1 bn ; on choisit la


matrice M pour que le conditionnement de M −1 An soit meilleur que celui de An , et que M −1 soit facile
à calculer.

(a) Principe de la factorisation de Cholesky

Soit A une matrice symétrique définie positive ; alors il existe une unique matrice triangulaire à élé-
ments diagonaux positifs R telle que :
t
A = RR
C’est un cas particulier de la factorisation LU : soit à résoudre le système Ax = b ; ce système est équi-
valent à :
 t
 Ry = b

Rx = y
(b) La factorisation peut “remplir” partiellement la matrice R ; donc on considère RI la factorisée
incomplète de Cholesky de An , et on pose M = t RI × RI ; dans ce cas la matrice M est facile à inverser ;
comme M est “proche” de A, M −1 A est proche de I, et son conditionnement plus proche de 1, donc
meilleur que celui de A .

(c) Gradient conjugué préconditionné :

function [Xtt,k]=GradientConjuguePreconditionne(n,X0,Niter,tol);

%Niter : nombre maximal d’itérations


%tol : test d’arrêt sur le module du gradient
%k : donne le nombre d’itérations nécéssaires pour
% atteindre la solution

An=MatrixCreator(n);
RI=cholinc(sparse(An),’0’);

10
M=RI’*RI;
Minv=inv(M);

x(:,1)=X0;
r(:,1)=Minv*dJn(n,x(:,1));
d(:,1)=-r(:,1);
test=norm(d(:,1),2);
i=1;
k=0;
while test>tol && i<=Niter-1

k=k+1;

rho=-((d(:,i))’*r(:,i))/((d(:,i))’*(Minv*An*d(:,i)));
x(:,i+1)=x(:,i)+rho*d(:,i);
r(:,i+1)=Minv*dJn(n,x(:,i+1));
beta=(norm(r(:,i+1),2)/norm(r(:,i),2))^2;
d(:,i+1)=-r(:,i+1)+beta*d(:,i);

test=norm(d(:,i),2);

i=i+1;

end

X_etoile=x(:,i-1);
b=ones(n,1);
X_theoric=An\b;
Xtt=[X_etoile,X_theoric];

On améliore ainsi la vitesse de convergence ; la solution est atteinte en deux itérations !

3. Comparaison des algorithmes.

On complète le programme pour qu’il renvoie aussi le résidu logarithmique en fonction du nombre d’ité-
rations ;

Le résidu logarithmique pour la méthode du gradient conjugué préconditionné est à −∞ en quelques


itérations : méthode nettement plus rapide que le gradient conjugué sans préconditionnement.

11
5 grad conj
grad conj précond

−5

−10

−15

−20

−25

−30

−35
0 200 400 600 800 1000

Figure 6 – Résidu logarithmique

12

Vous aimerez peut-être aussi