Méthode du gradient conjugué

Un article de Wikipédia, l'encyclopédie libre.
Aller à : navigation, rechercher

En analyse numérique, la méthode du gradient conjugué est un algorithme pour résoudre des systèmes d'équations linéaires dont la matrice est symétrique définie positive. Cette méthode, imaginée en 1950 simultanément par Cornelius Lanczos et Magnus Hestenes, est une méthode itérative qui converge en un nombre fini d'itérations (au plus égal à la dimension du système linéaire). Toutefois, son grand intérêt pratique du point de vue du temps de calcul vient de ce qu’une initialisation astucieuse (dite « préconditionnement ») permet d'aboutir en seulement quelques passages à une estimation très proche de la solution exacte, c'est pourquoi en pratique on se borne à un nombre d'itérations bien inférieur au nombre d'inconnues.

La méthode du gradient biconjugué fournit une généralisation pour les matrices non symétriques.

Principe[modifier | modifier le code]

L'objectif est de minimiser la fonction f:  x \mapsto \frac{1}{2} (\mathbf{A}x,x) -(b,x) où A est une matrice carrée symétrique définie positive de taille n.

Le calcul montre qu'une solution du problème est la solution du système  \mathbf{A} x = b  : en effet, on a \nabla f \left ( x \right) = \mathbf{A}x-b .

La méthode du gradient conjugué vue comme une méthode directe[modifier | modifier le code]

On rappelle que deux vecteurs non nuls u et v sont conjugués par rapport à A si

 u^\mathrm{T} \mathbf{A} v = 0.

Sachant que A est symétrique définie positive, on en déduit un produit scalaire

 \langle u,v \rangle_\mathbf{A} := \langle \mathbf{A} {u}, {v}\rangle = \langle {u},  \mathbf{A}^\mathrm{T} {v}\rangle = \langle {u}, \mathbf{A}{v} \rangle = {u}^\mathrm{T} \mathbf{A} {v}.

Deux vecteurs sont conjugués s'ils sont donc orthogonaux pour ce produit scalaire.

La conjugaison est une relation symétrique : si u est conjugué à v pour A, alors v est conjugué à u.

Supposons que {pk} est une suite de n directions conjuguées deux à deux. Alors les {pk} forment une base de Rn, ainsi la solution x* de Ax= b dans cette base :

 x_* = \sum^{n}_{i=1} \alpha_i p_i

Les coefficients sont donnés par

 {b}=\mathbf{A}{x}_* = \sum^{n}_{i=1} \alpha_i  \mathbf{A} {p}_i.
 {p}_k^\mathrm{T} {b}={p}_k^\mathrm{T} \mathbf{A}{x}_* = \sum^{n}_{i=1} \alpha_i{p}_k^\mathrm{T} \mathbf{A} {p}_i=\alpha_k{p}_k^\mathrm{T} \mathbf{A} {p}_k. (car \forall i\neq k, p_i, p_k sont conjugués deux à deux)
 \alpha_k = \frac{{p}_k^\mathrm{T} {b}}{{p}_k^\mathrm{T} \mathbf{A} {p}_k} = \frac{\langle {p}_k, {b}\rangle}{\,\,\,\langle {p}_k,  {p}_k\rangle_\mathbf{A}} = \frac{\langle {p}_k, {b}\rangle}{\,\,\,\|{p}_k\|_\mathbf{A}^2}.

On a ainsi l'idée directrice de la méthode pour résoudre le système Ax=b : trouver une suite de n directions conjuguées, et calculer les coefficients αk.

La méthode du gradient conjugué vue comme une méthode itérative[modifier | modifier le code]

En choisissant correctement les directions conjuguées pk, il n'est pas nécessaire de toutes les déterminer pour obtenir une bonne approximation de la solution x*. Il est ainsi possible de considérer la méthode du gradient conjugué comme une méthode itérative. Ce choix permet ainsi de considérer la résolution de systèmes de très grande taille, où le calcul de l'ensemble des directions aurait été très long.

On considère ainsi un premier vecteur x0, qu'on pourra supposer nul (sinon, il faut considérer le système Az=bAx0). L'algorithme va consister, partant de x0, à se « rapprocher » de la solution x* inconnue, ce qui suppose la définition d'une métrique. Cette métrique vient du fait que la solution x* est l'unique minimiseur de la forme quadratique :

 f(\mathbf{x}) = \frac12 x^\mathrm{T} \mathbf{A}x - x^\mathrm{T} b , \quad x\in\R^n.

Ainsi, si f(x) diminue après une itération, alors on s'approche de x*.

Ceci suggère donc de prendre la première direction p1 comme l'opposé du gradient de f à x=x0. Le gradient vaut Ax0-b=-b, d'après notre première hypothèse. Les vecteurs suivants de la base seront ainsi conjugués au gradient, d'où le nom « méthode du gradient conjugué ».

