Optimisation, algorithmique (MML1E31) (M1 Maths, 2016

publicité
Optimisation, algorithmique (MML1E31) (M1 Maths, 2016-2017)
Feuille de TD/TP n◦ 3 :
Méthode du gradient conjugué
Exercice 1.
Le but de cet exercice est d’implémenter l’algorithme du gradient conjugué et de comparer
sa convergence avec celle du gradient à pas optimal.
1. Coder la fonction
function x = gradient_conjugue(A,b,x0,eps)
vue en cours. Ajouter une commande qui affiche à chaque itération la valeur de k et de
k∇f (x(k) )k2 = kAx(k) − bk2 . Limiter le nombre d’itérations à kmax = 1000.
2. Coder une deuxième fonction
function [Xk, FXk] = gradient_conjugue_h(A,b,x0,eps)
qui reprend les calculs de la fonction gradient_conjugue et conserve l’historique
de tous les points (x(k) ) et valeurs f (x(k) ).
Afin de tester la fonction on va utiliser le problème suivant :
stacksize max
n = 100;
A = toeplitz([2, -1, zeros(1, n-2)])*(n+1)^2;
t = linspace(1/(n+1), 1-1/(n+1),n)’;
b = t.*(1-t).*exp(-t);
c= 0;
xstar = A\b;
x0 = ones(b)/40 + rand(b)/50;
eps = 10^(-4);
[Xk, FXk] = gradient_conjugue_h(A,b,x0,eps);
x = Xk(:,$);
norm(x-xstar)
Ce problème correspond à une discrétisation de type différence finie du problème de Poisson
suivant :
Trouver u ∈ C 2 (]0, 1[) telle que
∆u(t) = t(1 − t)e−t et u(0) = u(1) = 0 (conditions de Dirichlet).
Ainsi, chaque point x(k) correspond aux valeurs d’une fonction u discrétisée sur l’ensemble
1/(n + 1), 2/(n + 1), . . . , n/(n + 1). On peut donc afficher les courbes correspondant à ces
vecteurs. L’affichage de la solution est donné par
1
Yk = [zeros(1,size(Xk,2)); Xk; zeros(1,size(Xk,2))];
scf(1); clf;
plot2d([0;t;1], Yk(:,$), style=-1);
On peut également afficher toutes les courbes correspondant aux points intermédiaires x(k) (avec
une couleur aléatoire)
for k = 1:size(Yk,2)
plot2d([0;t;1], Yk(:,k),style=ceil(15*rand()));
sleep(100)
end
3. Tester ce problème et afficher les solutions correspondantes. Expliquer le rôle de la ligne
Yk = [zeros(1,size(Xk,2)); Xk; zeros(1,size(Xk,2))];
Vérifier que l’on a bien convergence en au plus n itérations et changeant la valeur de n.
On va maintenant comparer les performances de l’algorithme du gradient conjugué avec
celles du gradient à pas optimal appliqué à la fonctionnelle quadratique
1
f (x) = hAx, xi − hb, xi.
2
4. Ecrire une fonction
function [Xk, FXk] = gradient_pas_optimal_h(A,b,x0,eps)
qui applique la descente de gradient à pas optimal à la foncionnelle quadratique définie
ci-dessus et qui limite le nombre d’itérations à kmax = 103 (on pourra partir du code
vu en TP1, ou encore du code la fonction du gradient conjugué dont la première itération
correspond à celle du gradient à pas optimal).
5. Tester cette fonction sur le problème de Poisson pour n = 100.
6. Sur un même graphe en échelle semi-logarithmique afficher la suite d’erreurs (e(k) )k =
(kx(k) − x? k)k pour le gradient conjugué et pour le gradient à pas optimal. Qu’observe-ton ? Quel algorithme est le plus performant ?
Exercice 2.
On a vu que l’algorithme du gradient conjugué permettait de résoudre de manière efficace
un système de la forme
Ax = b
dans le cas où A est une matrice carrée définie positive.
Le but de l’exercice et de montrer que l’on peut également utiliser cet algorithme pour
résoudre le problème des moindres carrés. On considère donc A une matrice rectangulaire de
Mm,n (R) et b ∈ Rm , et on définit f : Rn → R par
1
f (x) = kAx − bk2 .
2
1. Montrer que la fonction f est quadratique et préciser le matrice A0 , le vecteur b0 et la
constante c0 pour cette fonctionnelle.
2. Sous quelle condition sur A l’algorithme du gradient conjugué converge-t-il pour cette
fonctionnelle f ?
2
3. Le calcul de la matrice produit AT A peut être très coûteux si l’on est en grande dimension.
Justifier que l’on peut éviter de calculer cette matrice (on s’autorisera toutefois à faire ce
calcul dans la suite).
Dans toute la suite de l’exercice on supposera que A est de rang n (et donc que m > n).
4. Dans le cas m = n, cette hypothèse revient à supposer A ∈ GLn (R) (c’est-à-dire A est
une matrice inversible). Justifier que minimiser f revient à résoudre la système linéaire
Ax = b. On peut donc résoudre tous les systèmes linéaires carrés avec l’algorithme de
gradient conjugué.
Les problèmes de moindre carrés sont très souvent rencontrés en statistique et en traitement
du signal. Cette question propose un cadre pour tester l’algorithme du gradient conjugué pour
résoudre le problème des moindres carrés.
On se place sur l’intervalle [0, 2π]. On suppose que l’on dispose de m mesures yi ∈ R
, . . . , (n−1)2π
}. Ces mesures correspondent aux valeurs d’une
prise en chaque point ti ∈ {0, 2π
n
n
fonctions g(ti ) et sont corrompus par un bruit gaussien i.i.d. de loi N (O, σ 2 ).
yi = g(ti ) + Wi ,
avec Wi ' N (O, σ 2 )
On cherche alors à approcher la fonction g par un polynôme trigonométrique de degré inférieur
ou égal à d
d
d
X
X
bk sin(kt).
ak cos(kt) +
p(t) = a0 +
k=1
k=1
Pour déterminer les n = 2d + 1 coefficients a0 , a1 , . . . , ad , b1 , . . . , bd on résout le problème des
moindres carrés
1
min kAx − bk2
2
avec
 
a0
 a1 
.

 
 
.
y1
1
.
 

 
 
b =  ...  ∈ Rm , x = ad  , A =  ...  CS 
 
 b1 
1
ym
.
 .. 
bd
où
C = (Ci,k )16i6m,16k6n = cos(kti )
et
S = (Si,k )16i6m,16k6n = sin(kti )
Ce problème peut s’interpréter comme un maximum de vraisemblance (car le bruit est gaussien).
5. Tester le script ci-dessous qui résout le problème des moindres carrés pour l’approximation de mesures bruités de la fonction g(t) = t(2π − t) par un polynôme trigonométrique. Vérifier que l’algorithme du gradient conjugué appliqué à la fonctionnelle
f (x) = 21 kAx − bk2 résout convenablement le problème. Tester plusieurs valeurs pour
m et pour l’écart-type σ. Qu’observe-t-on pour n = m ? Est-ce toujours intéressant de
prendre m grand ?
3
// Exemple : Interpolation par un polynôme trigonometrique
stacksize max;
m = 101; // m impaire
d = 10;
n = 2*d+1; // n impaire
t = linspace(0, 2*%pi*(1-1/m), m)’; // lieu des mesures
A = zeros(m,n);
A(:,1) = ones(m,1);
for k=1:d
A(:,k+1) = cos(k*t);
A(:,k+1+d) = sin(k*t);
end
// simulation des mesures bruitees
sigma = 0.5;
b = t.*(2*%pi-t) + sigma*rand(m,1,’normal’);
// Resolution avec Scilab :
xstar = A\b;
// Resolution avec gradient conjugue :
// A FAIRE x =
tt = linspace(0,2*%pi,10^3)’;
N = length(tt);
D = zeros(N,n);
D(:,1) = ones(N,1);
for k=1:d
D(:,k+1) = cos(k*tt);
D(:,k+1+d) = sin(k*tt);
end
polstar = D*xstar;
pol = D*x;
// affichage
scf(1);clf()
plot2d(t,b,style=-1);
plot2d(tt,polstar,style=2);
plot2d(tt,pol,style=5);
6. Reprendre la même méthodologie avec des polynômes réels de degré inférieur ou égal à
m − 1 (au plus m coefficients à déterminer).
4
Téléchargement