Calcul de valeurs propres d'une matrice symétrique
Alors que la résolution d'un système linéaire passe par la détermination de l'unique solution à un système de la forme A.x = b, où A et b sont connus, on peut également être amené à résoudre des systèmes du type A.x = mx, où m est une constante qui constitue une inconnue supplémentaire du problème. En-dehors de la solution triviale x = 0, certaines valeurs de m (appelées valeurs propres) permettent de déterminer une famille de vecteurs x solution du système, appelés vecteurs propres.
La méthode la plus immédiate pour résoudre ce genre de systèmes consiste à résoudre le polynôme en m qui résulte de l'écriture du déterminant de (A-m.I). C'est pourtant loin d'être la solution la plus efficace dès que la taille de la matrice A augmente, d'autant plus que la détermination des zéros d'un polynôme de degré élevé présente également des difficultés. Là encore méthodes directes et itératives s'opposent, et on commencera cette fois par exposer ces dernières.
Méthode de la puissance
Permet de déterminer la plus grande valeur propre (en valeur
absolue) de la matrice A et le vecteur propre associé.
Partant d'un vecteur initial arbitraire x(0) dont
une composante est unitaire, on construit un vecteur intermédiaire y(1)
tel que A.x(0) = y(1),
puis on construit x(1) en "renormalisant" y(1)
de manière à ce que la composante choisie soit à nouveau égale à
l'unité. L'opération doit être répétée jusqu'à la convergence, en
changeant éventuellement de composante de référence si celle-ci
converge vers 0.
Le facteur de renormalisation converge vers la plus grande valeur
propre et x converge vers le vecteur propre associé, sous les
conditions que la plus grande valeur propre soit unique et que tous les
vecteurs propres soient indépendants. La vitesse de convergence est
proportionnelle au rapport entre les deux plus grandes valeurs propres
(en valeur absolue).
Considérons par exemple le système [[3 1][1 3]] et partons du vecteur [0 1]. Le premier vecteur intermédiaire est [[3 1][1 3]] .[0 1] = [1 3], que l'on renormalise en [1/3 1]. On a ensuite [[3 1][1 3]] . [1/3 1] = [2 10/3], que l'on renormalise en [3/5 1]. L'étape suivante donne [[3 1][1 3]] . [3/5 1] = [14/5 18/5], renormalisé en [7/9 1], etc ... La série ainsi construite converge effectivement vers le vecteur propre [1 1], et le facteur de renormalisation (successivement égal à 3, 3.33, 3.6 ...) converge vers la valeur propre 4.
Méthode de la puissance inverse
L'idée est de déterminer la plus grande valeur propre (en v.a)
de la matrice inverse A-1, dont l'inverse est la
plus petite valeur propre (toujours en v.a) de la matrice A.
Procédons comme pour la méthode de la puissance mais en remplaçant
évidemment A par A-1 lors de la construction de
la suite de vecteurs intermédiaires :
A-1.x(k) = y(k+1)
En multipliant cette équation par A on obtient :
A.A-1x(k) = A.y(k+1)
que l'on peut écrire A.y(k+1) = x(k),
système linéaire que l'on va résoudre à l'aide d'une décomposition LU.
Une fois que y(k+1) est déterminé, on procède
comme précédemment à une renormalisation pour calculer les itérés
suivants x(k+1), qui convergeront vers le
vecteur propre recherché ...
Méthode de la puissance avec décalage
Les valeurs propres d'une matrice A peuvent être décalées
d'une valeur s en soustrayant s.x au problème A.x = m.x. On obtient
(A-s.I).x = (m-s).x. Le décalage de A par s.I provoque un décalage
d'une quantité s de la valeur propre m, mais les vecteurs propres
restent inchangés. L'utilité de cette technique est triple :
- supposons qu'une matrice dont les deux valeurs propres, égales à 3 et
7, doivent être déterminées. En choisissant un décalage égal à 7, les
deux valeurs propres de la matrice décalée deviennent -4 et 0.
L'application de la méthode de la puissance permet de
déterminer la plus grande valeur propre (en v.a), à savoir -4. On en
déduit par décalage inverse que la plus petite valeur propre de la
matrice initiale est -4+7 = 3, et on obtient ainsi le même résultat
qu'avec la puissance inverse ...
- en choisissant un décalage inférieur à la plus grande vp,
on peut de la même manière déterminer des valeurs propres
intermédiaires.
- après plusieurs itérations de la méthode de la puissance, on peut
utiliser un décalage égal à l'approximation obtenue de la plus grande
valeur propre. La matrice décalée aura donc une plus petite valeur
propre proche de l'unité, et on convergera plus rapidement vers la
solution exacte en appliquant ensuite la méthode de la puissance
inverse.
Méthode directe
Les méthodes itératives ne permettent pas de résoudre des problèmes aux valeurs propres non-linéaires, c'est-à-dire définis par un problème de la forme A.X = B(m).x, où B(m) est une fonction non-linéaire de m. On doit alors passer par la résolution du polynôme caractéristique, mais ceci ne donne que les valeurs propres. On doit réinjecter ces dernières dans le système ou appliquer la méthode de la puissance inverse pour déterminer le vecteur propre associé.
Méthode QR
Contrairement aux méthodes présentées jusque ici, la méthode
QR permet de déterminer simultanément toutes les valeurs propres (mais
pas les vecteurs, encore une fois). Elle utilise le processus
d'orthonormalisation de Gram-Schmidt pour transformer la matrice A en
une matrice triangulaire similaire, dont les valeurs propres se
retrouvent sur la diagonale.
Prenons l'exemple de la matrice [[3 4][4 3]].
Les vecteurs colonne de A sont a1 = {3 4} et a2
= {4 3}.
On crée d'abord le vecteur q1 = a1
/ ||a1|| = {3/5 4/5}, puis on construit le
vecteur a'2 = a2 - (q1t.a2)q1
perpendiculaire à q1. Ici, a'2
= {28/25 -21/25}. La normalisation de a'2 donne
q2 = {28/35 -21/35}.
La matrice Q de la décomposition QR est constituée des vecteurs q1
et q2, donc Q = [[3/5 28/35][4/5
-21/35]]
La matrice R, pour sa part, est définie par rii
= ||a'i|| pour les termes diagonaux et par rij
= qit.aj
pour les termes extra-diagonaux, soit r11 = 5, r22
= 35/25 et r12 = 24/5. On peut vérifier que A =
Q.R ...
On utilise ensuite le fait que les produits QR et RQ donnent des
matrices similaires. En effet, si A = QR, alors Q-1A
= Q-1QR = R et Q-1AQ =
RQ.
A=QR et RQ ont donc des valeurs propres identiques, ce dont on peut
ensuite profiter en appliquant de nouveau le processus ci-dessus à la
matrice RQ. La matrice Q converge ainsi vers I, et les produits QR
successifs convergent vers une matrice triangulaire ...
Autres méthodes
La méthode QR est généralement considérée comme étant la plus
robuste et la plus performante pour déterminer l'ensemble des valeurs
propres d'une matrice quelconque. Des méthodes plus efficaces
permettent cependant de traiter les matrices "particulières". La
méthode de Jacobi permet par exemple de transformer de manière
itérative une matrice symétrique en une matrice diagonale. Les méthodes
de Given et de Householder réduisent pour leur part de manière directe
une matrice symétrique en une matrice tridiagonale, dont on pourra
ensuite résoudre l'équation caractéristique par des techniques
itératives.
La méthode de Householder peut cependant également être appliquée à une
matrice non-symétrique, que la réduction sous forme de matrice de
Hessenberg permettra de traiter ensuite par la méthode QR.
Equations et systèmes d'équations non-linéaires
Certaines méthodes de détermination des racines d'une équation
non-linéaire (ou d'un système) passent par un encadrement de ces
dernières, alors que d'autres conduisent à travailler sur un domaine
non-borné. On compte les méthodes de la bissection et de la regula
falsi au nombre des premières, et les méthodes du point fixe, de
Newton, de la sécante au nombre des secondes.
Quelques principes généraux peuvent être énoncés :
- le choix d'une approximation initiale influe considérablement sur la
rapidité de la convergence, voire sur la convergence elle-même
- les méthodes basées sur un domaine non-borné sont moins robustes car
elles ne garantissent pas une convergence aussi systématique que les
méthodes d'encadrement, mais quand elles convergent leur convergence
est généralement plus rapide
Bissection
Si l'on a deux valeurs a et b telles que f(a).f(b) < 0,
on calcule f((a+b)/2) et on modifie une des bornes de l'intervalle de
recherche en fonction du résultat obtenu. Exemple simplissime : f(x) =
(x-2). On part de a = 0 et b = 5. Comme f(a).f(b) < 0, on
calcule f((a+b)/2). Puisque f(a).f((a+b)/2) <0, la racine est
comprise entre a et (a+b)/2. Le processus doit être répété jusqu'à
l'obtention de la précision voulue.
La quantité |b-a|/|a+b| est une approximation de l'erreur relative. Si
L est la longueur de l'intervalle de recherche initial, la longueur
après n itérations est évidemment de L/2n. On
peut donc déterminer dès le début le nombre d'itérations nécessaire
pour obtenir une erreur absolue donnée.
La bissection échoue dans les cas suivants :
- un nombre pair de racines dans l'intervalle de recherche initial.
- une racine en laquelle la dérivée première s'annule (ex : f(x) = x2
en 0)
Regula falsi
Le choix qui consiste à calculer une nouvelle valeur de la
fonction au point milieu de l'intervalle de recherche dans la méthode
de la bissection n'est pas forcément le plus pertinent, en particulier
dans le cas où la valeur en l'une des bornes de l'intervalle est
beaucoup plus grande que la valeur en l'autre borne : |f(a)|
>> |f(b)|
On peut par exemple faire l'hypothèse que f est approchée par une
fonction g linéaire entre les points a et b :
g'(x) = [f(b)-f(a)] / (b-a)
La racine c de g est donnée par :
c = b - f(b)/g'(x)
On remplace ensuite comme dans la bissection l'une des deux bornes de
l'intervalle de recherche par c selon le signe de f(a).f(c) et de
f(b).f(c) ...
Méthode du point fixe
On transforme f(x) = 0 en g(x) = x, et on utilise l'itération xn+1 = g(xn). On peut étudier la convergence de cette méthode en faisant un développement de l'erreur. Soit en = xn - r l'erreur à l'itération n. On a
en+1 = g(r+en) - g(r) = g'(r)en + O(en2)
L'erreur à l'étape n+1 est donc directement proportionnelle à
l'étape à l'itération n, et ne pourra diminuer que si |g'(r)| <
1. La convergence est dans ce cas linéaire, sauf cas particuliers ou
les dérivées n-ièmes g(n)(r) sont nulles, auquel
cas la convergence est d'ordre n+1 (on rappelle que l'ordre de
convergence d'une méthode est p si l'on a |en+1|
= C |en|p + O(enp+1)
...).
Remarque : puisque e1 ~ g'(r)e0
et que e2 ~ g'(r)e1, on a
e2/e1 ~ e1/e0.
On peut donc gagner un ordre de convergence avec ce qui constitue
l'extrapolation d'Aitken (algo de Steffenson) : r ~ (x2x0
- x12)/(x2-2x1+x0),
ou plutôt, par souci de stabilité : r ~ x0 - (x1-x0)2/(x2-2x1+x0).
Méthode de Newton
xn+1 = xn - f(xn)/f '(xn)
C'est une méthode de point fixe particulière, avec g(x) = x -
f(x)/f '(x) ... Comme pour celle-ci, la méthode converge si
l'estimation initiale est suffisamment proche de la racine, mais la
convergence est ici quadratique (dans le cas de racines simples) car on
a en outre g'(r) = 0. Dans le cas de racines multiples, on peut
récupérer la convergence quadratique en remplaçant f par u = f / f '.
Toute racine multiple de f devient racine simple de u.
(Rappel : la convergence est dite quadratique - resp. d'ordre n - quand
l'erreur commise lors d'une itération est proportionnelle au carré -
resp. à la puissance nième - de l'erreur commise à l'itération
précédente)
Lorsque f est une fonction "simple", f ' peut être déterminée
analytiquement. En revanche, dans le cas général d'une fonction
non-linéaire la dérivée doit être approximée, par exemple selon
f '(x) = (f(x+e) - f(x)) / e
ce qui double le nombre d'évaluations de la fonction. Des erreurs
d'arrondi peuvent en outre apparaître si e est trop petit; alors que la
convergence peut être ralentie si e est trop grand.
Lorsque l'on a à résoudre un système d'équations, on adapte la méthode
précédente en remplaçant f '(xn) par la
matrice jacobienne Df(x) définie par Df(x)ij = dfi(x)/dxj
( il s'agit ici de "d rond"). Compte tenu du coût représenté par
l'évaluation de la dérivée (ou du jacobien), coût encore plus sensible
avec un système d'équations que dans le cas d'une équation unique, on
peut choisir de conserver la même valeur de f '(x), ou de Df(x)ij,
pendant plusieurs itérations. Cette méthode de Newton approchée voit
disparaître la convergence quadratique. On peut également (méthodes de
quasi-Newton) ne réaliser un calcul exact du jacobien que toutes les p
itérations, mais modifier (sans le recalculer exactement) ce dernier à
chaque itération.
Méthode de la sécante
On peut simplifier la méthode de Newton en remplaçant le
calcul de dérivée par l'approximation f '(xn) = (f(xn) - f(xn-1)) / (xn
-xn-1). Il faut fournir au départ deux valeurs
initiales : c'est un algorithme à deux pas.
On peut montrer que la convergence quadratique est perdue, mais qu'elle
demeure plus que linéaire. On a en fait |en+1| ~ C.|en|1,618.
On reconnaît dans l'exposant le nombre d'or (sqrt(5)+1)/2 ...
Il a été montré (Jeeves) que si l'effort calculatoire nécessaire pour
évaluer f ' est inférieur à 0.43 fois l'effort nécessaire à
l'évaluation de f alors la méthode de Newton est plus performante. Dans
le cas contraire la méthode de la sécante sera préférée.
Méthode de la corde
C'est une méthode de Newton approchée dans laquelle on évite
le calcul systématique de f '(xn) en
remplaçant cette dernière par f '(x0) à
chaque itération. La convergence est alors linéaire.
Dans le cas d'un système, cette méthode permet de ne réaliser qu'une
fois le coûteux calcul de jacobien, et si l'on peut faire une
décomposition LU ou LLt de D, on n'aura que deux
systèmes triangulaires à résoudre à chaque itération. Reste à savoir si
le gain en temps compense la perte en vitesse de convergence ...
Méthode de Muller
Alors que la méthode de la sécante consistait à approcher f par une fonction linéaire au voisinage de la racine, la méthode de Muller consiste à l'approcher localement par une fonction quadratique. Trois valeurs initiales sont donc nécessaires ... L'ordre de convergence de cette méthode est de 1.84, ce qui la situe donc entre les méthodes de la sécante (1.62) et de Newton (2). On estime généralement que le gain apporté par rapport à la méthode de la sécante ne justifie pas le surcoût calculatoire.
Détermination des zéros d'un polynôme
Les méthodes présentées ci-dessus peuvent être utilisées pour déterminer les racines d'un polynôme, mais le traitement des racines multiples peut se révéler problématique. On peut par exemple adapter la méthode de Newton, soit en tenant compte de la multiplicité m de la racine pour modifier l'itération de la manière suivante :
xn+1 = xn - m.f(xn)/f '(xn)
soit en étudiant la fonction modifiée u(x) = f(x) / f '(x). On montre aisément que la racine unique de u est également la racine multiple de f. L'application de la méthode de Newton à u(x) passe cependant par le calcul de f ''(x).
Lorsque les racines sont susceptibles d'être complexes, les méthodes basées sur les techniques d'encadrement sont mises en défaut, simplement parce que le signe de f(x) ne change pas forcément lorsque la racine est complexe. Les méthodes de Newton, de Muller ou de la sécante devront être adaptées à l'utilisation d'une arithmétique complexe.