Optimization Rosenbrock2009
Optimization Rosenbrock2009
Optimization Rosenbrock2009
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
Fonction Matlab :
function []=plotGraphe(h);
surf(x,y,z);
Ce qui donne :
2
4
x 10
14
12
10
2
10
0
−10 0
−5
0
5
10 −10
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
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);
4
function [X_etoile]=AlgoPasOtptimal(X0,N,tol);
[dfx,dfy]=gradientF(X0);
X(:,1)=X0;
test=norm([dfx,dfy],2);
k=1;
[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
function [X_etoile]=AlgoPasFixe(X0,beta,N,tol);
[dfx,dfy]=gradientF(X0);
X(:,1)=X0;
test=norm([dfx,dfy],2);
k=1;
[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
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).
function [x_etoile,k]=gradientConjugue(n,x0,Niter,tol);
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);
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 .
function [Xtt,k]=GradientConjuguePreconditionne(n,X0,Niter,tol);
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 complète le programme pour qu’il renvoie aussi le résidu logarithmique en fonction du nombre d’ité-
rations ;
11
5 grad conj
grad conj précond
−5
−10
−15
−20
−25
−30
−35
0 200 400 600 800 1000
12