Soit rk le résidu à la ke itération :

 r_k = b - \mathbf{A}x_k.  \,

Notons que rk est l'opposé du gradient de f en x=xk, ainsi, l'algorithme du gradient indique d'évoluer dans la direction rk. On rappelle que les directions pk sont conjuguées deux à deux. On veut aussi que la direction suivante soit construite à partir du résidu courant et des directions précédemment construites, ce qui est une hypothèse raisonnable en pratique.

La contrainte de conjugaison est une contrainte d'orthonormalité, aussi le problème partage des similitudes avec le procédé de Gram-Schmidt.

On a ainsi

 {p}_{k+1} = {r}_k - \sum_{i\leq k}\frac{{p}_i^\mathrm{T} \mathbf{A} {r}_k}{{p}_i^\mathrm{T}\mathbf{A} {p}_i} {p}_i

Suivant cette direction, le point suivant est donné par

 {x}_{k+1} = {x}_k + \alpha_{k+1} {p}_{k+1}

avec

 \alpha_{k+1} = \frac{{p}_{k+1}^\mathrm{T} {b}}{{p}_{k+1}^\mathrm{T} \mathbf{A} {p}_{k+1}} = \frac{{p}_{k+1}^\mathrm{T} ({r}_{k}+\mathbf{A}x_{k})}{{p}_{k+1}^\mathrm{T} \mathbf{A} {p}_{k+1}} = \frac{{p}_{k+1}^\mathrm{T} {r}_k}{{p}_{k+1}^\mathrm{T} \mathbf{A} {p}_{k+1}},

la dernière égalité venant du fait que pk+1 et xk sont conjugués.

Algorithme[modifier | modifier le code]

Pour amorcer la récurrence, il faut partir d’une estimation initiale x_0 du vecteur x recherché ; et le nombre d'itérations N nécessaire pour que \| x_N - x\| < \varepsilon (où ε est un nombre positif arbitrairement proche de zéro) dépend du x_0 choisi. Malheureusement, les méthodes de « préconditionnement » à la fois sûres et générales (c'est-à-dire efficaces pour toutes sortes de matrices symétriques positives) pour former un x_0 correct sont aussi elles-mêmes coûteuses en temps de calcul. En pratique, l'intuition physique, guidée par la nature physique du problème à résoudre, suggère parfois une initialisation efficace : ces idées ont donné lieu depuis plus de trente ans à une littérature spécialisée abondante[1].

Solveur[modifier | modifier le code]

  • (en) M1CG1 - A solver of symmetric linear systems by conjugate gradient iterations, using/building a BFGS/ℓ-BFGS preconditioner. Écrit en Fortran-77. Le solveur a l'intérêt d'offrir la possibilité de construire un préconditionneur BFGS ou ℓ-BFGS (en), qui pourra être utile pour la résolution d'un système linéaire avec une matrice proche et un second membre différent.

Notes et références[modifier | modifier le code]

Notes[modifier | modifier le code]

  1. Selon Dianne O'Leary (cf. bibliographie), l'article de J. Meijerink et H. van der Vorst, « An iterative solution method for linear systems of which the coefficient matrix is symmetric a M-matrix », Mathematics of Computation, no 31,‎ 1977, p. 148-162 marque une étape décisive dans l'idée de préconditionner un système linéaire avant de lui appliquer l'algorithme. Cet article pionnier proposait le pré-conditionnement par Décomposition LU incomplète. Suivirent entre autres le pré-conditionnement par SOR interrompu (M. DeLong et J. Ortega, « SOR as a preconditionner », Applied Numerical Mathematics, no 18,‎ 1995, p. 431-440), et par Méthode de Gauss-Seidel interrompue (Y. Saad et Gene Golub (dir.), Parallel preconditionners for general sparse matrices, Recent Advances in Iterative Methods, Springer Verlag,‎ 1994, 165-199 p.). On trouvera un aperçu des différentes techniques dans, entre autres : A. Bruaset, A survey of preconditionned iterative methods, Longman Scientific & Technical, coll. « Pitman Research Notes in Mathematics »,‎ 1995 ; J. Erhel et K. Burrage, On the performance of various adaptive preconditioned GMRES strategies, INRIA/IRISA,‎ 1997, etc.

Bibliographie[modifier | modifier le code]

  • Philippe Ciarlet, Introduction à l’analyse numérique matricielle et à l’optimisation, Masson, coll. « Math. Appl. pour la Maîtrise »,‎ 1985 (réimpr. 2001) (ISBN 2-225-68893-1)
  • Dianne P. O'Leary (dir.), Linear and nonlinear Conjugate gradient-related Methods, AMS-SIAM,‎ 1996, « Conjugate gradient and related KMP algorithms : the Beginnings »

Voir aussi[modifier | modifier le code]

Articles connexes[modifier | modifier le code]

Liens externes[modifier | modifier le code]