Mat 367, Méthodes numériques

Bernard.Parisse@ujf-grenoble.fr

2016

La version HTML de ce document comporte des champs de saisie interactifs, ceux-ci apparaissent comme des commandes “mortes” dans la version PDF. La version HTML est optimisée pour le navigateur Firefox. Vous pouvez exécuter toutes les commandes interactives en cliquant sur le bouton Exécuter (attention cela peut prendre un certain temps!), le champ suivant est la console de l’interpréteur du logiciel de calcul formel.
Les commandes sont exécutées par la version javascript de Giac/Xcas. Bien que le thème de ce cours soit numérique, on verra sur de nombreuses commandes qu’il est fort utile de disposer d’un logiciel capable de faire du calcul formel!

Table des matières

Index

1  Présentation du module

Les thèmes abordés seront :

  1. calcul approché, représentation des données (flottants, vecteurs, matrices), erreurs (normes, de calcul, d’arrondi...).
  2. Pivot de Gauss, factorisation LU, conditionnement, Cholesky, factorisation QR.
  3. Interpolation polynômiale (évaluation, interpolation de Lagrange, Hermite, Bézier)
  4. Intégration numérique
  5. Méthode du point fixe, de Newton, méthodes itératives en algèbre linéaire
  6. Méthode de la puissance, valeurs propres et vecteurs propres.
  7. Résolution d’équations différentielles.

L’évaluation se fait sur :

Les calculatrices et les netbooks de taille d’écran plus petits que 13 pouces sont autorisées au DS et à l’examen final (prêt possible de netbooks pour le semestre).

2  Représentation des nombres et autres données, calcul exact/approché

Mot-clefs:
Types de base : entier machine, entier long, flottant machine et multiprécision (Base 2, base 10).
Erreur relative, erreur absolue, erreur d’arrondi, +/-, */%
Algorithme de Horner. Types composés : complexes, polynomes (représentation dense/creuse), symboles, listes (vecteurs, matrices), expressions, fonctions.
Les principaux ensembles de nombres en mathématiques sont les entiers positifs N\N et relatifs Z\Z, les rationnels Q\Q, les réels R\R et les complexes C\C. Sur ordinateur, on peut représenter ces nombres de manière exacte dans certains cas, approchée dans d’autres.

2.1  Représentation des entiers

Proposition 1   Division euclidienne de deux entiers : si aa et bb sont deux entiers, a0,b>0a \geq 0, b>0, il existe un unique couple (q,r)(q,r) tel que a=bq+r,r[0,b[ a = bq +r , \quad r \in [0, b[

Preuve : On prend pour qq le plus grand entier tel que abq0a-bq \geq 0.
Exemple :

La division euclidienne permet d’écrire un nombre entier, en utilisant une base bb et des caractères pour représenter les entiers entre 0 et b1b-1. Nous écrivons les nombres entiers en base b=10b=10 avec comme caractères les chiffres de 0 à 9. Les ordinateurs utilisent des circuits binaires pour stocker les informations, il est donc naturel d’y travailler en base 2 en utilisant comme caractères 0 et 1 ou en base 16 en utilisant comme caractères les chiffres de 0 à 9 et les lettres de A à F. En général, pour trouver l’écriture d’un nombre en base bb (par exemple b=2b=2), on effectue des divisions euclidienne successives par bb du nombre puis de ses quotients successifs jusqu’à ce que le quotient soit 0 et on accolle les restes obtenus (premier reste à droite, dernier reste à gauche). Inversement, pour retrouver un entier dd à partir de son écriture d n...d 0d_n...d_0, on traduit les divisions euclidiennes successives en d = (...((d nb+d n1)b+d n2)...+d 1)b+d 0 = d nb n+d n1b n1+...+d 0 \begin{matrix} d &=&( ... ((d_n b +d_{n-1})b + d_{n-2})...+d_1)b+d_0\\ &=& d_n b^n + d_{n-1} b^{n-1} + ... + d_0 \end{matrix} Par exemple, vingt-cinq s’écrit en base 16 0x19 car 25 divisé par 16 donne quotient 1, reste 9


En base 2, on trouverait 0b11001 car 25=2 4+2 3+125=2^4+2^3+1.


On peut effectuer les opérations arithmétiques de base (+,-,*, division) directement en base 2 (ou 16). Par exemple la table de l’addition est 0+0=0, 0+1=1+0=1 et 1+1=0 je retiens 1, donc :

  01001111
+ 01101011
----------
  10111010

Exercice : comment passe-t-on simplement de la représentation d’un nombre en base 2 à un nombre en base 16 et réciproquement ?

Les microprocesseurs peuvent effectuer directement les opérations arithmétiques de base sur les entiers “machine” (déclinés en plusieurs variantes selon la taille et la possibilité d’avoir un signe). Noter que la division de deux entiers aa et bb n’a pas la même signification que la division de deux réels, comme elle ne tomberait pas forcément juste, on calcule le quotient et le reste de la division euclidienne.

Ces entiers machines permettent de représenter de manière exacte des petits entiers relatifs par exemple un entier machine signé sur 4 octets est compris entre [2 31,2 311][-2^{31},2^{31}-1].

Ces entiers machines permettent de faire très rapidement du calcul exact sur les entiers, mais à condition qu’il n’y ait pas de dépassement de capacité, par exemple pour des entiers 32 bits, 2 30+2 30+2 30+2 302^{30}+2^{30}+2^{30}+2^{30} renverra 0. Ils sont utilisables avec tous les langages de programmation traditionnels.

Les logiciels de calcul formel et certains logiciels de programmation permettent de travailler avec des entiers de taille beaucoup plus grande, ainsi qu’avec des rationnels, permettant de faire du calcul exact, mais on paie cette exactitude par un temps de calcul plus long, de plus pas mal de méthodes numériques ne gagnent rien à faire des calculs intermédiaires exacts. Néanmoins, l’utilisation d’un logiciel de calcul formel permettra dans certains cas d’illustrer certains phénomènes dus au calcul approché.

2.2  Les réels

On se ramène d’abord au cas des réels positifs, en machine on garde traditionnellement un bit pour stocker le signe du réel à représenter.

2.2.1  Virgule fixe et flottante.

La première idée qui vient naturellement serait d’utiliser un entier et de déplacer la virgule d’un nombre fixe de position, ce qui revient à mulitplier par une puissance (négative) de la base. Par exemple en base 10 avec un décalage de 4, 1234.5678 serait représenté par 12345678 et 1.2345678 par 12345 (on passe de l’entier au réel par multiplication par 10 410^{-4}. L’inconvénient d’une telle représentation est qu’on ne peut pas représenter des réels grands ou petits, comme par exemple le nombre d’Avogadro, la constante de Planck, etc.

D’où l’idée de ne pas fixer la position de la virgule, on parle alors de représentation à virgule flottante ou de nombre flottant : on représente un nombre par deux entier, l’un appelé mantisse reprend les chiffres significatifs du réel sans virgule, l’autre l’exposant, donne la position de la virgule. Attention, le séparateur est un point et non une virgule dans la grande majorité des logiciels scientifiques. On sépare traditionnellement la mantisse de l’exposant par la lettre e. Par exemple 1234.5678 peut être représenté par 12345678e-8 (mantisse 12345678, exposant -8) mais aussi par 1234567800e-10.

Naturellement, sur un ordinateur, il y a des limites pour les entiers représentant la mantisse mm et l’exposant ee. Si on écrit les nombres en base bb, la mantisse mm s’écrira avec un nombre nn fixé de chiffres (ou de bits en base 2), donc m[0,b n[m \in [0,b^n[. Soit un réel xx représenté par x=mb e,m[0,b n[ x=mb^e, \quad m \in [0,b^n[ Si m[0,b n1[m\in [0,b^{n-1}[, alors on peut aussi écrire x=mb e1x=m' b^{e-1} avec m=mb[0,b n[m'=mb \in [0,b^n[, quelle écriture faut-il choisir? Intuitivement, on sent qu’il vaut mieux prendre mm' le plus grand possible, car cela augmente le nombre de chiffres significatifs (alors que des 0 au début de mm ne sont pas significatifs). Ceci est confirmé par le calcul de l’erreur d’arrondi pour représenter un réel. En effet, si xx est un réel non nul, il ne s’écrit pas forcément sous la forme mb emb^e, on doit l’arrondir, par exemple au plus proche réel de la forme mb emb^e. La distance de xx à ce réel est inférieure ou égale à la moitié de la distance entre deux flottants consécutifs, mb emb^e et (m+1)b e(m+1)b^e, donc l’erreur d’arrondi est inférieure ou égale à b e/2b^e/2. Si on divise par xmb ex \geq mb^e, on obtient une erreur relative d’arrondi majorée par 1/(2m)1/(2m). On a donc intérêt à prendre mm le plus grand possible pour minimiser cette erreur. Quitte à mulitplier par bb, on peut toujours se ramener (sauf exceptions, cf. ci-dessous), à m[b n1,b n[m \in [b^{n-1},b^n[, on a alors une erreur d’arrondi relative majorée par 12b n1 \frac{1}{2b^{n-1}}

On appelle flottant normalisé un flottant tel que m[b n1,b n[m \in [b^{n-1},b^n[. Pour écrire un réel sous forme de flottant normalisé, on écrit le réel en base bb, et on déplace la virgule pour avoir exactement nn chiffres non nuls avant la virgule et on arrondit (par exemple au plus proche). L’exposant est égal au décalage effectué. Notez qu’en base 2, un flottant normalisé commence forcément par 1, ce qui permet d’économiser un bit dans le stockage.

Ainsi, l’erreur d’arrondi commise lorsqu’on représente un réel (connu exactement) par un double normalisé est une erreur relative inférieure à de 2 532^{-53} (b=2b=2 et n=52+1n=52+1 pour les doubles).

Exemples :

Il existe une exception à la possibilité de normaliser les flottants, lorsqu’on atteint la limite inférieure de l’exposant ee. Soit en effet e me_m le plus petit exposant des flottants normalisés et considérons les flottants x=b e m(1+1/b)x=b^{e_m}(1+1/b) et y=b e my=b^{e_m}. Ces flottants sont distincts, mais leur différence n’est plus représentable par un flottant normalisé. Comme on ne souhaite pas représenter xyx-y par 0, (puisque le test x==yx==y renvoie faux), on introduit les flottants dénormalisés , il s’agit de flottants dont l’exposant est l’exposant minimal représentable sur machine et dont la mantisse appartient à [0,b n1[[0,b^{n-1}[. Par exemple 0 est représenté par un flottant dénormalisé de mantisse 0 (en fait 0 a deux reprśentation, une de signe positif et une de signe négatif).

Enfin, on utilise traditionnellement une valeur de l’exposant pour représenter les nombres plus grands que le plus grand réel reprśentable sur machine (traditionnellement appelé plus ou moins infini) et les erreurs (par exemple 0./0. ou racine carrée d’un nombre réel négatif, traditionnellement appelé NaN, Not a Number).

Exercice : quels sont les nombres réels représentables exactement en base 10 mais pas en base 2 ? Si on écrit 1/101/10 en base 2 avec 53 bits de précision, puis que l’on arrondit avec 64 bits de précision, ou si on écrit 1/101/10 en base 2 avec 64 bits de précision, obtient-on la même chose ?

Les ordinateurs reprśentent généralement les flottants en base 2 (cf. la section suivante pour plus de précisions), mais cette représentation n’est pas utilisée habituellement par les humains, qui préfèrent compter en base 10. Les ordinateurs effectuent donc la conversion dans les routines d’entrée-sortie. Le format standard utilisé pour saisir ou afficher un nombre flottant dans un logiciel scientifique est composé d’un nombre à virgule flottante utilisant le point comme séparateur décimal (et non la virgule) suivi si nécessaire de la lettre e puis de l’exposant, par exemple 1.23e-5 ou 0.0000123. Dans les logiciels de calcul formel, pour distinguer un entiers représentés par un entier d’un entier représenté par un flottant on écrit l’entier suivi de .0 par exemple 23.0.

Remarque :
Les microprocesseurs ayant un mode BCD peuvent avoir un format de représentation des flottants en base 10, les nombres décimaux comme par exemple 0.3 peuvent être représentés exactement. Certains logiciels, notamment maple, utilisent par défaut des flottants logiciels en base 10 sur des microprocesseurs sans mode BCD, ce qui entraine une baisse de rapidité importante pour les calculs numériques (on peut partiellement améliorer les performances en utilisant evalhf en maple).

2.2.2  Les flottants au format double

Cette section développe les notions de la section précédente pour les flottants machine selon la norme IEEE-754, utilisables dans les langage de programmation usuels, elle peut être omise en première lecture. La représentation d’un double en mémoire se compose de 3 parties : le bit de signe s=±1s=\pm 1 sur 1 bit, la mantisse M[0,2 52[M \in [0,2^{52}[ sur 52 bits, et l’exposant e[0,2 11[e \in [0, 2^{11}[ sur 11 bits. Pour les nombres “normaux”, l’exposant est en fait compris entre 1 et 2 1122^{11}-2, le nombre représenté est le rationnel (1+M2 52)2 e+12 10 (1+\frac{M}{2^{52}}) 2^{e+1-2^{10}} Pour écrire un nombre sous cette forme, il faut d’abord chercher par quel multiple de 2 il faut le diviser pour obtenir un réel rr dans [1,2[[1,2[, ce qui permet de déterminer l’exposant ee. Ensuite on écrit la représentation en base 2 de r1[0,1[r-1 \in [0,1[. Exemples :

On observe que la représentation en base 2 de 6.4 a du être arrondie (car elle est infinie en base 2) bien qu’elle soit exacte (finie) en base 10. Seuls les entiers et les rationnels dont le dénominateur est une puissance de 2 peuvent être représentés exactement. Ceci entraine des résultats qui peuvent surprendre comme par exemple le fait que 0.5 - 5*0.1 n’est pas nul.

Des représentations spéciales (avec e=0e=0 ou e=2 111e=2^{11}-1) ont été introduites pour représenter ±\pm \infty (pour les flottants plus grands en valeur absolue que le plus grand flottant représentable), et pour représenter les nombres non nuls plus petits que le plus petit flottant représentable de la manière exposée ci-dessus (on parle de flottants dénormalisés), ainsi que le nombre NaN (Not a Number) lorsqu’une opération a un résultat indéfini (par exemple 0/0).

Remarque : Sur les processeurs compatibles avec les i386, le coprocesseur arithmétique i387 gère en interne des flottants avec 80 bits dont 64 bits de mantisse. Sur les architectures 64 bits (x86 ou AMD), le jeu d’instruction SSE permet de travailler avec des flottants de 128 bits. Le compilateur gcc permet d’utiliser ces flottants longs avec le type long double ou les types __float80 et __float128 en utilisant un drapeau de compilation du type -msse

2.2.3  Opérations sur les flottants

Les opérations arithmétiques de base sur les flottants se font de la manière suivante :

2.2.4  Erreurs

La représentation des nombres réels par des doubles présente des avantages, les opérations arithmétiques sont faites au plus vite par le microprocesseur. Les coprocesseurs arithmétiques (intégrés sur les microprocesseurs de PC) proposent même le calcul des fonctions usuelles (trigonométriques, racine carrée, log et exp) sur le type double et utilisent des formats de représentation interne ayant plus de 64 bits pour les doubles, ce qui permet de limiter les erreurs d’arrondi. Par contre, des erreurs vont être introduites, on parle de calcul approché par opposition au calcul exact sur les rationnels. En effet, la représentation doit d’abord arrondir tout réel qui n’est pas un rationnel dont le dénominateur est une puissance de 2. Ensuite chaque opération va entrainer une propagation de ces erreurs et va y ajouter une erreur d’arrondi sur le résultat. Enfin, l’utilisation du type double peut provoquer un dépassement de capacité (par exemple 100!*100!).

Pour diminuer ces erreurs et les risques de dépassement de capacité, il existe des types flottants multiple précision, qui permettent de travailler avec un nombre fixé à l’avance de décimales et une plage d’exposants plus grande. Les calculs sont plus longs mais les erreurs plus faibles. Attention, il s’agit toujours de calcul approché! De plus, pour des quantités dont la valeur est déterminée de manière expérimentale, la source principale de propagation d’erreurs est la précision des quantités initiales, il ne sert souvent à rien d’utiliser des types flottants multiprécision car les erreurs dus à la représentation (double) sont négligeables devant les erreurs de mesure. Dans ce cas, il est pertinent lorsqu’on évalue f(x)f(x) avec xx mal connu de calculer aussi f(x)f'(x), en effet : f(x(1+h))=f(x)+xhf(x)+O(h 2)f(x(1+h))= f(x)+xh f'(x) + O(h^2) l’erreur relative sur f(x)f(x) est donc au premier ordre multipliée par |xf(x)f(x)||\frac{xf'(x)}{f(x)}| Par exemple, l’erreur relative sur e xe^x est au premier ordre l’erreur relative sur xx multipliée par |x||x|.


2.2.5  Erreur absolue, relative, arrondi propagation des erreurs.

On a vu précédemment que pour représenter un réel, on devait l’arrondir, ce qui introduit une erreur même si le réel est connu exactement (par exemple 1/10). Voyons comment se propagent les erreurs dans les opérations arithmétiques de base : on distingue l’addition, la multiplication et l’inversion. La soustraction se ramène à l’addition car le calcul de l’opposé n’introduit aucune erreur nouvelle. Pour l’addition, si |xx 0|ε 0|x -x_0| \leq \varepsilon_0 et si |yy 0|ε 1|y-y_0| \leq \varepsilon_1 alors par l’inégalité triangulaire (|a+b||a|+|b||a+b|\leq |a|+|b|), on a : |(x+y)(x 0+y 0)||xx 0|+|yy 0|ε 0+ε 1 |(x+y)-(x_0+y_0)| \leq |x-x_0| + | y-y_0 | \leq \varepsilon_0 + \varepsilon_1 on dit que les erreurs absolues s’additionnent.

Définition 1   L’erreur absolue est définie comme un majorant de la valeur absolue de la différence entre le nombre réel et son représentant double : |xx 0|ε |x-x_0| \leq \varepsilon

Mais comme il faut représenter x 0+y 0x_0+y_0 en machine, on doit ajouter une erreur d’arrondi, qui est proportionnelle à la valeur absolue de x 0+y 0x_0+y_0 d’où la notion d’erreur relative :

Définition 2   L’erreur relative est égale à l’erreur absolue divisée par la valeur absolue du nombre |xx 0|ε|x 0| |x-x_0| \leq \varepsilon |x_0|

Remarquons au passage que les erreurs de mesure expérimentales sont pratiquement toujours des erreurs relatives.

Donc lorsqu’on effectue une addition (ou une soustraction) de deux réels sur machine, on doit additionner les deux erreurs absolues sur les opérandes et ajouter une erreur d’arrondi (relative de 2 532^{-53}, à titre d’exercice, on pourra vérifier que cette erreur d’arrondi est majorée par l’erreur absolue de la somme x+yx+y dès l’instant où xx et yy ont eux-même une erreur d’arrondi).

Lorsqu’on effectue une multiplication de deux nombres x,yx,y dont les représentants x 0,y 0x_0,y_0 sont non nuls, on a |xyx 0y 0x 0y 0|=|xx 0yy 01|=|(xx 01)(yy 01)+(xx 01)+(yy 01)| \left| \frac{xy-x_0 y_0}{x_0 y_0} \right| = \left| \frac{x}{x_0} \frac{y}{y_0} -1 \right| = \left| (\frac{x}{x_0}-1)(\frac{y}{y_0} -1)+(\frac{x}{x_0}-1)+(\frac{y}{y_0} -1) \right| l’erreur relative est donc la somme des erreurs relatives et du produit des erreurs relatives (on peut souvent négliger le produit devant la somme). Il faut aussi y ajouter une erreur relative d’arrondi de 2 532^{-53} sur x 0y 0x_0 y_0.

On observe que la multiplication est une opération posant moins de problèmes que l’addition, car on manipule toujours des erreurs relatives, par exemple si l’erreur relative sur deux doubles xx et yy non nuls est de 2 532^{-53}, alors l’erreur relative sur xyxy sera de 2 53+2 53+2 106+2 533×2 53 2^{-53} + 2^{-53} + 2^{-106} + 2^{-53} \approx 3 \times 2^{-53} Lorsque l’erreur relative sur les données est grande devant 2 532^{-53}, l’erreur relative d’arrondi final est négligeable, on peut alors dire que les erreurs relatives s’additionnent pour un produit (c’est aussi vrai pour un quotient: exercice!). Par contre, si on additionne deux nombres dont le représentant de la somme est proche de 0, la somme des erreurs absolues peut devenir non négligeable par rapport à la somme des représentants, entrainant une erreur relative très grande. Par exemple si xx est représenté par x 0=1+2 52x_0=1+2^{-52} avec une erreur d’arrondi de 2 532^{-53} et yy par y 0=1y_0=-1 avec la même erreur d’arrondi, l’addition de xx et yy renvoie 2 522^{-52} avec une erreur absolue de 2*2 532 * 2^{-53} (ici il n’y a pas d’arrondi lorsqu’on fait la somme). C’est une erreur relative de 11 (qui domine largement l’erreur d’arrondi) ce qui signifie que dans la mantisse, seul le premier bit sur les 52 a un sens, la perte de précision est très grande.

Une autre conséquence importante est que l’addition de réels sur machine n’est pas une opération associative, par exemple (2.0 53+2.0 53)+1.01+2 52 (2.0^{-53}+2.0^{-53})+1.0 \rightarrow 1+2^{-52} alors que 2.0 53+(2.0 53+1.0)1 2.0^{-53}+(2.0^{-53}+1.0) \rightarrow 1 Dans Xcas, il n’y a que 48 bits de mantisse :

Si on a plusieurs termes à additionner, il faut commencer par additionner entre eux les termes les plus petits, pour que les petits termes ne soient pas absorbés un à un dans les erreurs d’arrondi (les petits ruisseaux font les grands fleuves).

Exercice : pour calculer la valeur numérique d’une dérivée de fonction, il vaut mieux calculer (f(x+h)f(xh))/(2h)(f(x+h)-f(x-h))/(2h) que (f(x+h)f(x))/h(f(x+h)-f(x))/h car le terme d’erreur est en O(h 2)O(h^2) et non en O(h)O(h). Attention toutefois à ne pas prendre hh trop petit, sinon x+h=xx+h=x en flottants et même si x+hxx+h \neq x, l’erreur absolue sur f(x+h)f(xh)f(x+h)-f(x-h) est (au moins) d’ordre ε|f(x)|\varepsilon |f(x)|, donc l’erreur relative est d’ordre ε/h|f(x)|\varepsilon/h |f(x)|. Par exemple pour h=1e-8 le reste est en O(h 2)O(h^2) donc de l’ordre des erreurs d’arrondi mais l’erreur relative sur f(x+h)f(xh)f(x+h)-f(x-h) est d’ordre ε/h\epsilon/h largement supérieure (en flottants double-précision). On choisira plutôt hh tel que ε/h\epsilon/h soit proche de h 2h^2, donc de l’ordre de 1e-5, qui fournira une valeur approchée avec une erreur relative de l’ordre de 1e-10. Exemple : calcul de la dérivée numérique de exp(sin(x))\exp(\sin(x)) en x=1x=1

Remarquons néanmoins que les erreurs calculées ici sont des majorations des erreurs réelles (ou si on préfère l’erreur obtenue dans le pire des cas), statistiquement les erreurs sur les résultats sont moindres, par exemple si on effectue nn calculs susceptibles de provoquer des erreurs indépendantes suivant une même loi d’espérance nulle, la moyenne des erreurs divisée par l’écart-type de la loi tend vers une loi normale centrée réduite. De manière plus déterministe, on a l’inégalité de Bienaymé-Tchebyshev P(|X|>α)nσ 2α 2 P(|X|>\alpha) \leq \frac{n\sigma^2}{\alpha^2} XX est la variable aléatoire somme des nn erreurs, α\alpha l’erreur et nσ 2n\sigma^2 la variance de la somme nn erreurs supposées indépendantes, cette probabilité tend vers 0 pour nn grand si α\alpha est d’ordre nn, et ne tend pas vers 0 si α\alpha est de l’ordre de n\sqrt{n}. Exemple : somme de n=400n=400 nombres répartis sur [1,1][-1,1] selon la loi uniforme (représentant des erreurs), on divise par n=\sqrt{n}=20, on effectue plusieurs tirages (par exemple 500) on trace l’histogramme et on compare avec la loi normale de moyenne nulle (l’espérance de la somme) et d’écart-type celui de la loi uniforme.

Il est d’ailleurs souvent trop difficile de calculer une majoration rigoureuse de l’erreur pour des calculs sauf les plus simples. Lorsqu’on doute de la précision d’un calcul, un test peu couteux consiste à refaire ce calcul en utilisant des flottants en précision plus grande et tester si le résultat varie en fonction du nombre de chiffres significatifs utilisés, ou faire varier légèrement les données et observer la sensibilité du résultat. Si on veut travailler en toute rigueur sans pour autant calculer les erreurs à priori, il faut utiliser un logiciel utilisant des intervalles pour représenter les réels (section suivante)

2.3  L’arithmétique d’intervalle.

Certains systèmes de calcul formel peuvent manipuler directement des intervalles réels, par exemple par l’intermédiaire de la bibliothèque C MPFI. Les opérations arithmétiques sur des intervalles renvoient alors le meilleur intervalle possible contenant toutes les valeurs possibles lorsque les opérandes parcourent leurs intervalles respectifs. Exemple en Xcas (version 1.1.1 et ultérieures) : [-1..2]*[-1..2] renvoie [-2..4]. Attention ici on parcourt toutes les valeurs possibles de xy,x[1,2],y[1,2]xy, \ x \in [-1,2], y \in [-1,2]. Ce qui est différent du carré d’un intervalle ou plus généralement de l’évaluation d’un polynôme en un intervalle, horner(x^2,[-1..2]) renvoie ainsi [0..4].

Les fonctions disponibles sont souvent moins riches qu’en arithmétique flottante, le calcul d’une fonction non monotone sur un intervalle peut s’avérer délicat, alors que si la fonction est monotone, il suffit de calculer l’image des deux bornes de l’intervalle. Pour les polynômes, Xcas décompose les coefficients en deux parties P=P +P P=P_+-P_- en fonction du signe, puis utilise la monotonie de P +P_+ et P P_- sur R +\R^+ et R \R^- respectivement.

L’arithmétique d’intervalle dans C\C est beaucoup plus difficile à mettre en oeuvre puisqu’il n’y a plus d’ordre ni de monotonie, on doit alors s’en remettre à des estimations sur les parties réelles et imaginaires qui ne tiendront pas compte du phénomène ci-dessus sur la différence entre xy,x[1,2],y[1,2]xy, \ x \in [-1,2], y \in [-1,2] et x 2,x[1,2]x^2, \ x \in [-1,2].

2.4  Types composés.

Après les nombres réels, on passe aux nombres complexes : on utilise un couple (partie réelle, imaginaire) de fractions (exacts) ou de flottants et les règles habituelles sur les complexes.

On peut représenter les polynôme de la facon suivante :

Algorithmes de base sur les polynômes : l’évaluation en un point (Horner, cf. TD/TP), la multiplication et division euclidienne et le PGCD (même algorithme que pour les entiers mais avec la division euclidienne des polynômes, attention toutefois aux erreurs d’arrondis)

Les symboles ou noms de variable désignent par exemple le nom d’une inconnue dans un polynôme, ils sont représentés par une chaine de caractére et peuvent être affectés à une valeur pendant une session (la valeur dépend d’un contexte d’exécution et le remplacement du symbole par sa valeur affectée est appelé évaluation).

Les expressions, par exemple sin(x)+2*x^2, elles peuvent être représentées par des arbres. L’évaluation d’une expression consiste à remplacer les symboles de l’expression par leur valeur, puis à effectuer les opérations en tenant compte de la substitution. Il est parfois souhaitable de ne pas effectuer certaines opérations de substitution, on empêche l’évaluation, explicitement ('') ou implicitement (par exemple l’affectation n’évalue pas le symbole qu’on va affecter).

Les fonctions ne doivent pas être confondues avec les expressions, elles associent à leurs arguments une expression. Par exemple sin est une fonction, alors que sin(x) est une expression.

Les conteneurs contiennent plusieurs objets et permettent d’associer à un indice un objet. Il en existe de plusieurs types, par exemple les listes et les séquences dont l’indice est un entier compris entre 1 (ou 0) et la taille (-1), les tables dont l’indice est plus général, et les tableaux (utilisés pour les vecteurs, matrices) qui sont essentiellement des listes ou des listes de listes de même taille. Les séquences sont des listes d’objets ordonnés “non récursifs” (ils ne peuvent contenir des séquences), alors que les listes peuvent contenir des listes, sinon il n’y a pas de différences. Dans les logiciels de calcul formel, la plupart du temps les séquences se notent en indiquant les éléments séparés par des virgules. Les listes s’en distinguent par les délimiteurs []. Il faut prendre garde au fait qu’en général affecter par exemple l[1]:=3; à une variable libre l crée une table et non une liste. Remarque: certains logiciels accédent à certains types de conteneurs uniquement par référence (par exemple maple pour les vecteurs et matrices), dans ce dernier cas une seule copie des objets du conteneur existe si on copie de la manière habituelle une variable contenant un vecteur ou une matrice dans une autre variable, la modification d’un élément du conteneur modifie alors toutes les copies pointant sur ce conteneur. Cette méthode est plus efficace mais peut être surprenante.

3  Algèbre linéaire

3.1  Le pivot de Gauss

Cet algorithme permet de créer des zéros en effectuant des manipulations réversibles sur les lignes d’une matrice. Ces lignes peuvent représenter les coefficients d’un système linéaire, on obtient alors un système linéaire équivalent, ou les coordonnées d’un système de vecteur, on obtient alors les coordonnées d’un système de vecteur engendrant le même sous-espace vectoriel. On peut également représenter 2 matrices AA et BB reliés par une relation Ax=BAx=B, cette relation reste alors vraie au cours et donc après la réduction.

3.1.1  L’algorithme

L’algorithme est le suivant:

  1. on initialise c=1c=1 et l=1l=1, cc désigne le numéro de colonne cc à réduire, et ll le numéro de ligne à partir duquel on cherche un “pivot” (au début ll et cc valent donc 1, en général les 2 augmentent de 1 à chaque itération)
  2. Si cc ou ll est plus grand que le nombre de colonnes ou de lignes on arrête.
  3. Si la colonne cc n’a que des coefficients nuls à partir de la ligne ll, on incrémente le numéro de colonne cc de 1 et on passe à l’étape 2. Sinon, on cherche la ligne dont le coefficient est en valeur absolue le plus grand possible (en calcul approché) ou le plus simple possible (en calcul exact), on échange cette ligne avec la ligne ll. Puis on effectue pour toutes les lignes sauf ll ou pour toutes les lignes à partir de l+1l+1 (selon qu’il s’agit d’une réduction de Gauss complète ou d’une réduction de Gauss sous-diagonale) la manipulation réversible L jL ja jca lcL l L_j \leftarrow L_j -\frac{a_{jc}}{a_{lc}} L_l On incrémente cc et ll de 1 et on passe à l’étape 2.

3.1.2  Efficacité de l’algorithme

Si la matrice possède LL lignes et CC colonnes, le nombre maximal d’opérations pour réduire une ligne est CC opérations (une opération=1 multiplication + 1 soustraction, en calculant une seule fois le quotient). Si on a déjà réduit k1k-1 colonnes, ce nombre est en fait C(k1)C-(k-1) puisqu’on ne calcule pas les 0 des colonnes déjà réduites. Il y a L1L-1 lignes à réduire à chaque étape et min(L,C)(L,C) étapes à effectuer, on en déduit que le nombre maximal d’opérations pour réduire une matrice est (L1) k=1 min(L,C)(C(k1))(L-1)\sum_{k=1}^{\mbox{min}(L,C)}(C-(k-1)). Pour une matrice carrée de taille nn, cela fait (n1) k=1 n(n(k1))=n 3/2+O(n 2)(n-1) \sum_{k=1}^n (n-(k-1)) =n^3/2+O(n^2) opérations.

Si on effectue une réduction en-dessous de la diagonale, toujours pour une matrice carrée, on trouve k=1 n(n(k1))(nk)=n 3/3+O(n 2)\sum_{k=1}^n (n-(k-1))(n-k)=n^3/3+O(n^2).

3.1.3  Erreurs d’arrondis du pivot de Gauss

Comme |a jc||a lc||a_{jc}| \leq |a_{lc}|, une étape de réduction multiplie au plus l’erreur absolue des coefficients par 2. Donc la réduction complète d’une matrice peut multiplier au pire l’erreur absolue sur les coefficients par 2 n2^n (où nn est le nombre d’étapes de réduction, inférieur au plus petit du nombre de lignes et de colonnes). Ceci signifie qu’avec la précision d’un double, on peut au pire perdre toute précision pour des matrices pas si grandes que ça (n=52n=52). Heureusement, il semble qu’en pratique, l’erreur absolue ne soit que très rarement multipliée par un facteur supérieur à 10, par exemple si on multiplie une matrice n,nn,n à coefficients flottants aléatoires dans [0,1][0,1] selon la loi uniforme par son inverse, on trouve une erreur absolue très faible même pour des valeurs de nn largement plus grandes que 100.

Par contre, si on ne prend pas la précaution de choisir le pivot de norme maximale dans la colonne, les erreurs d’arrondis se comportent de manière bien moins bonnes, comme le montre l’ :
Exemple
Soit à résoudre le système linéaire εx+1.0y=1.0,x+2.0y=3.0 \epsilon x + 1.0 y = 1.0 , \quad x + 2.0 y = 3.0 avec ε=2 54\epsilon =2^{-54} (pour une machine utilisant des doubles pour les calculs en flottant, plus généralement on choisira ε\epsilon tel que (1.0+3ε)1.0(1.0+3\epsilon)-1.0 soit indistinguable de 0.0).
Si on résoud le système exactement, on obtient x=1/(12ε)x=1/(1-2\epsilon) (environ 1) et y=(13ε)/(12ε)y=(1-3\epsilon)/(1-2\epsilon) (environ 1). Supposons que l’on n’utilise pas la stratégie du pivot partiel, on prend alors comme pivot ε\epsilon, donc on effectue la manipulation de ligne L 2L 21/εL 1L_2 \leftarrow L_2 - 1/\epsilon L_1 ce qui donne comme 2ème équation (2.01.0/ε)y=3.01.0/ε(2.0-1.0/\epsilon)y=3.0-1.0/\epsilon. Comme les calculs sont numériques, et à cause des erreurs d’arrondis, cette 2ème équation sera remplacée par (1.0/ε)y=1.0/ε(-1.0/\epsilon)y=-1.0/\epsilon d’où y=1.0y=1.0, qui sera remplacé dans la 1ère équation, donnant εx=1.01.0y=0.0\epsilon x = 1.0-1.0y=0.0 donc x=0.0x=0.0.
Inversement, si on utilise la stratégie du pivot partiel, alors on doit échanger les 2 équations L 2=L 1L_2'=L_1 et L 1=L 2L_1'=L_2 puis on effectue L 2L 2εL 1L_2 \leftarrow L_2' - \epsilon L_1', ce qui donne (1.02.0ε)y=1.03.0ε(1.0-2.0\epsilon) y = 1.0 - 3.0 \epsilon , remplacée en raison des erreurs d’arrondi par 1.0*y=1.01.0*y=1.0 donc y=1.0y=1.0, puis on remplace yy dans L 1L_1' ce qui donne x=3.02.0y=1.0x=3.0-2.0y=1.0.
On observe dans les deux cas que la valeur de yy est proche de la valeur exacte, mais la valeur de xx dans le premier cas est grossièrement eloignée de la valeur correcte.

On peut aussi s’intéresser à la sensibilité de la solution d’un système linéaire à des variations de son second membre. Cela fait intervenir le nombre de conditionnement de la matrice AA (voir plus bas) du système (qui est essentiellement la valeur absolue du rapport de la valeur propre la plus grande sur la valeur propre la plus petite), plus ce nombre est grand, plus la solution variera (donc plus on perd en précision).

3.2  Applications de Gauss

3.2.1  Base d’un sous-espace

On réduit la matrice des vecteurs écrits en ligne, puis on prend les lignes non nulles, dont les vecteurs forment une base du sous-espace vectoriel engendré par les vecteurs du départ.

Exemple : base du sous-espac engendré par (1,2,3),(4,5,6),(7,8,9)(1,2,3), (4,5,6), (7,8,9). On réduit la matrice, la 3ème ligne est nulle donc on ne garde que les 2 premières lignes (1,0,1),(0,1,2)(1,0,-1), (0,1,2) (remarque: une réduction sous-diagonale aurait suffi).

3.2.2  Déterminant

On réduit la matrice (carrée) en notant le nombre d’inversions de ligne, et on fait le produit des coefficients diagonaux, on change le signe si le nombre d’inversions de lignes est impair.

3.2.3  Réduction sous forme échelonnée (rref)

On réduit la matrice puis on divise chaque ligne par son premier coefficient non nul. Si la matrice représentait un système linéaire inversible on obtient la matrice identité sur les colonnes sauf la dernière et la solution en lisant la dernière colonne. La relation conservée est en effet Ax=bAx=bxx est la solution de l’équation, et à la fin de la réduction A=IA=I.

Par exemple pour résoudre le système {x+2y+3z = 5 4x+5y+6z = 0 7x+8y = 1 \left\{ \begin{array}{ccc} x + 2y + 3z &=& 5 \\ 4x + 5y + 6z &=& 0 \\ 7x + 8y &=& 1 \end{array} \right. on réduit sous forme échelonnée la matrice
ce qui donne [[1,0,0,-9],[0,1,0,8],[0,0,1,-2/3]], d’où la solution x=9,y=8,z=2/3x=-9, y=8, z=-2/3.

3.2.4  Inverse

On accolle la matrice identité à droite de la matrice à inverser. On effectue la réduction sous forme échelonnée, on doit obtenir à droite l’identité si la matrice est inversible, on a alors à gauche la matrice inverse. La relation conservée est en effet Ax=BA x=Bxx est l’inverse de la matrice de départ, et en fin de réduction A=IA=I.

Par exemple, pour calculer l’inverse de [[1,2,3],[4,5,6],[7,8,0]], on réduit :

3.2.5  Noyau

On réduit la matrice sous forme échelonnée. Puis on introduit des lignes de 0 afin que les 1 en tête de ligne se trouvent sur la diagonale de la matrice. On enlève ou on rajoute des lignes de 0 à la fin pour obtenir une matrice carrée. Une base du noyau est alors formée en prenant chaque colonne correspondant à un 0 sur la diagonale, en remplaçant ce 0 par -1. On vérifie qu’on obtient bien 0 en faisant le produit de ce vecteur par la matrice réduite. De plus les vecteurs créés sont clairement linéairement indépendants (puisqu’ils sont échelonnés), et il y en a le bon nombre (théorème noyau-image).

Exemple : calcul du noyau de [[1,2,3,4],[1,2,7,12]], on réduit la matrice avec rref, ce qui donne [[1,2,0,-2],[0,0,1,2]], on ajoute une ligne de 0 entre ces 2 lignes pour mettre le 1 de la 2ème ligne sur la diagonale ce qui donne [[1,2,0,-2],[0,0,0,0],[0,0,1,2]], puis on ajoute une ligne de 0 à la fin pour rendre la matrice carrée. On obtient ainsi le système équivalent de matrice :
[[1,2,0,-2],[0,0,0,0],[0,0,1,2],[0,0,0,0]]
La 2ème colonne donne le premier vecteur de la base du noyau, (2,1,0,0)(2,-1,0,0), la 4ème colonne donne le deuxième vecteur (2,0,2,1)(-2,0,2,-1), on vérifie aisément que ces 2 vecteurs forment une famille libre du noyau, donc une base car la dimension du noyau est égale à 2 (dimension de l’espace de départ moins le rang de la matrice, c’est-à-dire le nombre de lignes non nulles de la matrice réduite).

3.3  La méthode de factorisation LULU

Dans sa forme la plus simple, elle permet d’écrire une matrice AA comme produit de deux matrices triangulaire inférieures et supérieures, ce qui ramène la résolution de système à la résolution de deux systèmes triangulaires. Pour tenir compte d’éléments diagonaux nuls et pour optimiser les erreurs d’arrondi, il est nécessaire d’effectuer des permutations sur les lignes de la matrice.

3.3.1  Interprétation matricielle du pivot de Gauss

On notera ll et cc le nombre de lignes et colonnes de AA (pour éviter la confusion avec le facteur LL) et on supposera AA non singulière pour simplifier l’exposition.

Lorsqu’on réduit la colonne jj d’une matrice A˜\tilde{A} (partiellement réduite) à partir de la ligne j+1j+1 (en supposant A˜ j,j0\tilde{A}_{j,j} \neq 0), cela revient à multiplier A˜\tilde{A} à gauche par une matrice L˜ j\tilde{L}_j créée en partant de la matrice identité de taille ll où on remplace les 0 colonne jj, lignes j+1j+1 à ll par le coefficient de la combinaison de ligne effectuée : l il iA˜ i,jA˜ j,jl jl_i \rightarrow l_i - \frac{\tilde{A}_{i,j}}{\tilde{A}_{j,j}} l_j donc : L˜ j=(1 ... 0 0 0 ... 0 ... ... ... ... ... ... 0 0 ... 1 0 ... ... 0 0 ... 0 1 ... ... 0 0 ... 0 A˜ j+1,jA˜ j,j 1 ... 0 0 ... 0 .... 0 ... 0 0 ... 0 A˜ l,jA˜ j,j 0 ... 1 ) \tilde{L}_j = \left( \begin{array}{ccccccc} 1 & ... & 0 & 0 & 0 & ... & 0\\ ...& ... & ... & ... & ... & ... & 0\\ 0 & ... & 1 & 0 & ... & ... & 0\\ 0 & ... & 0 & 1 & ... & ... & 0 \\ 0 & ... & 0 & - \frac{\tilde{A}_{j+1,j}}{\tilde{A}_{j,j}} & 1 & ... & 0 \\ 0 & ... & 0 & .... & 0 & ... & 0 \\ 0 & ... & 0 & - \frac{\tilde{A}_{l,j}}{\tilde{A}_{j,j}} & 0 & ... & 1\\ \end{array} \right) On vérifie facilement que l’inverse de cette matrice est L j=L˜ j 1=(1 ... 0 0 0 ... 0 ... ... ... ... ... ... 0 0 ... 1 0 ... ... 0 0 ... 0 1 ... ... 0 0 ... 0 A˜ j+1,jA˜ j,j 1 ... 0 0 ... 0 .... 0 ... 0 0 ... 0 A˜ l,jA˜ j,j 0 ... 1 ) L_j = \tilde{L}_j^{-1} = \left( \begin{array}{ccccccc} 1 & ... & 0 & 0 & 0 & ... & 0\\ ...& ... & ... & ... & ... & ... & 0\\ 0 & ... & 1 & 0 & ... & ... & 0\\ 0 & ... & 0 & 1 & ... & ... & 0 \\ 0 & ... & 0 & \frac{\tilde{A}_{j+1,j}}{\tilde{A}_{j,j}} & 1 & ... & 0 \\ 0 & ... & 0 & .... & 0 & ... & 0 \\ 0 & ... & 0 & \frac{\tilde{A}_{l,j}}{\tilde{A}_{j,j}} & 0 & ... & 1\\ \end{array} \right) Donc AA est le produit des matrices L jL_j par une matrice réduite UU qui est triangulaire supérieure A=L 1...L l1U A= L_1...L_{l-1} U On vérifie ensuite que le produit des matrices L 1...L l1L_1...L_{l-1} revient à remplacer les coefficients de la colonne jj sous la diagonale par ceux de L jL_j, ce qui donne une matrice LL triangulaire inférieure (avec des 1 sur la diagonale). Pour l’obtenir il suffit au cours de l’algorithme de réduction sous-diagonale du pivot de Gauss de stocker le coefficient de la combinaison linéaire dans une matrice initialisée à la matrice identité (on peut aussi le faire en place dans la matrice á réduire).

Attention, le produit L˜ l1...L˜ 1\tilde{L}_{l-1}...\tilde{L}_1 ne s’obtient pas en copiant la colonne jj de L˜ j\tilde{L}_j pour jj variant de 1 à l1l-1! On peut l’obtenir en faisant une réduction sous-diagonale de la matrice bloc obtenue en collant AA avec la matrice identité ayant ll lignes.

3.3.2  Factorisation PA=LUPA=LU

Si on veut mettre en oeuvre la stratégie du pivot partiel (ou en calcul exact si un coefficient diagonal est nul), il est nécessaire d’intervertir une ligne de la matrice partiellement réduite avec une ligne en-dessous. Cela revient à réduire la matrice AA de départ après échange de ces mêmes lignes. En conséquence ce n’est pas AA qui est le produit LULU mais une matrice obtenue par permutations de lignes de AA, que l’on peut écrire comme produit à gauche de AA par une matrice de permutation PP.

Remarque : si à une étape de réduction, tous les coefficients de la colonne jj à partir de la ligne jj sont nuls, on peut simplement ignorer cette colonne, on remplit la colonne jj de la matrice L jL_j avec la colonne j+1j+1 de AA à partir de la ligne jj.

3.3.3  Applications

On peut résoudre des systèmes linéaires par la factorisation LULU. En effet soit à résoudre Ax=bAx=b. On effectue la permutation de lignes sur AA et bb (correspondant à la matrice de permutation PP), ce qui donne PAx=Pb=LUxPAx=Pb=LUx, puis on résoud Ly=PbLy=Pb (système triangulaire inférieur), puis on résoud Ux=yUx=y (système triangulaire supérieur).

Comparaison avec la réduction complète sous forme échelonnée de (A|b)(A|b) :

On peut inverser une matrice en utilisant la décomposition LULU. Supposons pour simplifier que la permutation est l’identité. On calcule d’abord L 1L^{-1} en utilisant le fait que LL est triangulaire inférieure, voici comment cela est implémenté dans Xcas (LL est noté l) :

first step compute l^-1, 
solve l*a=y for y a canonical basis vector
  a0=y0, a1=y1-l_{1,0}*a0, ..., ak=yk-sum_{j=0..k-1}(l_kj*aj)
if y=(0,..,0,1,0,...0) (1 at position i), 
  a0=..=a_{i-1}=0, a_i=1 and we start at equation k=i+1 and sum_{j=i...}
-> n^3/6 operations
To store the result in place of l
we first compute all the a2 (there is only 1), then all the a3 (2), etc.
a0=y0, a1=y1-l_{1,0}*a0, ..., ak=yk-sum_{j=0..k-1}(l_kj*aj)

Puis on résoud UA 1=L 1U A^{-1}=L^{-1} colonne par colonne

second step, solve u*inverse=l^-1 (now under the diagonal)
we compute a column of inverse by solving the system: 
u*col(inverse)=corresponding row of l^-1, 
and overwrite the row of l^-1 by solution
u*[x0,..,xn-1]=[a0,...,an]
x_{n-1}=a_{n-1}/u_{n-1,n-1}
x_{n-2}=(a_{n-2}-u_{n-2,n-1}*x_{n-1})/u_{n-2,n-2}
...
x_k=(a_{k}-sum_{j=k+1..n-1} u_{k,j}x_j)/u_{k,k}
-> n^3/2 operations
To store the solution in place, we first compute all the x_{n-1}
put them in the last line of m, then all the x_{n-2}, etc.

3.4  La factorisation de Cholesky

Dans le cas où la matrice est réelle symétrique définie positive (ou plus généralement hermitienne), on peut obtenir une écriture analogue mais où UU est la transconjuguée de LL A=U *U=LL * A=U^* U = L L^* LL reste triangulaire inférieure, mais n’a plus des 1 sur sa diagonale en général. Si AA est définie positive, on peut rendre l’écriture unique en imposant aux coefficients diagonaux de LL d’être réels positifs.

L’algorithme de calcul de UU est la traduction matricielle de l’algorithme de Gauss de réduction des formes quadratiques. On a en effet x *Ax=x *U *Ux=||Ux|| 2 x^* A x=x^* U^* U x = ||Ux||^2 les lignes de UU (ou les colonnes de LL) sont donc les coefficients des formes linéaires indépendantes qui interviennent dans l’écriture de la forme quadratique comme somme/différence de carrés de formes linéaires. Si AA est définie positive, seules des sommes interviennent, et les variables s’éliminent l’une après l’autre (le coefficient de x 2x_2 est forcément non nul lorsqu’on a éliminé x 1x_1 et ainsi de suite), ceci explique la forme triangulaire de UU et LL.

Le calcul de LL se fait donc colonne par colonne, en calculant d’abord le coefficient diagonal comme racine carrée du coefficient diagonal α j=A j,j\alpha_j=\sqrt{A_{j,j}}. Ensuite on effectue les combinaisons de ligne sous la forme l j1α jl j,l iα jl iA i,jα jl j l_j \rightarrow \frac{1}{\alpha_j}l_j, \quad l_i \rightarrow \alpha_j l_i - \frac{A_{i,j}}{\alpha_j} l_j

On peut aussi tout simplement effectuer le produit de LL *L L^* et chercher les inconnues en commencant par l 1,1l_{1,1} puis on calcule les l i,1l_{i,1} pour i>1i>1, etc. En suivant wikipedia, pour une matrice réelle : L=[l 11 0 0 l 21 l 22 0 l n1 l n2 l nn] L=\begin{bmatrix} l_{11}& 0 & \cdots & 0 \\ l_{21} & l_{22}& \cdots & 0\\ \vdots & \vdots & \ddots & \vdots\\ l_{n1} & l_{n2} & \cdots & l_{nn} \end{bmatrix} a ij=(LL T) ij= k=1 nl ikl jk= k=1 min{i,j}l ikl jk,1i,jn a_{ij}=\left(LL^{T}\right)_{ij}={\sum_{k=1}^{n}l_{ik}l_{jk}}= {\sum_{k=1}^{\min\left\{ i,j\right\} }l_{ik}l_{jk}},\;1\leq i,j\leq n La matrice AA étant symétrique, il suffit que les relations ci-dessus soient vérifiées pour iji \leq j, c’est-à-dire que les éléments l i,jl_{i,j} de la matrice LL doivent satisfaire a ij= k=1 il ikl jk,1ijn a_{ij}={\sum_{k=1}^{i}l_{ik}l_{jk}},\;1\leq i\leq j\leq n Pour i=1i=1, on détermine la première colonne de LL a 11=l 11l 11,a 1j=l 11l j1 a_{11}=l_{11}l_{11}, \quad a_{1j}=l_{11}l_{j1} donc l 11=a 11,l j1=a 1jl 11(pour j>1) l_{11}=\sqrt{a_{11}}, \quad l_{j1}=\frac{a_{1j}}{l_{11}} \ (\mbox{pour } j>1) On détermine la ii-ième colonne de LL (2in)2\leq i\leq n) après avoir calculé les i1i-1 premières colonnes a ii=l i1l i1++l iil ii,a ij=l i1l j1++l iil ji a_{ii}=l_{i1}l_{i1}+\ldots+l_{ii}l_{ii}, \quad a_{ij}=l_{i1}l_{j1}+\ldots+l_{ii}l_{ji} d’où l ii=a ii k=1 i1l ik 2,l ji=a ij k=1 i1l ikl jkl iiUnknown character(pour j>i) l_{ii}= \sqrt{{a_{ii}-{\sum_{k=1}^{i-1}l_{ik}^{2}}}}, \quad l_{ji}=\frac{a_{ij}-{\sum_{k=1}^{i-1}l_{ik}l_{jk}}}{l_{ii}} \ (\mbox{pour } j > i) Pour une matrice hermitienne complexe, il suffit de remplacer l ikl jkl_{ik}l_{jk} par l ikl jk¯l_{ik}\overline{l_{jk}} et l ik 2l_{ik}^{2} par |l ik| 2|l_{ik}|^{2}.

Le nombre d’opérations arithmétiques à effectuer est asymptotiquement 2 fois plus faible que celui pour LULU. En effet, pour la première ligne, il faut 1 racine et n1n-1 divisions, pour la deuxième ligne, 1 racine, n1n-1 additions, multiplications et n2n-2 divisions, ..., pour la ii-ième ligne 1 racine, (i1)(ni)(i-1)(n-i) additions, multiplications et n2n-2 divisions, au final le cout est dominé par les additions et multiplications en n 3/6n^3/6 pour chaque, contre n 3/3n^3/3 pour la factorisation LULU. Mais le temps réel dépend de l’optimisation de l’implémentation, en particulier des accès mémoire plus couteux que les opérations arithmétiques, ainsi avec Xcas, l’algorithme de Cholesky n’est pas plus rapide que la factorisation LULU.

La commande Xcas correspondante est cholesky et renvoie la matrice LL.

3.5  Conditionnement

Le conditionnement mesure la sensibilité de la solution renvoyée d’un système linéaire aux données du problème.

3.5.1  Rappel sur les normes matricielles

On utilisera les normes suivantes sur l’espace vectoriel des matrices n,nn,n :

Si on prend comme norme la norme L 2L^2, le calcul de |||A||||||A||| nécessite de maximiser <Ab|Ab>\sqrt{&lt;Ab|Ab&gt;} pour bb de norme 1, ce qui revient à maximiser <b|A *Ab>\sqrt{&lt;b|A^* A b&gt;}. En diagonalisant la matrice hermitienne A *AA^* A, on voit qu’il suffit d’en trouver la plus grande valeur propre et d’en prendre la racine carrée. Les valeurs propres de A *AA^*A sont appelées valeurs singulières de AA (ce sont des réels positifs).

Le calcul de la normes triple infinie est plus simple, si x =1\|x\|_\infty=1 |(Ax) i|=| ja i,jx j| j|a i,j||(Ax)_i| = |\sum_{j} a_{i,j} x_j| \leq \sum_{j} |a_{i,j}| avec égalité si les x jx_j valent ±1\pm 1 avec le bon choix de signe. On en déduit que |||A||| =max i j|a i,j|||| A |||_{\infty}=\mbox{max}_i \sum_{j} |a_{i,j}| aussi appelé norme de ligne (on prend le max sur les lignes de la somme des valeurs absolues des coefficients de la ligne).

Pour la norme 1, on trouve la norme colonne (max sur les colonnes de la somme des valeurs absolues des coefficients d’une colonne) : i|(Ax) i|= i| ja i,jx j| j|x j| i|a i,j|max j i|a i,j|\sum_i |(Ax)_i| = \sum_i |\sum_{j} a_{i,j} x_j| \leq \sum_j |x_j| \sum_i |a_{i,j}| \leq \mbox{max}_j \sum_i |a_{i,j}| Pour réaliser la norme triple, on prend x i=0x_i=0 si iji\neq j qui réalise le max, et x j=1x_j=1.

3.5.2  Nombre de condition

Soit le système linéaire Ax=bAx=b de solution x=A 1bx=A^{-1}b, supposons bb connu avec une erreur ee, alors la solution renvoyée sera x+A 1ex+A^{-1}e, on a donc une erreur relative sur la solution de A 1eA 1b=A 1eeebbA 1b|||A 1||||e||b||||A||| \frac{\|A^{-1}e\|}{\|A^{-1}b\|} = \frac{\|A^{-1}e\|}{\|e\|} \frac{\|e\|}{\|b\|} \frac{\|b\|}{\|A^{-1}b\|} \leq |||A^{-1}||| \frac{|e|}{|b|} |||A||| (la dernière inégalité s’obtient en écrivant b=A(A 1b)b=A(A^{-1}b)). On en déduit que le rapport de l’erreur relative sur la solution par l’erreur relative du second membre est majorée par le produit de la norme de AA (en tant qu’application linéaire) par la norme de A 1A^{-1}, ce produit est appelé conditionnement de la matrice AA (ou parfois nombre de condition de AA en adoptant la terminologie anglo-saxonne).

On remarquera que le conditionnement dépend du choix de la norme sur l’espace vectoriel. Pour la norme 2, on sait que |||A||||||A||| est la plus grande valeur singulière de AA le même calcul pour A 1A^{-1} (dont les valeurs singulières sont les inverses des valeurs singulières de AA) nous donne alors le :

Théorème 2   Lorsqu’on résoud un système linéaire Ax=bAx=b, AA matrice connue précisément et inversible, bb connu avec une erreur relative en norme L 2L^2, l’erreur relative en norme L 2L^2 sur xx est au plus multipliée par K 2(A)=λ nλ 1 K_2(A)= \frac{\lambda_n}{\lambda_1} λ n\lambda_n [resp. λ 1\lambda_1] est la plus grande [resp. plus petite] valeur singulière de AA (racines carrées des valeurs propres de A *AA^*A).
Ce facteur d’amplification des erreurs relatives est évidemment supérieur ou égal à 1. Il est égal à 1 si la matrice est unitaire (puisque
AA est une matrice d’isométrie ou car AA *=IAA^*=I). S’il est de l’ordre de 2 c2^c on perdra (au plus) cc bits de précision sur la mantisse de xx.

Avec Xcas, les valeurs singulières s’obtiennent par l’instruction SVL(A), le conditionnement L 2L^2 par cond(A,2) (cond(A,1) donne le conditionnement L 1L^1 et cond(A,inf) donne le conditionnement L L^\infty). Attention, les valeurs singulières de AA ne sont pas les valeurs absolues des valeurs propres de AA (c’est le cas si AA commute avec sa transconjuguée mais ce n’est pas général). On peut utiliser la méthode de la puissance (cf. infra) pour estimer rapidement la plus grande valeur singulière de AA (donc sans diagonaliser complètement la matrice A *AA^*A), et de même sur A 1A^{-1} (en utilisant LULU ou Cholesky pour trouver les itérées sans calculer A 1A^{-1}).

On remarque que si AA est une matrice orthogonale, alors son nombre de conditionnement vaut 1, si on doit utiliser des matrices orthogonales dans un algorithme, ce sera stable numériquement.

On peut aussi prendre la norme L 1L^1 sur l’espace vectoriel, dans ce cas la norme de matrice correspondante est la norme de colonne (exercice!), le maximum des sommes valeurs absolues des éléments des colonnes (colNorm(A) en Xcas) et le conditonnement est le produit de colNorm(A) par colNorm(inv(A)) qui est renvoyé par COND(A) en Xcas.

Si la matrice du système AA (de nombre de condition noté κ(A)\kappa(A)) est elle-même connue avec une certaine incertitude, alors pour ||ΔA||||\Delta A|| suffisamment petit, la solution de (A+ΔA)(x+Δx)=b+Δb(A+\Delta A)(x+\Delta x)=b+\Delta b vérifie |Δx||x|κ(A)1κ(A)||ΔA||||A||(|Δb||b|+||ΔA||||A||)\frac {|\Delta x |}{|x|}\leq \frac{\kappa(A)}{1-\kappa(A)\frac{||\Delta A||}{||A||}} \left(\frac{|\Delta b|}{|b|}+\frac{||\Delta A||}{||A||} \right) En effet, on a AΔx=ΔbΔA(x+Δx)Δx=A 1(ΔbΔA(x+Δx))A \Delta x =\Delta b - \Delta A(x+\Delta x) \Rightarrow \Delta x = A^{-1}(\Delta b - \Delta A(x+\Delta x)) donc en norme Δx|||A 1|||(ΔbbAx+|||ΔA||||||A||||||A|||(x+Δx))\| \Delta x \| \leq |||A^{-1}||| (\frac{\|\Delta b\|}{\|b\|}\|Ax\| + \frac{||| \Delta A |||}{|||A|||} |||A||| (\|x\|+\|\Delta x\|)) puis : syntax error at token \\

3.6  Quelques méthodes alternatives au pivot

3.6.1  Factorisation QRQR

La factorisation QRQR consiste à écrire une matrice AA comme produit d’une matrice orthogonale (ou unitaire dans C\C) et d’une matrice triangulaire supérieure. Les matrices orthogonales ayant un conditionnement de 1 (en norme L 2L^2) cette factorisation peut s’obtenir de manière numériquement stable.

Il existe plusieurs algorithmes pour effectuer cette factorisation. On peut voir cette factorisation comme l’orthonormalisation de Gram-Schmidt appliqué aux vecteurs colonnes de AA si AA est non singulière. Mais la procédure de Gram-Schmidt n’est pas numériquement stable (car on retranche d’un vecteur une combinaison linéaire des vecteurs précdents pour rendre le nouveau vecteur orthogonal et les erreurs d’arrondi s’accumulent rendant l’orthogonalité plus aléatoire). La méthode de Householder utilise des matrices de symétrie par rapport à un hyperplan et ne souffre pas de ce problème d’instabilité. Pour annuler les coefficients de la première colonne c 1c_1 de AA, on construit le vecteur u=c 1±c 1e 1u=c_1 \pm \|c_1\| e_1e 1e_1 est le premier vecteur de base et le signe ±\pm est le signe de la première composante de c 1c_1 (pour assurer la stabilité numérique). On fait alors la symétrie Q 1Q_1 par rapport à l’hyperplan HH orthogonal à uu, qui laisse HH invariant et transforme uu en u-u. Comme uu est vecteur directeur de la bissectrice intérieure ou extérieure de c 1c_1 et e 1e_1, la symétrie échange ces deux vecteurs, éventuellement au signe près. La matrice A 1=Q 1AA_1=Q_1A a donc comme première colonne un multiple de e 1e_1, on continue ensuite en faisant le même raisonnement sur la matrice A 1A_1 en se limitant et lignes et colonnes d’indice 2\geq 2. Après n1n-1 itérations, on a A n1=Q n1...Q 1AA_{n-1}=Q_{n-1}...Q_1A qui est triangulaire supérieure d’où la factorisation annoncée.

Matriciellement, Q 1=I2vv *Q_1=I-2vv^*v=u/uv=u/\|u\|, pour calculer Q 1AQ_1A il faut effectuer A2vv *AA-2vv^*A, on calcule donc w=v *Aw=v^*A en n 2n^2 opérations (ou une opération est une addition et une multiplication) puis on soustrait (2v) iw j(2v)_i w_j de a ija_{ij} en n 2n^2 opérations. En faisant de même aux étapes qui suivent, sans tenir compte de la simplification progressive du vecteur vv, on effectue 2n 32n^3 opérations. La constante 2 peut être un peu améliorée en tenant compte des 0 initiaux de vv aux étapes 2 et ultérieures, elle est toutefois supérieure à LU (et Cholesky), mais en contrepartie la méthode est très stable numériquement.

On peut aussi utiliser des rotations (méthode de Givens) pour annuler les coefficients de AA sous la diagonale. C’est par exemple très efficace pour des matrices tridiagonales.

Lorsque la matrice AA n’est pas carrée, mais possède nn lignes et cc colonnes, la factorisation QRQR est encore possible, la matrice QQ est alors une matrice carrée d’ordre nn, et RR a les mêmes dimensions que AA. En particulier si AA a plus de lignes que de colonnes (matrice verticale), RR aussi. Par exemple si AA est de rang maximal cc, alors RR se décompose en un premier bloc c,cc,c inversible R 1R_1 et un deuxième bloc nc,cn-c,c entièrement nul.

Applications :
On peut alors écrire Ax=bAx=b sous la forme QRx=bQRx=b donc Rx=Q *bRx=Q^*b qui est un système triangulaire supérieur, donc résoudre Ax=bAx=b en O(n 2)O(n^2) opérations une fois la factorisation QRQR effectuée.

Mais c’est surtout pour résoudre au sens des moindres carrés un système sur-déterminé que la factorisation QRQR trouve tout son intérêt. Soit AA la matrice d’un système sur-déterminé avec nn lignes et cc colonnes, n>cn&gt;c (matrice “verticale” ou mince). Le système n’a en général pas de solution, on cherche alors à minimiser Axb 2 2\| Ax-b \|_2^2. Ceci revient à chercher la projection orthogonale de bb sur Im(A)(A). Soit AxAx cette projection, on a b=Ax+pb=Ax+p avec pp orthogonal à Im(A)(A) donc dans Ker(A*)(A*), donc A *b=A *(Ax+p)=A *AxA^*b=A^*(Ax+p)=A^*Ax.

Proposition 3   La solution xx du problème de minimisation de Axb 2\| Ax-b \|_2 est donnée par A *Ax=A *bA^*Ax=A^*b

Si A=QRA=QR on a alors R *Rx=R *Q *bR^* R x=R^* Q^*b. Si AA est de rang maximal cc, on décompose RR en ( R 2 R 1)(^{R_1}_{R_2}) avec R 1R_1 inversible de taille cc et R 2=0R_2=0, donc R *=(R 1 *,0)R^*=(R_1^*, 0) et le système devient R 1 *R 1x=(R 1 *,0)Q *bR_1^*R_1x =(R_1^*,0) Q^*b et comme R 1R_1 est inversible, on a R 1x=R_1x= les cc premières lignes de Q *bQ^*b. Il vaut mieux résoudre ce système que A *Ax=A *bA^* Ax=A^*b car le conditionnement de A *AA^* A est le carré du conditionnement de AA (le nombre d’opérations est un peu supérieur : QRQR a une constante nettement plus grande que Cholesky mais il n’y a pas de multiplication de matrice à faire, et le résultat est plus précis).

Notons qu’on peut résoudre de manière assez analogue un système sous-déterminé au sens des moindres carrés. On considère toujours le système Ax=bAx=b mais cette fois-ci AA est une matrice “horizontale” (nombre de lignes n<cn&lt;c le nombre de colonnes). Si bb \in Im(A)(A) (on peut génériquement supposer que AA est de rang nn), il y a une infinité de solutions, on cherche alors la solution de norme minimale. On cherche donc le projeté orthogonal de l’espace affine des solutions (dirigé selon Ker(A)(A)) sur l’orthogonal de Ker(A)(A) qui est ImA *A^*. Ainsi x=A *yx=A^*y vérifie Ax=bAx=b, donc AA *y=bAA^*y=b. Si AA est de rang nn alors AA *AA^* est inversible et y=(AA *) 1by=(AA^*)^{-1}b donc x=A(AA *) 1bx=A (AA^*)^{-1}b. En utilisant la factorisation QRQR de A *A^* (attention pas celle de AA), on a AA *=R *RAA^*=R^*R, donc x=QR(R *R) 1bx=QR(R^*R)^{-1}b. Si AA est de rang nn, on a alors en posant R=( 0 R 1)R=(^{R_1}_{0}) avec R 1R_1 matrice n,nn,n inversible : x=Q(R 1 0)R 1 1R 1 * 1b=Q(R 1 * 1 0)b=Q 1R 1 * 1bx=Q\left(\begin{array}{c}R_1\\0\end{array}\right)R_1^{-1} R_1^{*^{-1}}b=Q\left(\begin{array}{c} {R_1}^{*^{-1}} \\ 0\end{array}\right)b=Q_1 {R_1}^{*^{-1}} b Q 1Q_1 désigne les nn premières colonnes de QQ.

Proposition 4   Soit AA une matrice ayant nn lignes et c>nc&gt;n colonnes. Si AA est de rang maximal nn, posons A *=QRA^*=QR, R 1R_1 les nn premières lignes de R 1R_1, Q 1Q_1 les nn premières colonnes de QQ. La solution de Ax=bAx=b de norme minimale est donnée par Q 1cQ_1ccc est la solution de R 1 *c=bR_1^*c=b (système triangulaire).

Exemple 1 : la régression linéaire :
On se donne nn points de coordonnées (x i,y i)(x_i,y_i) où les x ix_i sont distincts 2 à 2 et on cherche la droite qui approche le mieux ces points au sens de l’écart en yy au carré. Il s’agit donc de trouver α\alpha et β\beta qui minimisent : j=1 n(α+βx iy i) 2\sum_{j=1}^n (\alpha+\beta x_i-y_i)^2 Ici on a : A=(1 x 1 ... ... 1 x n ),x=(α β),b=(y 1 ... y n )A=\left( \begin{array}{cc} 1 & x_1 \\ ... & ... \\ 1 & x_n \\ \end{array} \right), \quad x=\left( \begin{array}{c} \alpha \\ \beta \end{array}\right), \quad b=\left( \begin{array}{c} y_1 \\ ... \\ y_n \\ \end{array} \right) Pour trouver α,β\alpha, \beta de manière précise, on préferera donc calculer la factorisation QRQR de AA plutôt que calculer A *AA^*A, R 1R_1 est une matrice carrée d’ordre 2, QQ une matrice carrée d’ordre nn, la première colonne de QQ est le vecteur de coordonnées ±(1,...,1)/n\pm (1,...,1)/\sqrt{n}. Exemple : on se donne les points (1,2),(2,1),(3,5),(4,4)(1,2), (2,1), (3,5), (4,4). La matrice AA et bb sont donc


Exemple 2: régression polynomiale :
C’est une généralisation de l’exemple précédent, on cherche un polynôme P(x)P(x) de degré fixé tel que i(y iP(x i)) 2\sum_i (y_i-P(x_i))^2 soit minimal. Si on choisit la base canonique des polynômes, la matrice AA est alors une matrice de Vandermonde et son conditionnement est en général très mauvais. De plus, plus le degré augmente, plus l’extrapolation est hasardeuse :


On préfèrera utiliser une base de polynômes orthogonaux pour le produit scalaire iP(x i)Q(x i)\sum_i P(x_i)Q(x_i) ou minimiser une autre fonctionnelle quadratique, par exemple une intégrale du carré de la différence entre une fonction à approcher et un polynôme ou un polynôme trigonométrique.

Remarque : La factorisation QRQR peut s’obtenir en calculant la factorisation de Cholesky de A *AA^* A qui donne RR, mais on lui préfère une méthode de calcul direct pour des raisons de stabilité, en tout cas pour des matrices denses (pour des matrices creuses des considérations d’efficacité peuvent faire préférer la factorisation de Cholesky).

3.6.2  Jacobi, Gauss-Seidel, relaxation

Lorsqu’on a une matrice creuse (peu d’éléments non nuls), l’algorithme du pivot de Gauss a tendance à densifier rapidement la matrice réduite (surtout avec le pivot partiel où on ne controle pas le nombre de zéros de la ligne contenant le pivot). Il peut alors être intéressant d’utiliser des méthodes alternatives ne faisant intervenir que des produits de matrice, donnant éventuellement un résultat seulement approché.

Par exemple pour calculer l’inverse d’une matrice A=MNA=M-N, avec MM facile à inverser (par exemple diagonale) et NN petit en norme et creuse, on peut écrire : A 1=(MN) 1=(M(IM 1N)) 1=(I+M 1N+(M 1N) 2+...)M 1A^{-1}=(M-N)^{-1} = (M(I-M^{-1}N))^{-1}=(I+M^{-1}N+(M^{-1}N)^2+...)M^{-1}

De même pour résoudre un système linéaire Ax=bAx=b avec A=MNA=M-N, on considère la suite Mx n+1Nx n=bMx_{n+1}-Nx_n=b, donc x n+1x_{n+1} est obtenu en résolvant le système : Mx n+1=b+Nx n,x 0=0Mx_{n+1}=b+N x_n, \quad x_0=0 pour laquelle on vérifiera les hypothèses du théorème du point fixe, il suffit par exemple de vérifier que la plus grande valeur singulière de M 1NM^{-1}N est strictement plus petite que 1. Lorsque la matrice NN n’est pas creuse, le procédé est intéressant pour résoudre approximativement un système si nn est grand et si chaque itération est en O(n 2)O(n^2) (ceci veut dire qu’on ne calcule pas M 1M^{-1} sauf si c’est évident, par exemple si MM est diagonale), mais le procédé n’est pas intéressant pour le calcul de l’inverse de AA.

Notons DD la partie diagonale de AA, LL sa partie triangulaire inférieure stricte, UU sa partie triangulaire supérieure stricte, La méthode de Jacobi utilise pour MM la diagonale DD de AA, alors que la méthode de Gauss-Seidel prend pour MM la partie triangulaire inférieure D+LD+L de AA (diagonale comprise). Pour Jacobi, on a donc x n+1=D 1(b+(DA)x n)=x n+D 1(bAx n)x_{n+1}=D^{-1}(b+(D-A)x_n)=x_n+D^{-1}(b-Ax_n) En Xcas, l’instruction préprogrammée est jacobi_linsolve, on peut aussi programmer la méthode par

jacobi(A,b,eps,N):={
  local D,x0,x1,n,j;
  n:=size(A);
  D:=diag(A).^-1;
  x0:=seq(0,n);
  pour j de 1 jusque N faire
    x1:=b-A*x0;
    si l2norm(x1)<eps alors return x0; fsi;
    x0:=x0+D .*x1;
  fpour;
  return "non convergent";
}:;


Un cas simple où on a convergence :

Proposition 5   Lorsque la matrice AA est à diagonale strictement dominante, c’est-à-dire que l’élément diagonal est en valeur absolue strictement supérieur à la somme des éléments non diagonaux de la même ligne : |a ii|> ji|a ij||a_{ii}| &gt; \sum_{j\neq i} |a_{ij}| la méthode de Jacobi converge.

En effet, M 1Nx <x \|M^{-1}Nx\|_\infty &lt; \| x\|_\infty car : |(Nx) i| ji|a ij||x j| ji|a ij|x <|a ii|x |M 1(Nx) i|<x |(Nx)_i| \leq \sum_{j \neq i} |a_{ij}| |x_j| \leq \sum_{j \neq i} |a_{ij}| \|x\|_\infty &lt; |a_{ii}| \| x\|_\infty \quad \Rightarrow \quad |M^{-1}(Nx)_i| &lt; \| x\|_\infty On retrouve ce cas pour une petite perturbation d’une matrice diagonale, par exemple 




Pour nn assez grand, la méthode de Jacobi devient plus rapide. Cela se vérifie encore plus vite si AA est une matrice creuse.

Pour Gauss-Seidel, le calcul de M 1M^{-1} n’est pas effectué, on résoud directement le système triangulaire Mx n+1=b+Nx nMx_{n+1}=b+Nx_n soit (D+L)x n+1=bUx n(D+L)x_{n+1}=b-Ux_n Gauss-Seidel est moins adapté à la parallélisation que Jacobi. On adapte le programme précédent

seidel(A,b,N,eps):={
  local L,U,x0,x1,n,j;
  n:=size(A);
  L:=diag(A,left);
  U:=A-L;
  x0:=seq(0.0,n);
  pour j de 1 jusque N faire
    x1:=b-U*x0;
    x1:=linsolve(L,x1);
    si l2norm(x1-x0)<eps*l2norm(x0) alors return x0; fsi;
    x0:=x1;
  fpour;
  return "non convergent";
}:;


Dans la méthode de relaxation, on pose pour MM la matrice triangulaire inférieure M=1ωD+LM=\frac1\omega D+Lω>0\omega &gt;0, donc N=(1ω1)DUN=(\frac1\omega-1) D-U et on utilise la récurrence Mx n+1=b+Nx nMx_{n+1}=b+Nx_n donc Mx n+1=b+(MA)x nMx_{n+1}=b+(M-A)x_n puis M(x n+1x n)=bAx nM(x_{n+1}-x_n)=b-Ax_n puis (D+ωL)(x n+1x n)=ω(bAx n)(D+\omega L) (x_{n+1}-x_n) = \omega(b-Ax_n) On remarque que Gauss-Seidel correspond à ω=1\omega=1. L’instruction correspondante de Xcas est gauss_seidel_linsolve et peut prendre en paramètre le coefficient de relaxation, dont la valeur par défaut est 1.

Proposition 6   (Convergence ): si A=MNA=M-N est une matrice symétrique définie positive et si M *+NM^*+N est définie positive, alors la méthode converge.

On utilise la norme correspondant à la forme quadratique de matrice AA et on calcule la norme subordonnée de M 1NM^{-1}N, on a M 1Nx=xy M^{-1}Nx=x-y avec y=M 1Axy=M^{-1}Ax donc M 1Nx A 2 = <xy|A(xy))> = <x|Ax>+<y|Ay><y|Ax><x|Ay> = <x|Ax>+<y|Ay><y|My><My|y> = <x|Ax><y|(M *+N)y> < <x|Ax>=x A 2 \begin{matrix} \| M^{-1}Nx \|^2_A&=&&lt;x-y|A (x-y))&gt; \\ &=&&lt;x|Ax&gt;+&lt;y|Ay&gt;-&lt;y|Ax&gt;-&lt;x|Ay&gt; \\ &=&&lt;x|Ax&gt;+&lt;y|Ay&gt;-&lt;y|My&gt; -&lt;My|y&gt;\\ &=&&lt;x|Ax&gt;-&lt;y|(M^*+N)y&gt;\\ & &lt; & &lt;x|Ax&gt;=\|x\|_A^2 \end{matrix} Conséquence : si AA symétrique définie positive, alors Gauss-Seidel converge, car M *+N=DM^*+N=D. Pour la relaxation, on a M *+N=(2/ω1)DM^*+N=(2/\omega -1)D qui est définie positive si ω<2\omega&lt;2.

Remarque : Jacobi et Gauss-Seidel sont implémentées dans les commandes Xcas jacobi_linsolve et gauss_seidel_linsolve.

3.6.3  Le gradient conjugué

Il s’agit de résoudre Ax=bAx=b, où AA est définie positive. Si on a une base orthogonale pour le produit scalaire induit par AA, on peut calculer la jj-ième coordonnée de xx dans cette base en faisant le produit scalaire de Ax=bAx=b par le jj-ième vecteur de la base. On construit donc petit à petit une base orthogonale pour AA par un procédé à la Gram-Schmidt, mais on ne part pas de la base canonique : on construit cette famille orthogonale pour AA en meme temps qu’on calcule les composantes de xx. On pose x 0=0x_0=0, à la i-ième itération si Ax ib=0Ax_i-b=0 on a terminé, sinon r i=Ax ibr_i=Ax_i-b est linéairement indépendant des éléments de la famille orthogonale dejà construite, on complète la famille orthogonale avec un nouveau vecteur, on calcule la i+1i+1-ième composante de xx sur la famille orthogonale, et on ajoute le tout à x ix_i pour obtenir x i+1x_{i+1}. On s’arrête en au plus la dimension itérations lorsque la famille orthogonale est devenue une base.

La commande conjugate_gradient(A,b) de Xcas permet de faire ce calcul, on peut préciser une valeur initiale de recherche x0 et une précision eps en tapant conjugate_gradient(A,b,x0,eps). Voir aussi le menu Exemple, analyse, gradconj

4  Approximation polynomiale

On présente dans cette section quelques méthodes d’approximation de fonctions par des polynômes sur un intervalle, la section suivante présente des méthodes d’approximation près d’un point ou de l’infini.

4.1  Polynôme de Lagrange

Étant donné la facilité de manipulation qu’apportent les polynomes, on peut chercher à approcher une fonction par un polynôme. La méthode la plus naturelle consiste à chercher un polynôme de degré le plus petit possible égal à la fonction en certains points x 0,...,x nx_0,...,x_n et à trouver une majoration de la différence entre la fonction et le polynôme. Le polynome interpolateur de Lagrange répond à cette question.

4.1.1  Existence et unicité

Soit donc x 0,...,x nx_0,...,x_n des réels distincts et y 0,...,y ny_0,...,y_n les valeurs de la fonction à approcher en ces points (on posera y j=f(x j)y_j=f(x_j) pour approcher la fonction ff). On cherche donc PP tel que P(x j)=y iP(x_j)=y_i pour j[0,n]j \in [0,n].

Commencons par voir s’il y a beaucoup de solutions. Soit PP et QQ deux solutions distinctes du problème, alors PQP-Q est non nul et va s’annuler en x 0,...,x nx_0, ...,x_n donc possède n+1n+1 racines donc est de degré n+1n+1 au moins. Réciproquement, si on ajoute à PP un multiple du polynome A= j=0 n(Xx j)A=\prod_{j=0}^n (X-x_j), on obtient une autre solution. Toutes les solutions se déduisent donc d’une solution particulière en y ajoutant un polynome de degré au moins n+1n+1 multiple de AA.

Nous allons maintenant construire une solution particulière de degré au plus nn. Si n=0n=0, on prend P=x 0P=x_0 constant. On procède ensuite par récurrence. Pour construire le polynôme correspondant à x 0,...,x n+1x_0,...,x_{n+1} on part du polynoôme P nP_n correspondant à x 0,...,x nx_0,...,x_{n} et on lui ajoute un multiple réel de AA P n+1=P n+α n+1 j=0 n(Xx j) P_{n+1}=P_n+ \alpha_{n+1} \prod_{j=0}^n (X-x_j) Ainsi on a toujours P n+1(x j)=y jP_{n+1}(x_j)=y_j pour j=0,..nj=0,..n, on calcule maintenant α n+1 \alpha_{n+1} pour que P n+1(x n+1)=y n+1P_{n+1}(x_{n+1})=y_{n+1}. En remplacant avec l’expression de P n+1P_{n+1} ci-dessus, on obtient P n(x n+1)+α n+1 j=0 n(x n+1x j)=y n+1 P_n(x_{n+1})+ \alpha_{n+1} \prod_{j=0}^n (x_{n+1}-x_j) = y_{n+1} Comme tous les x jx_j sont distincts, il existe une solution unique : α n+1=y n+1P n(x n+1) j=0 n(x n+1x j) \alpha_{n+1}=\frac{y_{n+1}-P_n(x_{n+1})}{\prod_{j=0}^n (x_{n+1}-x_j)}

On a donc prouvé le :

Théorème 7   Soit n+1n+1 réels distincts x 0,...,x nx_0,...,x_n et n+1n+1 réels quelconques y 0,...,y ny_0,...,y_n. Il existe un unique polynôme PP de degré inférieur ou égal à nn, appelé polynome de Lagrange, tel que : P(x i)=y i P(x_i)=y_i

Exemple : déterminons le polynome de degré inférieur ou égal à 2 tel que P(0)=1,P(1)=2,P(2)=1P(0)=1, P(1)=2, P(2)=1. On commence par P 0=1P_0=1. Puis on pose P 1=P 0+α 1X=1+α 1XP_1=P_0+ \alpha_{1}X=1+ \alpha_{1}X. Comme P(1)=2=1+α 1P(1)=2=1+ \alpha_{1} on en tire α 1=1 \alpha_{1}=1 donc P 1=1+XP_1=1+X. Puis on pose P 2=P 1+α 2X(X1)P_2=P_1+ \alpha_{2}X(X-1), on a P 2(2)=3+2α 2=1P_2(2)=3+2 \alpha_{2}=1 donc α 2=1 \alpha_{2}=-1, finalement P 2=1+XX(X1)P_2=1+X-X(X-1).

4.1.2  Majoration de l’erreur d’interpolation.

Reste à estimer l’écart entre une fonction et son polynome interpolateur, on a le :

Théorème 8   Soit ff une fonction n+1n+1 fois dérivable sur un intervalle I=[a,b]I=[a,b] de R\R, x 0,...,x nx_0,...,x_n des réels distincts de II. Soit PP le polynome de Lagrange donné par les x jx_j et y j=f(x j)y_j=f(x_j). Pour tout réel xIx \in I, il existe un réel ξ x[a,b]\xi_x \in [a,b] (qui dépend de xx) tel que : f(x)P(x)=f [n+1](ξ x)(n+1)! j=0 n(xx j)(1) f(x)-P(x) = \frac{f^{[n+1]}(\xi_x)}{(n+1)!} \prod_{j=0}^n(x-x_j) \qquad (1)

Ainsi l’erreur commise dépend d’une majoration de la taille de la dérivée n+1n+1-ième sur l’intervalle, mais aussi de la disposition des points x jx_j par rapport à xx. Par exemple si les points x jx_j sont équidistribués, le terme | j=0 n(xx j)||\prod_{j=0}^n(x-x_j)| sera plus grand près du bord de II qu’au centre de II.

Preuve du théorème : Si xx est l’un des x jx_j l’égalité est vraie. Soit C=(f(x)P(x))/ j=0 n(xx j) C=(f(x)-P(x))/\prod_{j=0}^n(x-x_j) on considère maintenant la fonction : g(t)=f(t)P(t)C j=0 n(tx j) g(t)=f(t)-P(t) - C \prod_{j=0}^n(t-x_j) elle s’annule en x jx_j pour jj variant de 0 à nn ainsi qu’en xx suite au choix de la constante CC, donc gg s’annule au moins n+2n+2 fois sur l’intervalle contenant les x jx_j et xx, donc gg' s’annule au moins n+1n+1 fois sur ce même intervalle, donc gg'{'} s’annule au moins nn fois, etc. et finalement g [n+1]g^{[n+1]} s’annule une fois au moins sur cet intervalle. Or g [n+1]=f [n+1]C(n+1)! g^{[n+1]} = f^{[n+1]} - C (n+1)! car PP est de degré inférieur ou égal à nn et j=0 n(xx j)x n+1 \prod_{j=0}^n(x-x_j) - x^{n+1} est de degré inférieur ou égal à nn. Donc il existe bien un réel ξ x\xi_x dans l’intervalle contenant les x jx_j et xx tel que C=f [n+1](ξ x)(n+1)! C=\frac{f^{[n+1]}(\xi_x)}{(n+1)!}



Attention, l’erreur d’interpolation peut devenir très grande lorsqu’on utilise beaucoup de points d’interpolation.

4.1.3  Calcul efficace du polynôme de Lagrange.

Avec la méthode de calcul précédent, on remarque que le polynôme de Lagrange peut s’écrire à la Horner sous la forme : P(x) = α 0+α 1(xx 0)+...+α n(xx 0)...(xx n1) = α 0+(xx 0)(α 1+(xx 1)(α 2+...+(xx n2)(α n1+(xx n1)α n)...)) \begin{matrix} P(x) &=& \alpha_0 + \alpha_1 (x-x_0) + ... + \alpha_n (x-x_0)...(x-x_{n-1}) \\ &=& \alpha_0 + (x-x_0)( \alpha_1 + (x-x_1)(\alpha_2 + ... + (x-x_{n-2})(\alpha_{n-1}+(x-x_{n-1}) \alpha_n)...)) \end{matrix} ce qui permet de le calculer rapidement une fois les α i\alpha_i connus. On observe que α 0=f(x 0),α 1=f(x 1)f(x 0)x 1x 0 \alpha_0=f(x_0), \quad \alpha_1=\frac{f(x_1)-f(x_0)}{x_1-x_0} On va voir que les α k\alpha_k peuvent aussi se mettre sous forme d’une différence. On définit les différences divisées d’ordre nn par récurrence f[x i]=f(x i),f[x i,...,x k+i+1]=f[x i+1,...,x k+i+1]f[x i,...,x k+i]x k+i+1x i f[x_i]=f(x_i), \quad f[x_i,...,x_{k+i+1}]= \frac{f[x_{i+1},...,x_{k+i+1}]-f[x_i,...,x_{k+i}]}{x_{k+i+1}-x_i} On va montrer que α k=f[x 0,...,x k]\alpha_k=f[x_0,...,x_k]. C’est vrai au rang 0, il suffit donc de le montrer au rang k+1k+1 en l’admettant au rang kk. Pour cela on observe qu’on peut construire le polynôme d’interpolation en x 0,...,x k+1x_0,...,x_{k+1} à partir des polynômes d’interpolation P kP_k en x 0,...,x kx_0,...,x_k et Q kQ_k en x 1,...,x k+1x_1,...,x_{k+1} par la formule : P k+1(x)=(x k+1x)P k+(xx 0)Q kx k+1x 0 P_{k+1}(x)= \frac{(x_{k+1}-x)P_k + (x-x_0)Q_k}{x_{k+1}-x_0} en effet on vérifie que P k+1(x i)=f(x i)P_{k+1}(x_i)=f(x_i) pour i[1,k]i\in [1,k] car P k(x i)=f(x i)=Q k(x i)P_k(x_i)=f(x_i)=Q_k(x_i), et pour i=0i=0 et i=k+1i=k+1, on a aussi P k+1(x 0)=f(x 0)P_{k+1}(x_0)=f(x_0) et P k+1(x k+1)=f(x k+1)P_{k+1}(x_{k+1})=f(x_{k+1}). Or α k+1\alpha_{k+1} est le coefficient dominant de P k+1P_{k+1} donc c’est la différence du coefficient dominant de Q kQ_k et de P kP_k divisée par x k+1x 0x_{k+1}-x_0, c’est-à-dire la définition de f[x 0,...,x k+1]f[x_0,...,x_{k+1}] en fonction de f[x 1,...,x k+1]f[x_1,...,x_{k+1}] et f[x 0,...,x k]f[x_0,...,x_{k}].

Exemple : on reprend P(0)=1,P(1)=2,P(2)=1P(0)=1, P(1)=2, P(2)=1. On a x i f[x i] f[x i,x i+1] f[x 0,x 1,x 2] 0 framebox1 (21)/(10)=framebox1 1 2 (11)/(20)=framebox1 (12)/(21)=1 2 1 \begin{array}{cccc} x_i & f[x_i] & f[x_i,x_{i+1}] & f[x_0,x_1,x_2] \\ 0 & \framebox{1} & & \\ & & (2-1)/(1-0)=\framebox{1} & \\ 1 & 2 & & (-1-1)/(2-0)=\framebox{-1} \\ & & (1-2)/(2-1)=-1 & \\ 2 & 1 & & \\ \end{array} donc P(x)=framebox1+(x0)(framebox1+(x1)(framebox1))=1+x(2x)P(x)=\framebox{1}+(x-0)(\framebox{1}+(x-1)(\framebox{-1}))=1+x(2-x).

On peut naturellement utiliser l’ordre que l’on souhaite pour les x ix_i, en observant que le coefficient dominant de PP ne dépend pas de cet ordre, on en déduit que f[x 0,...,x k]f[x_0,...,x_k] est indépendant de l’ordre des x ix_i, on peut donc à partir du tableau ci-dessus écrire PP par exemple avec l’ordre 2,1,0, sous la forme P(x)=1+(x2)(1+(x1)(1))=1+(x2)(x) P(x)=1+(x-2)(-1+(x-1)(-1))=1+(x-2)(-x)

Le nombre d’opérations nécessaires pour faire ce calcul est proportionnel à n 2n^2.

La commande Xcas interp ou son synonyme lagrange effectue ce calcul. Pour avoir les différences divisées, on peut créer le programme suivant :

dd(X,Y):={ // Algorithme des différences divisées
  local k,l,n,A,old,cur;
  si size(X)!=size(Y) alors return "erreur" fsi;
  n:=size(X)-1;
  A:=[Y[0]];
  old:=Y;
  pour k de 1 jusque n faire
    // calcul de cur en fonction de old
    cur:=[];
    pour l de 0 jusque n-k faire
      cur[l]:=(old[l+1]-old[l])/(X[l+k]-X[l])
    fpour;
    A[k]:=cur[0];
    old:=cur;
  fpour;
  retourne A;
}:;



(N.B. pour rendre ce programme optimal, il faudrait utiliser l’affectation en place =< au lieu de :=)

4.1.4  Sensibilité aux erreurs sur les données.

Si les y jy_j sont connus avec une certaine erreur, alors le polynôme d’interpolation est connu de manière approchée. Plus précisément, si on note π j(x)= kjxx kx jx k\pi_j(x)=\prod_{k \neq j} \frac{x-x_k}{x_j-x_k} le jj-ième polynome de Lagrange valant 1 en x jx_j et 0 ailleurs, l’erreur vaut : j(y˜ jy j)π j(x)\sum_j (\tilde{y}_j-y_j) \pi_j(x) Si l’erreur relative sur les y jy_j est majorée par ε\epsilon, l’erreur sur le polynôme d’interpolation est majorée par : εmax j|y j| j|π j(x)|\epsilon \, \mbox{max}_j|y_j| \sum_j |\pi_j(x)| il y a amplification de l’erreur par un facteur majoré par  max x[a,b] j=0 n|π j(x)|\mbox{max}_{x \in [a,b]} \sum_{j=0}^n |\pi_j(x)| Ce facteur s’appelle constante de Lebesgue relative à la subdivision x 0,...,x nx_0,...,x_n de [a,b][a,b]. On peut le calculer numériquement pour une subdivision équidistribuée, et montrer qu’il croit comme 2 n+1enln(n)\frac{2^{n+1}}{e n \ln(n)}, par exemple pour n=40n=40, il vaut environ 5e9. Illustration avec Xcas :



puis essayer avec n=20n=20. Pour n=40n=40, en observant que le max est atteint dans [0,1][0,1], on peut remplacer les valeurs absolues par la bonne puissance de -1

on a alors un polynôme, dont on calcule l’abscisse du maximum par

puis
qui donne environ 4.7e9.

4.2  Interpolation aux points de Tchebyshev

L’idée la plus naturelle pour interpoler un polynôme en n+1n+1 points d’un intervalle [a,b][a,b] consiste à couper en nn morceaux de même longueur. Mais ce n’est pas le plus efficace car le terme | j=0 n(xx j)||\prod_{j=0}^n(x-x_j)| est plus grand près des bords. Il est donc plus judicieux d’avoir plus de points près des bords et moins à l’intérieur. C’est là qu’interviennent les polynômes de Tchebyshev, ils sont définis par développement de cos(nx)\cos(nx) en puissances de cos(x)\cos(x) : T n(cos(x))=cos(nx)T_n(\cos(x))=\cos(nx) Sur [1,1][-1,1], le polynôme T nT_n vaut en valeur absolue au plus 1, et atteint cette valeur exactement n+1n+1 fois lorsque x=kπ/nx=k\pi/n donc X=cos(x)=cos(kπ/n)X=\cos(x)=\cos(k\pi/n).

De plus cette majoration est optimale. En effet soit UU un polynôme de degré au plus nn qui vérifie |U| <1|U|_\infty&lt;1 sur [1,1][-1,1] et tel que UU ait le même coefficient dominant que T nT_n. Alors la différence T nUT_n-U est du signe de T nT_n en X=cos(kπ/n),k[0,n]X=\cos(k\pi/n), k \in [0,n] puisqu’en ces points T nT_n est extrêmal de valeur absolue 1. Donc T nUT_n-U s’annule nn fois sur [1,1][-1,1], mais son degré est au plus n1n-1 donc T n=UT_n=U absurde.

On a donc intérêt à prendre les abscisses des points d’interpolation en les racines t nt_n de T nT_n a+b2+ab2t n,t n=cos((k+12)πn),k=0..n1\frac{a+b}{2} + \frac{a-b}{2} t_n, \quad t_n=\cos((k+\frac12)\frac\pi n), \quad k=0..n-1 On pourra observer que le phénomène de Runge qui apparait par exemple pour f(x)=1/(25x 2+1)f(x)=1/(25x^2+1) sur [1,1][-1,1] avec des points d’interpolation équidistants n’apparait plus si on prend des points de Tchebyshev.





Ceci est relié à la constante de Lebesgue qui pour des points de Tchebyshev vaut un peu moins de 4 pour n<100n&lt;100 (se comporte comme 2πln(n)\frac2\pi \ln(n) pour nn grand), on peut montrer que les polynômes de Lagrange aux points de Tchebyshev convergent uniformément vers 1/(25x 2+1)1/(25x^2+1) (c’est plus généralement vrai pour toute fonction C 1C^1 sur l’intervalle).

Remarque : ce n’est pas le polynôme de meilleure approximation, de ff (celui qui minimise la norme L L^\infty de la différence) car la dérivée n+1n+1-ième varie en général sur [a,b][a,b]. Mais il est trop difficile de le calculer en général.

Exemple de calcul explicite de constante de Lebesgue pour n=40n=40 avec Xcas

purge(x);
t(k,n):={ 
 local T; 
 T:=seq(cos(pi*(k+.5)/(n+1)),k,0,n);
 return product((x-T[j])/(T[k]-T[j]),j,0,k-1)*
  product((x-T[j])/(T[k]-T[j]),j,k+1,n);
}:;



4.3  Interpolation de Hermite

Si on fait tendre un des points d’interpolation vers un autre, la donnée de la valeur en ces 2 points serait redondante, elle est remplacée par la valeur de la dérivée. Dans le calcul des différences divisées ci-dessus on fera comme si les 2 points étaient distincts et successifs, disons x ix_i et x i+1x_{i+1}, on remplace le rapport indéterminé f(x i+1)f(x i)x i+1x i=00 \frac{f(x_{i+1})-f(x_i)}{x_{i+1}-x_i} = \frac{0}{0} par f(x i)f'(x_i). On montre qu’une fois ce changement réalisé tout le reste est identique (y compris la majoration d’erreur). On peut bien sur généraliser au cas de plusieurs paires de points identiques ou des multiplicités plus grandes faisant intervenir des dérivées d’ordre supérieures, dans ce cas la différence divisée f[x i,...,x i+m]f[x_i,...,x_{i+m}] sera remplacée par f [m](x i)/m!f^{[m]}(x_i)/m!.

4.4  Polynômes de Bernstein et courbes de Bézier

Les polynômes de Bernstein de degré mm sont les B k n(x)=(n k)x k(1x) nkB^n_k (x) = \left( \begin{array}{c} n \\ k \end{array} \right) x^k (1-x)^{n-k} On reconnait la probabilité d’avoir kk succès si on effectue nn tirages indépendants (avec remise) avec probabilité x[0,1]x \in [0,1] de succès par tirage. Ceci donne une relation de récurrence B k+1 n+1=(1x)B k+1 n+xB k nB^{n+1}_{k+1}=(1-x)B^n_{k+1}+x B^n_k qui peut servir à calculer les B i mB^m_i. On en déduit aussi que l’espérance de kk selon cette loi vaut nxnx (somme de nn variables d’espérance xx) et l’espérance de (knx) 2(k-nx)^2 vaut nx(1x)nx(1-x) (variance de la somme de nn variables indépendantes de variance xx). On en déduit qu’on peut approcher uniformément une fonction continue sur un intervalle [a,b][a,b] par des polynômes, en se ramenant à a=0,b=1a=0, b=1, on pose : P n(x)= k=0 nf(kn)B k n(x)P_n(x) = \sum_{k=0}^n f(\frac{k}{n}) B^n_k(x) En effet, par continuité uniforme de ff sur [0,1][0,1], pour ε>0\epsilon&gt;0, il existe δ>0\delta&gt;0 tel que |xy|<δ|f(x)f(y)|<ε/2|x-y|&lt;\delta \Rightarrow |f(x)-f(y)|&lt;\epsilon/2, dans P n(x)f(x)= k=0 n(f(kn)f(x))B k n(x)P_n(x)-f(x)=\sum_{k=0}^n (f(\frac{k}{n})-f(x)) B^n_k(x) on décompose la somme sur kk en deux parties, |k/nx|<δ|k/n-x|&lt;\delta et |k/nx|δ|k/n-x| \geq \delta, pour la première somme, on majore |f(kn)f(x)||f(\frac{k}{n})-f(x)| par ε/2\epsilon/2 puis par k=0 n\sum_{k=0}^n, pour la deuxième somme, on majore par 2|f| 2|f|_\infty et on utilise 1<(k/nx) 2/δ 2=1/n 2/δ 2(knx) 21&lt;(k/n-x)^2/\delta^2=1/n^2/\delta^2 (k-nx)^2 pour se ramener au calcul de la variance de kk, au final |P n(x)f(x)|ε2+1n 2δ 2nx(1x)|f| |P_n(x)-f(x)| \leq \frac \epsilon 2 + \frac{1}{n^2 \delta^2} nx(1-x)|f|_\infty il suffit de choisir nn assez grand pour rendre le membre de droite plus petit que ε\epsilon.

Les polynômes de Bernstein ne sont pas des polynômes interpolateurs aux points k/n,0<k<nk/n, \, 0&lt;k&lt;n, et la convergence n’est pas forcément très rapide. On les utilise pour approcher rapidement des morceaux de courbes, si on se donne des “points de controle” A 0,...,A nA_0, ..., A_n on construit la courbe paramétrée A(t)= k=0 nA k(n i)x i(1x) niA(t) = \sum_{k=0}^n A_k \left( \begin{array}{c} n\\ i \end{array} \right) x^i (1-x)^{n-i} appelée courbe de Bézier. En pratique on les utilise pour n=3n=3.

4.5  Polynômes orthogonaux.

Il s’agit d’une autre méthode d’approximation, particulièrement important pour l’intégration : les polynômes de meilleur approximation au sens de normes L 2L^2 ou L 2L^2 à poids w(x)>0w(x)&gt;0 sur l’intervalle de bornes α\alpha et β\beta (finis ou infinis). On considère le produit scalaire <f|g>= α βw(x)f(x)g(x)dx&lt;f|g&gt;=\int_\alpha^\beta w(x) f(x)g(x) \ dx et on projette alors la fonction à approcher sur une base de polynômes orthogonaux de degrés croissants construit par la procédure de Gram-Schmidt à partir de la base canonique pour le produit scalaire ci-dessus.

Proposition 9   Le polynôme P nP_n de degré nn obtenu par orthogonalisation de Gram-Schmidt pour le produit scalaire α βw(x)f(x)g(x)dx\int_\alpha^\beta w(x) f(x)g(x) \ dx possède nn racines réelles.

En effet, soit rr le nombre de racines réelles de P nP_n, on pose f=P nf=P_n et g= i=1 r(xx i)g=\prod_{i=1}^r (x-x_i), wfgwfg est de signe constant et non identiquement nul donc <f|g>0&lt;f|g&gt; \neq 0 donc r=nr=n sinon gg serait de degré strictement plus petit que nn donc orthogonal à P nP_n.

On peut aussi construire ces polynômes en cherchant les valeurs propres de T(f)=1w(awf)T(f)=\frac{1}{w} (awf')' a>0a&gt;0 est un polynôme de degré au plus 2 sur ]α,β[]\alpha,\beta[, tel que awaw s’annule (ou tend vers 0) aux bornes de l’intervalle d’intégration : si α\alpha et β\beta sont finis a(x)=(xα)(βx)a(x)=(x-\alpha)(\beta-x). On a alors <T(f)|g>= α β(awf)g=[awfg] α β α βawgf= α βawgf&lt;T(f)|g&gt;=\int_\alpha^\beta (awf')'g = [awf'g]_\alpha^\beta-\int_\alpha^\beta awg'f' =-\int_\alpha^\beta awg'f' car le terme tout intégré s’annule (puisque awaw s’annule en α\alpha et β\beta). Donc <T(f)|g>=<f|T(g)>&lt;T(f)|g&gt;=&lt;f|T(g)&gt; est symétrique, les vecteurs propres de TT correspondant à des valeurs propres distinctes sont donc orthogonaux entre eux. Pour trouver ces valeurs propres/polynômes vecteurs propres, on écrit T(P n)=λ nP nT(P_n)=\lambda_n P_n pour un polynôme P nP_n de degré nn. Si aw/waw'/w est un polynôme de degré au plus 1, le terme de degré dominant de cette équation donne la valeur de λ n\lambda_n et les termes de degré plus petits permettent en général de déterminer de manière unique les coefficients de P nP_n en fonction du coefficient dominant.

Pour certains poids w(x)w(x) standards, les polynômes obtenus ont un nom :

Ainsi, les polynômes de Legendre vérifient ((1x 2)P n)=λ nP n((1-x^2)P_n')'=\lambda_n P_n Le terme de degré nn de cette équation donne λ n=n(n+1)\lambda_n=-n(n+1), le terme sous-dominant est nul. Plus générallement, le terme de degré kk vérifie (k+2)(k+1)p k+2k(k+1)p k=n(n+1)p kp k+2=k(k+1)n(n+1)(k+2)(k+1)p k(2) (k+2)(k+1)p_{k+2}-k(k+1)p_k=-n(n+1)p_k \Rightarrow p_{k+2}=\frac{k(k+1)-n(n+1)}{(k+2)(k+1)} p_k \qquad (2) Ceci permet de calculer le polynôme P nP_n, on normalise P nP_n par P n(1)=1P_n(1)=1.




Le calcul de ces polynômes peut aussi se faire par une récurrence à 2 crans du type : P n+1=(a nxb n)P nc nP n1(3) P_{n+1}=(a_nx-b_n)P_n-c_nP_{n-1} \qquad (3) La valeur de a na_n est définie par la normalisation de la famille de polynômes, ensuite b nb_n et c nc_n sont déterminés respectivement par <P n+1|P n>=0b n<P n|P n>=a n<xP n|P n>&lt;P_{n+1}|P_n&gt;=0 \Rightarrow b_n&lt;P_n|P_n&gt;=a_n&lt;xP_n|P_n&gt; et <P n+1|P n1>=0c n<P n1|P n1>=a n<xP n|P n1>=a n<P n|xP n1>&lt;P_{n+1}|P_{n-1}&gt;=0 \Rightarrow c_n&lt;P_{n-1}|P_{n-1}&gt;=a_n&lt;xP_n|P_{n-1}&gt;=a_n&lt;P_n|xP_{n-1}&gt; donc c n<P n1|P n1>=a na n1<P n|P n+b n1P n1+c n1P n2>=a na n1<P n|P n>c_n&lt;P_{n-1}|P_{n-1}&gt;=\frac{a_n}{a_{n-1}}&lt;P_n|P_n+b_{n-1}P_{n-1}+c_{n-1}P_{n-2}&gt; =\frac{a_n}{a_{n-1}}&lt;P_n|P_n&gt; Les autres relations d’orthogonalité <P n+1|P j>=0,j<n1&lt;P_{n+1}|P_j&gt;=0, j&lt;n-1 sont automatiquement vérifiées puisque <xP n|P j>=<P n|xP j>=0&lt;xP_n|P_j&gt;=&lt;P_n|xP_j&gt;=0 et P nP_n est orthogonal aux polynômes de degré n1\leq n-1.

Dans l’exemple des polynômes de Legendre, les polynômes obtenus sont pairs si nn est pair et impairs sinon, la relation de récurrence a donc un coefficient b nb_n nul. La convention de normalisation usuelle est P n(1)=1P_n(1)=1, on peut montrer qu’on a a n=(2n+1)/(n+1)a_n=(2n+1)/(n+1) et <P n|P n>=2/(2n+1)&lt;P_n|P_n&gt;=2/(2n+1) donc c n=n/(n+1)c_n=n/(n+1). (n+1)P n+1=(2n+1)xP nnP n1(n+1)P_{n+1}=(2n+1)xP_n-nP_{n-1} En effet la normalisation en 1 donne 1=a nc n1=a_n-c_n donc c n=a n1c_n=a_n-1, les termes de degré n+1n+1 et n1n-1 de P n+1=a nxP nc nP n1P_{n+1}=a_nxP_n-c_nP_{n-1} donnent p n+1,n+1=a np n,n,p n+1,n1=a np n,n2(a n1)p n1,n1p_{n+1,n+1}=a_np_{n,n}, \quad p_{n+1,n-1}=a_n p_{n,n-2}-(a_n-1)p_{n-1,n-1} On applique alors (??) et on déduit de la deuxième équation ci-dessus : n(n+1)2(2n+1)p n+1,n+1=n(n1)2(2n+1)a np n,n(a n1)p n1,n1-\frac{n(n+1)}{2(2n+1)} p_{n+1,n+1}= -\frac{n(n-1)}{2(2n+1)} a_n p_{n,n}-(a_n-1)p_{n-1,n-1} puis on applique la première : n(n+1)2(2n+1)n(n1)2(2n+1)=a n1a na n1\frac{n(n+1)}{2(2n+1)} - \frac{n(n-1)}{2(2n+1)}=\frac{a_n-1}{a_na_{n-1}} d’où a n=11n 24n 21a n1a_n=\frac{1}{1-\frac{n^2}{4n^2-1} a_{n-1}}







Remarques

4.6  Les splines

Il s’agit de fonctions définies par des polynomes de degré borné sur des intervalles, dont on fixe la valeur aux extrémités des intervalles (comme pour le polynome de Lagrange) ce qui rend la fonction continue, de plus on exige un degré de régularité plus grand, par exemple etre de classe C 2C^2. Enfin, on fixe des conditions aux bornes de la réunion des intervalles, par exemple avoir certaines dérivées nulles.

Par exemple supposons qu’on se donne nn intervalles, donc n+1n+1 points x 0,...,x nx_0,...,x_n, on se fixe une régularité C d1C^{d-1}. Ceci entraine (n1)d(n-1)d conditions de recollement, on y ajoute n+1n+1 conditions de valeur en x 0,...,x nx_0,...,x_n, on a donc nd+1nd+1 conditions, la borne sur le degré des polynomes doit donc etre dd (ou plus, mais dd suffit) ce qui donne n(d+1)n(d+1) degrés de liberté, on peut donc ajouter d1d-1 conditions, par exemple pour les splines naturelles, on impose que les dérivées d’ordre d/2d/2 à d1d-1 soient nulles en x 0x_0 et x nx_n (si dd est pair, on commence à la dérivée d/2+1d/2+1-ième nulle en x nx_n).

Pour trouver les polynomes, on doit donc résoudre un grand système linéaire. Une méthode permettant de diminuer la taille du système linéaire à résoudre dans le cas des splines naturelles consiste à se fixer nn inconnues z 0,..,z n1z_0,..,z_{n-1} représentant les dérivées dd-ième de la spline ff en x 0x_0 sur [x 0,x 1][x_0,x_1] à x n1x_{n-1} sur [x n1,x n][x_{n-1},x_n], et (d1)/2(d-1)/2 inconnues f jf_j, représentant la valeur de la dérivée de ff en x 0x_0 pour jj variant de 1 à (d1)/2(d-1)/2. On peut alors écrire le polynome sur l’intervalle [x 0,x 1][x_0,x_1] car on connait son développement de Taylor en x 0x_0. On effectue un changement d’origine (par application répétée de Horner) en x 1x_1. On obtient alors le polynome sur [x 1,x 2][x_1,x_2] en remplaçant uniquement la dérivée dd-ième par z 1z_1. On continue ainsi jusqu’en x n1x_{n-1}. Le système s’obtient en calculant la valeur du polynome en x 0,...,x nx_0,...,x_n et la nullité des dérivées d’ordre (d1)/2(d-1)/2 à d/2d/2 en x nx_n. On résoud le système et on remplace pour avoir les valeurs numériques des coefficients du polynome.

4.7  Autres approximations polynomiales.

On peut citer le polynôme de Taylor en un point qui donne une bonne approximation près du point (voir aussi ci-dessus le polynôme de Hermite), les approximants de Padé où on approche par le quotient de 2 polynômes (ceci donne parfois de très bons résultats comme pour la fonction exponentielle près de 0 par exemple).

On observe que le dénominateur est le numérateur pris en x-x. Ceci permet de calculer précisément e xe^x par exemple sur [1,1][-1,1] en très peu d’opérations arithmétiques, calcul de X=xxX=xx, puis de a=(30X+3360)X+30240,b=x((X+420)X+15120)a=(30X+3360)X+30240, b=x((X+420)X+15120) puis (a+b)/(ab)(a+b)/(a-b), soit 5 multiplications, 6 additions, 1 division.

On utilise aussi souvent des approximations distinctes selon l’intervalle considéré, par exemple l’interpolation linéaire par morceaux, les fonctions splines ... ou la réduction d’arguments pour se ramener à un intervalle avec une bonne apprixomation (par exemple e x=(e x/2) 2e^x=(e^{x/2})^2)

5  Intégration numérique

Les fractions rationnelles admettent une primitive que l’on calcule en décomposant la fraction avec Bézout comme expliqué précédemment. Mais elles font figure d’exceptions, la plupart des fonctions n’admettent pas de primitives qui s’expriment à l’aide des fonctions usuelles. Pour calculer une intégrale,on revient donc à la définition d’aire sous la courbe, aire que l’on approche, en utilisant par exemple un polynome de Lagrange.

Le principe est donc le suivant : on découpe l’intervalle d’intégration en subdivisions [a,b]=[a,a+h]+[a+h,a+2h]+...[a+(n1)h,a+nh=b[a,b]=[a,a+h] + [a+h,a+2h]+...[a+(n-1)h,a+nh=b, où h=(ba)/nh=(b-a)/n est le pas de la subdivision, et sur chaque subdivision, on approche l’aire sous la courbe.

5.1  Les rectangles et les trapèzes

Sur une subdivision [α,β][\alpha,\beta], on approche la fonction par un segment. Pour les rectangles, il s’agit d’une horizontale : on peut prendre f(α)f(\alpha), f(β)f(\beta) (rectangle à droite et gauche) ou f((α+β)/2)f((\alpha+\beta)/2) (point milieu), pour les trapèzes on utilise le segment reliant [α,f(α)][\alpha,f(\alpha)] à [β,f(β)][\beta,f(\beta)].

Exemple : calcul de la valeur approchée de 0 1t 3dt\int_0^1 t^3 dt (on en connait la valeur exacte 1/4=0.251/4=0.25) par ces méthodes en subdivisant [0,1][0,1] en 10 subdivisions (pas h=1/10h=1/10), donc α=j/10\alpha=j/10 et β=(j+1)/10\beta=(j+1)/10 pour jj variant de 0 à 9. Pour les rectangles à gauche, on obtient sur une subdivision f(α)=(j/10) 3f(\alpha)=(j/10)^3 que l’on multiplie par la longueur de la subdivision soit h=1/10h=1/10 : 110 j=0 9(j10) 3=81400=0.2025 \frac{1}{10} \sum_{j=0}^9 (\frac{j}{10})^3 = \frac{81}{400} = 0.2025 Pour les rectangles à droite, on obtient 110 j=1 10(j10) 3=121400=0.3025 \frac{1}{10} \sum_{j=1}^{10} (\frac{j}{10})^3 = \frac{121}{400} = 0.3025 Pour le point milieu f((α+β)/2)=f((j/10+(j+1)/10)/2)=f(j/10+1/20)f((\alpha+\beta)/2)=f((j/10+(j+1)/10)/2)=f(j/10+1/20) 110 j=0 9(j10+120) 3=199/800=0.24875 \frac{1}{10} \sum_{j=0}^9 (\frac{j}{10}+\frac{1}{20})^3 = 199/800 = 0.24875 Enfin pour les trapèzes, l’aire du trapèze délimité par l’axe des xx, les verticales y=αy=\alpha, y=βy=\beta et les points sur ces verticales d’ordonnées respectives f(α)f(\alpha) et f(β)f(\beta) vaut hf(α)+f(β)2 h \frac{f(\alpha)+f(\beta)}{2} donc 110 j=0 9((j10) 3+(j+110) 3)=101400=0.2525 \frac{1}{10} \sum_{j=0}^9 \left( (\frac{j}{10})^3 +(\frac{j+1}{10})^3 \right) = \frac{101}{400} = 0.2525 Dans la somme des trapèzes, on voit que chaque terme apparait deux fois sauf le premier et le dernier.

Plus généralement, les formules sont donc les suivantes : rectangle gauche = h j=0 n1f(a+jh) rectangle droit = h j=1 nf(a+jh) point milieu = h j=0 n1f(a+jh+h2) trapezes = h(f(a)+f(b)2+ j=1 n1f(a+jh))(4) \begin{matrix} \mbox{rectangle gauche} & = & h \sum_{j=0}^{n-1} f(a+jh) \\ \mbox{rectangle droit} & = & h \sum_{j=1}^{n} f(a+jh) \\ \mbox{point milieu} & = & h \sum_{j=0}^{n-1} f(a+jh+\frac{h}{2}) \\ \mbox{ trapezes } & = & h \left(\frac{f(a)+f(b)}{2}+\sum_{j=1}^{n-1} f(a+jh) \right) \end{matrix} \qquad (4) h=(ba)/nh=(b-a)/n est le pas de la subdivision, nn le nombre de subdivisions.





On observe sur l’exemple que le point milieu et les trapèzes donnent une bien meilleure précision que les rectangles. Plus généralement, la précision de l’approximation n’est pas la même selon le choix de méthode. Ainsi pour les rectangles à gauche (le résultat est le même à droite), si ff est continument dérivable, de dérivée majorée par une constante M 1M_1 sur [a,b][a,b], en faisant un développement de Taylor de ff en α\alpha, on obtient | α βf(t)dt α βf(α)dt|=| α βf(θ t)(tα)dt|M 1 α β(tα)dt=M 1(βα) 22 |\int_{\alpha}^{\beta} f(t) dt - \int_{\alpha}^{\beta} f(\alpha) dt | = | \int_{\alpha}^{\beta} f'(\theta_t)(t-\alpha) dt | \leq M_1 \int_{\alpha}^{\beta} (t-\alpha) dt = M_1\frac{(\beta-\alpha)^2}{2} Ainsi dans l’exemple, on a M 1=3M_1=3, l’erreur est donc majorée par 0.0150.015 sur une subdivision, donc par 0.150.15 sur les 10 subdivisions.

Pour le point milieu, on fait le développement en (α+β)/2(\alpha+\beta)/2 à l’ordre 2, en supposant que ff est deux fois continument dérivable : | α βf(t) α βf(α+β2)| = | α βf(α+β2)(tα+β2)dt + α βf(θ t)2(tα+β2) 2| M 222 α+β2 β(tα+β2) 2dt M 2(βα) 324 \begin{matrix} |\int_{\alpha}^{\beta} f(t) - \int_{\alpha}^{\beta} f(\frac{\alpha+\beta}{2}) | &= &| \int_{\alpha}^{\beta} f'(\frac{\alpha+\beta}{2})(t-\frac{\alpha+\beta}{2}) dt \\ & & + \int_{\alpha}^{\beta} \frac{f'{'}(\theta_t)}{2}(t-\frac{\alpha+\beta}{2})^2 | \\ &\leq & \frac{M_2}{2} 2 \int_{\frac{\alpha+\beta}{2}}^{\beta} (t-\frac{\alpha+\beta}{2})^2 dt \\ & \leq & M_2\frac{(\beta-\alpha)^3}{24} \end{matrix} Dans l’exemple, on a M 2=6M_2=6, donc l’erreur sur une subdivision est majorée par 0.25e30.25e-3, donc sur 10 subdivisions par 0.25e2=0.00250.25e-2=0.0025.

Pour les trapèzes, la fonction gg dont le graphe est le segment reliant [α,f(α)][\alpha,f(\alpha)] à [β,f(β)][\beta,f(\beta)] est f(α)+(tα)/(βα)f(β)f(\alpha)+(t-\alpha)/(\beta-\alpha)f(\beta), c’est en fait un polynome de Lagrange, si ff est deux fois continument dérivable, on peut donc majorer la différence entre ff et gg en utilisant (??), on intègre la valeur absolue ce qui donne | α βf(t)dt α βg(t)dt| α β|f(ξ x)2(xα)(xβ)|M 2(βα) 312 |\int_{\alpha}^{\beta} f(t) dt - \int_{\alpha}^{\beta} g(t) dt | \leq \int_{\alpha}^{\beta} |\frac{f'{'}(\xi_x)}{2} (x-\alpha)(x-\beta)| \leq M_2 \frac{(\beta-\alpha)^3}{12} M 2M_2 est un majorant de |f||f'{'}| sur [a,b][a,b].

Lorsqu’on calcule l’intégrale sur [a,b][a,b] par une de ces méthodes, on fait la somme sur n=(ba)/hn=(b-a)/h subdivisions de longueur βα=h\beta-\alpha=h, on obtient donc une majoration de l’erreur commise sur l’intégrale :

Lorsque hh tend vers 0, l’erreur tend vers 0, mais pas à la même vitesse, plus rapidement pour les trapèzes et le point milieu que pour les rectangles. Plus on approche précisément la fonction sur une subdivision, plus la puissance de hh va être grande, plus la convergence sera rapide lorsque hh sera petit, avec toutefois une contrainte fixée par la valeur de M kM_k, borne sur la dérivée kk-ième de ff (plus kk est grand, plus M kM_k est grand en général). Nous allons voir dans la suite comment se comporte cette puissance de hh en fonction de la facon dont on approche ff.

5.2  Ordre d’une méthode

On appelle méthode d’intégration l’écriture d’une approximation de l’intégrale sur une subdivision sous la forme α βf(t)dtI(f)= j=1 kw jf(x j) \int_{\alpha}^{\beta} f(t) dt \approx I(f)=\sum_{j=1}^k w_j f(x_j) où les x jx_j sont dans l’intervalle [α,β][\alpha,\beta], par exemple équirépartis sur [α,β][\alpha,\beta]. On utilise aussi la définition : α βf(t)dtI(f)=(βα) j=1 kw˜ jf(x j) \int_{\alpha}^{\beta} f(t) dt \approx I(f)= (\beta-\alpha)\sum_{j=1}^k \tilde{w}_j f(x_j) On prend toujours jw j=βα\sum_j w_j=\beta-\alpha (ou jw˜ j=1\sum_j \tilde{w}_j=1) pour que la méthode donne le résultat exact si la fonction est constante.

On dit qu’une méthode d’intégration est d’ordre nn si il y a égalité ci-dessus pour tous les polynômes de degré inférieur ou égal à nn et non égalité pour un polynôme de degré n+1n+1. Par exemple, les rectangles à droite et gauche sont d’ordre 0, le point milieu et les trapèzes sont d’ordre 1. Plus généralement, si on approche ff par son polynôme d’interpolation de Lagrange en n+1n+1 points (donc par un polynôme de degré inférieur ou égal à nn), on obtient une méthode d’intégration d’ordre au moins nn.

Si une méthode est d’ordre nn avec des w j0w_j\geq 0 et si ff est n+1n+1 fois continument dérivable, alors sur une subdivision, on a : | α βfI(f)|M n+1(βα) n+2(n+1)!(1n+2+1)(5) |\int_{\alpha}^{\beta} f-I(f)| \leq M_{n+1} \frac{(\beta-\alpha)^{n+2}}{(n+1)!} (\frac{1}{n+2}+1) \qquad (5)

En effet, on fait le développement de Taylor de ff par exemple en α\alpha à l’ordre nn f(t) = T n(f)+(tα) n+1(n+1)!f [n+1](θ t), T n(f) = f(α)+(tα)f(α)+...+(tα) nn!f [n](α) \begin{matrix} f(t)&=&T_{n}(f)+\frac{(t-\alpha)^{n+1}}{(n+1)!} f^{[n+1]}(\theta_t),\\ T_{n}(f)&=&f(\alpha)+(t-\alpha)f'(\alpha)+...+ \frac{(t-\alpha)^{n}}{n!} f^{[n]}(\alpha) \end{matrix} Donc | α βf α βT n(f)| α β(tα) n+1(n+1)!|f [n+1](θ t)|[M n+1(tα) n+2(n+2)!] α β |\int_{\alpha}^{\beta} f- \int_{\alpha}^{\beta} T_{n}(f)| \leq \int_{\alpha}^{\beta} \frac{(t-\alpha)^{n+1}}{(n+1)!} |f^{[n+1]}(\theta_t)| \leq \left[ M_{n+1} \frac{(t-\alpha)^{n+2}}{(n+2)!} \right]_\alpha^\beta De plus, |I(f)I(T n(f))|=|I(f [n+1](θ t)(tα) n+1(n+1)!)| j=1 k|w j|M n+1(x jα) n+1(n+1)! j=1 k|w j|M n+1(βα) n+1(n+1)! \begin{matrix} |I(f) -I(T_n(f))| =|I\left( f^{[n+1]}(\theta_t) \frac{(t-\alpha)^{n+1}}{(n+1)!} \right)| & \leq & \sum_{j=1}^k |w_j| M_{n+1} \frac{(x_j-\alpha)^{n+1}}{(n+1)!} \\ & \leq & \sum_{j=1}^k |w_j| M_{n+1} \frac{(\beta-\alpha)^{n+1}}{(n+1)!} \end{matrix} Donc comme la méthode est exacte pour T n(f)T_n(f), on en déduit que | α βfI(f)| = | α βf α βT n(f)+I(T n(f))I(f)| | α βf α βT n(f)|+|I(T n(f))I(f)| M n+1(βα) n+2(n+2)!+ j=1 k|w j|M n+1(βα) n+1(n+1)! \begin{matrix} |\int_{\alpha}^{\beta} f-I(f)| &= &|\int_{\alpha}^{\beta} f-\int_{\alpha}^{\beta} T_n(f)+I(T_n(f))- I(f)| \\ &\leq& |\int_{\alpha}^{\beta} f-\int_{\alpha}^{\beta} T_n(f)|+|I(T_n(f))- I(f)|\\ &\leq & M_{n+1} \frac{(\beta-\alpha)^{n+2}}{(n+2)!} + \sum_{j=1}^k |w_j| M_{n+1} \frac{(\beta-\alpha)^{n+1}}{(n+1)!} \end{matrix} Si les w j0w_j\geq 0, alors j=1 k|w j|= j=1 kw j=βα\sum_{j=1}^k |w_j|=\sum_{j=1}^k w_j=\beta-\alpha et on obtient finalement (??)

On remarque qu’on peut améliorer la valeur de la constante en faisant tous les développement de Taylor en (α+β)/2(\alpha+\beta)/2 au lieu de α\alpha, Après sommation sur les nn subdivisions, on obtient que :

Théorème 10   Pour une méthode d’ordre nn à coefficients positifs et une fonction ff n+1n+1 fois continument dérivable  | a bfI(f)|M n+1h n+12 n+1(n+1)!(ba)(1(n+2)+1)|\int_{a}^{b} f-I(f)| \leq M_{n+1} \frac{h^{n+1}}{2^{n+1}(n+1)!} (b-a) (\frac{1}{(n+2)}+1)

On observe que cette majoration a la bonne puissance de hh sur les exemples déja traités, mais pas forcément le meilleur coefficient possible, parce que nous avons traité le cas général d’une méthode d’ordre nn, et utilisé une majoration pas toujours optimale du reste. Pour obtenir la meilleure valeur possible de la constante, il faut exprimer le reste de la formule de Taylor sous forme intégrale et utiliser la forme précise de la méthode : f(t)=T n(f)(t)+ α t(tx) nn!f [n+1](x)Unknown characterdxf(t)=T_n(f)(t)+\int_\alpha^t \frac{(t-x)^n}{n!} f^{[n+1]}(x) \ dx donc α βf α βT n(f)= α β α t(tx) nn!f [n+1](x)dxdt= α β α β(tx) + nn!f [n+1](x)dxdt\int_{\alpha}^{\beta} f- \int_{\alpha}^{\beta} T_{n}(f) = \int_{\alpha}^{\beta} \int_\alpha^t\frac{(t-x)^{n}}{n!} f^{[n+1]}(x) \ dx \ dt = \int_{\alpha}^{\beta} \int_\alpha^\beta \frac{(t-x)_+^{n}}{n!} f^{[n+1]}(x) \ dx \ dt (tx) +=(t-x)_+=max(0,tx)(0,t-x). En intervertissant les deux intégrales (Fubini), on obtient : α βf α βT n(f) = α β α β(tx) + nn!dtf [n+1](x)dx = α β x β(tx) + nn!dtf [n+1](x)dx = α β(βx) n+1(n+1)!f [n+1](x)dx \begin{matrix} \int_{\alpha}^{\beta} f- \int_{\alpha}^{\beta} T_{n}(f) &=& \int_{\alpha}^{\beta} \int_\alpha^\beta \frac{(t-x)_+^{n}}{n!} \ dt f^{[n+1]}(x) \ dx \\ &=& \int_{\alpha}^{\beta} \int_x^\beta \frac{(t-x)_+^{n}}{n!} \ dt f^{[n+1]}(x) \ dx\\ &=& \int_{\alpha}^{\beta} \frac{(\beta-x)^{n+1}}{(n+1)!} f^{[n+1]}(x) \ dx \end{matrix} D’autre part : I(f)I(T n(f)) = I( α β(xt) + nn!f [n+1](t)dt) = j=1 kw j α β(x jt) + nn!f [n+1](t)dt \begin{matrix} I(f)-I(T_n(f)) &=& I\left( \int_\alpha^\beta \frac{(x-t)_+^{n}}{n!} f^{[n+1]}(t) \ dt \right) \\ & = & \sum_{j=1}^k w_j \int_\alpha^\beta \frac{(x_j-t)_+^{n}}{n!} f^{[n+1]}(t) \ dt \end{matrix} Donc : α βfI(f)= α β((βx) n+1(n+1)! j=1 kw j(x jx) + nn!)f [n+1](x)dx\int_{\alpha}^{\beta} f-I(f) = \int_{\alpha}^{\beta} ( \frac{(\beta-x)^{n+1}}{(n+1)!} - \sum_{j=1}^k w_j \frac{(x_j-x)_+^{n}}{n!}) f^{[n+1]}(x) \ dx On appelle noyau de Péano l’expression N(x)=(βx) n+1(n+1)! j=1 kw j(x jx) + nn!N(x)=\frac{(\beta-x)^{n+1}}{(n+1)!} - \sum_{j=1}^k w_j \frac{(x_j-x)_+^{n}}{n!} On a alors : | α βfI(f)| α β|N(x)||f [n+1](x)|dxM n+1 α β|N(x)|dx|\int_{\alpha}^{\beta} f-I(f)| \leq \int_{\alpha}^{\beta} |N(x)| |f^{[n+1]}(x)| \ dx \leq M_{n+1} \int_{\alpha}^{\beta} |N(x)| \ dx

5.3  Simpson

Il s’agit de la méthode obtenue en approchant la fonction sur la subdivision [α,β][\alpha,\beta] par son polynome de Lagrange aux points α,(α+β)/2,β\alpha,(\alpha+\beta)/2,\beta. On calcule l’intégrale par exemple avec un logiciel de calcul formel, avec Xcas :

qui donne la formule sur une subdivision I(f)=h6(f(α)+4f(α+β2)+f(β)) I(f) = \frac{h}{6} (f(\alpha)+4f(\frac{\alpha+\beta}{2}) + f(\beta)) et sur [a,b][a,b] : I(f)=h6(f(a)+f(b)+4 j=0 n1f(a+jh+h2)+2 j=1 n1f(a+jh))(6) I(f) = \frac{h}{6} \left( f(a)+f(b)+ 4 \sum_{j=0}^{n-1} f(a+jh+\frac{h}{2}) + 2 \sum_{j=1}^{n-1} f(a+jh) \right) \qquad (6)



Si on intègre t 3t^3 sur [0,1][0,1] en 1 subdivision par cette méthode, on obtient 16(0+412 3+1)=14 \frac{1}{6} (0+ 4 \frac{1}{2^3} + 1)=\frac{1}{4} c’est-à-dire le résultat exact, ceci est aussi vérifié pour ff polynome de degré inférieur ou égal à 2 puisque l’approximation de Lagrange de ff est alors égale à ff. On en déduit que la méthode de Simpson est d’ordre 3 (pas plus car la méthode de Simpson appliquée à l’intégrale de t 4t^4 sur [0,1][0,1] n’est pas exacte). On peut améliorer la constante générale de la section précédente pour la majoration de l’erreur en : | a bfI(f)|h 42880(ba)M 4 |\int_a^b f - I(f)| \leq \frac{h^4}{2880} (b-a) M_4 En effet sur une subdivision élémentaire [α,β][\alpha,\beta], le noyau de Péano vaut : N(x) = (βx) 44!16(βx) + 33!23(α+β2x) + 33!16(αx) + 33! = (βx) 44!16(βx) 33!23(α+β2x) + 33! \begin{matrix} N(x) &=& \frac{(\beta-x)^4}{4!} - \frac16 \frac{(\beta-x)_+^{3}}{3!} -\frac23 \frac{(\frac{\alpha+\beta}2-x)_+^{3}}{3!} - \frac16 \frac{(\alpha-x)_+^{3}}{3!} \\ & =& \frac{(\beta-x)^4}{4!} - \frac16 \frac{(\beta-x)^{3}}{3!} -\frac23 \frac{(\frac{\alpha+\beta}2-x)_+^{3}}{3!} \end{matrix} on observe que N(x)0N(x)\leq 0 sur [α,β][\alpha,\beta]


et son intégrale vaut 1/2880(βα) 4-1/2880(\beta-\alpha)^4 :

La méthode de Simpson nécessite 2n+12n+1 évaluations de ff (le calcul de ff est un point étant presque toujours l’opération la plus couteuse en temps d’une méthode de quadrature), au lieu de nn pour les rectangles et le point milieu et n+1n+1 pour les trapèzes. Mais on a une majoration en h 4h^4 au lieu de h 2h^2 donc le “rapport qualité-prix” de la méthode de Simpson est meilleur, on l’utilise donc plutot que les méthodes précédentes sauf si ff n’a pas la régularité suffisante (ou si M 4M_4 est trop grand).

5.4  Newton-Cotes

On peut généraliser l’idée précédente, découper la subdivision [α,β][\alpha,\beta] en nn parts égales et utiliser le polynôme d’interpolation en ces n+1n+1 points x 0=α,x 1,...,x n=βx_0=\alpha, x_1, ..., x_n=\beta. Ce sont les méthodes de Newton-Cotes, qui sont d’ordre nn au moins. Comme le polynôme d’interpolation dépend linéairement des ordonnées, cette méthode est bien de la forme : I(f)=(βα) j=0 nw˜ jf(x j) I(f)=(\beta-\alpha)\sum_{j=0}^n \tilde{w}_j f(x_j) De plus les w˜ j\tilde{w}_j sont universels (ils ne dépendent pas de la subdivision), parce qu’on peut faire le changement de variables x=α+t(βα)x=\alpha+t(\beta-\alpha) dans l’intégrale et le polynôme d’interpolation et donc se ramener à [0,1][0,1].

Exemple : on prend le polynôme d’interpolation en 5 points équidistribués sur une subdivision [a,b][a,b] (méthode de Boole). Pour calculer les w˜ j\tilde{w}_j, on se ramène à [0,1][0,1], puis on tape

et on lit les coefficients de f0 à f4 qui sont les w˜ 0\tilde{w}_0 à w˜ 4\tilde{w}_4: 7/90, 32/90, 12/90, 32/90, 7/90. Voir aussi la section 5.5 La méthode est d’ordre au moins 4 par construction, mais on vérifie qu’elle est en fait d’ordre 5 (exercice), la majoration de l’erreur d’une méthode d’ordre 5 est | a bfI(f)|M 62 66!(1+17)h 6(ba) |\int_a^b f -I(f)| \leq \frac{M_6}{2^6 6!}(1+\frac{1}{7}) h^6 (b-a) elle peut être améliorée pour cette méthode précise en | a bfI(f)|M 61935360h 6(ba) |\int_a^b f -I(f)| \leq \frac{M_6}{1935360} h^6 (b-a)

En pratique, on ne les utilise pas très souvent, car d’une part pour n8n\geq 8, les w jw_j ne sont pas tous positifs, et d’autre part, parce que la constante M nM_n devient trop grande. On préfère utiliser la méthode de Simpson en utilisant un pas plus petit.

Il existe aussi d’autres méthodes, par exemple les quadratures de Gauss (on choisit d’interpoler en utilisant des points non équirépartis tels que l’ordre de la méthode soit le plus grand possible, cf. infra) ou la méthode de Romberg qui est une méthode d’accélération de convergence basée sur la méthode des trapèzes (on prend la méthode des trapèzes en 1 subdivision de [a,b][a,b], puis 2, puis 2 22^2, ..., et on élimine les puissances de hh du reste fI(f)\int f-I(f) en utilisant un théorème d’Euler-Mac Laurin qui montre que le développement asymptotique de l’erreur en fonction de hh ne contient que des puissances paires de hh). De plus, on peut être amené à faire varier le pas hh en fonction de la plus ou moins grande régularité de la fonction.

5.5  Calcul des poids w iw_i

Si la méthode d’intégration consiste à interpoler ff en nn points x 0,...,x nx_0,...,x_n, alors la méthode est exacte pour tout polynôme de degré nn. Si on prend P j(x)= kj(xx k)P_j(x)=\prod_{k \neq j}(x-x_k), on en déduit : α βP j(x)dx=w jP j(x j)\int_\alpha^\beta P_j(x) \ dx = w_j P_j(x_j) Par exemple en interpolant en 0,1/2,10,1/2,1 sur [0,1][0,1], on obtient w 0P 0(0)= 0 1P 0(x)dx,P 0(x)=(x12)(x1)w_0 P_0(0)=\int_0^1 P_0(x) \ dx, \quad P_0(x)=(x-\frac12)(x-1)


On peut aussi résoudre un système linéaire en prenant pour ff les polynômes de la base canonique, la matrice du système est la transposée de la matrice de Vandermonde en les x jx_j et le second membre a pour jj-ième composante α βx jdx\int_\alpha^\beta x^j \ dx.

5.6  En résumé

Intégration sur [a,b][a,b], hh pas d’une subdivision, M kM_k majorant de la dérivée kk-ième de la fonction sur [a,b][a,b]

 formuleLagrange degréordreerreur
rectangles(??), (??)00M 1h(ba)/2M_1 h (b-a)/2
point milieu(??)01M 2h 2(ba)/24M_2 h^2 (b-a)/24
trapèzes(??)11M 2h 2(ba)/12M_2 h^2 (b-a)/12
Simpson(??)23M 4h 4(ba)/2880M_4 h^4 (b-a)/2880

5.7  Accélération de Richardson-Romberg

Proposition 11   Soit gg une fonction de classe C 2kC^{2k} sur [a,b][a,b], T h(g)T_h(g) la valeur de la méthode des trapèzes sur [a,b][a,b] de pas h=(ba)/Nh=(b-a)/N (NN entier). Alors T h(g)T_h(g) admet un développement en puissances paires de hh à l’ordre 2k2k.

Pour montrer ce résultat, il faut établir la formule d’Euler-Mac Laurin. On commence par se placer sur une subdivision de l’intervalle [0,1][0,1], on intègre par parties 0 1f(t)dt\int_0^1 f(t)\ dt en faisant apparaitre la formule des trapèzes, on intègre donc 1 en syntax error at token $ 0 1f(t)dt=[(t12)f(t)] 0 1 0 1(t12)f(t)dt=f(0)+f(1)2 0 1(t12)f(t)dt\int_0^1 f(t) \ dt = [(t-\frac12)f(t)]_0^1 - \int_0^1 (t-\frac12)f'(t) \ dt = \frac{f(0)+f(1)}{2} - \int_0^1 (t-\frac12)f'(t) \ dt où encore T 1(f)= 0 1f(t)dt+ 0 1(t12)f(t)dtT_1(f)=\int_0^1 f(t) \ dt + \int_0^1 (t-\frac12)f'(t) \ dt Pour poursuivre, on pose syntax error at token $, qu’on va intégrer en 12((t12) 2+c)\frac12((t-\frac12)^2+c), où on choisit cc pour que l’intégrale soit nulle, donc c=1/6c=-1/6. On pose B 2=(t12) 21/6B_2=(t-\frac12)^2-1/6, on a : T 1(f)= 0 1f(t)dt+[B 22f] 0 1 0 1B 22f(t)dtT_1(f)=\int_0^1 f(t) \ dt + [\frac{B_2}{2} f']_0^1 - \int_0^1 \frac{B_2}{2}f'{'}(t) \ dt Plus généralement, on pose B p+1=pB p, 0 1B p+1(t)dt=0B_{p+1}'=pB_p, \quad \int_0^1 B_{p+1}(t) \ dt=0 ce qui définit de manière unique les B pB_p. La nullité de l’intégrale montre que B p+1(1)=B p+1(0)B_{p+1}(1)=B_{p+1}(0) ce qui simplifiera l’expression des termes tout intégrés. De plus, on montre par récurrence que les B pB_p ont une symétrie paire ou impaire selon la parité de pp par rapport à t=1/2t=1/2. Après pp intégrations par parties, on obtient : T 1(f) = 0 1f(t)dt+B 2(0)2(f(1)f(0))+... +B 2k(0)(2k)!(f [2k1](1)f [2k1](0)) 0 1B 2k(2k)!f [2k](t)dt \begin{matrix} T_1(f)&=&\int_0^1 f(t) \ dt + \frac{B_2(0)}{2} (f'(1)-f'(0)) + ... \\ & &+ \frac{B_{2k}(0)}{(2k)!} (f^{[2k-1]}(1)-f^{[2k-1]}(0)) - \int_0^1 \frac{B_{2k}}{(2k)!} f^{[2k]}(t) \ dt \end{matrix} En faisant le même raisonnement sur [k,k+1][k,k+1] pour k=1,...,N1k=1,...,N-1 et en sommant, on obtient la formule d’Euler-Mac Laurin : T 1 [0,N](f) = 0 Nf(t)dt+B 2(0)2(f(N)f(0))+... +B 2k(0)(2k)!(f [2k1](N)f [2k1](0)) 0 NB 2k(2k)!f [2k](t)dt \begin{matrix} T_1^{[0,N]}(f)&=&\int_0^N f(t) \ dt + \frac{B_2(0)}{2} (f'(N)-f'(0)) + ... \\ & & + \frac{B_{2k}(0)}{(2k)!} (f^{[2k-1]}(N)-f^{[2k-1]}(0)) - \int_0^N \frac{B_{2k}}{(2k)!} f^{[2k]}(t) \ dt \end{matrix} On pose alors x=a+htx=a+ht (donc dt=dx/hdt=dx/h) et f(t)=g(x)f(t)=g(x) (donc f(t)=df/dt=hdg/dxf'(t)=df/dt=h dg/dx), on obtient 1hT h [a,b](g) = 1h 0 Ng(x)dx+B 2(0)2h(g(b)g(a))+... +B 2k(0)(2k)!h 2k1(g [2k1](N)g [2k1](0)) 0 NB 2k(2k)!h 2kg [2k](x)1hdx \begin{matrix} \frac1h T_h^{[a,b]}(g)&=& \frac1h \int_0^N g(x) \ dx + \frac{B_2(0)}{2} h(g'(b)-g'(a)) + ... \\ & &+ \frac{B_{2k}(0)}{(2k)!} h^{2k-1} (g^{[2k-1]}(N)-g^{[2k-1]}(0)) - \int_0^N \frac{B_{2k}}{(2k)!} h^{2k} g^{[2k]}(x) \ \frac1h dx \end{matrix} donc T h [a,b](g) = 0 Ng(x)dx+h 2B 2(0)2(g(b)g(a))+... +h 2kB 2k(0)(2k)!(g [2k1](N)g [2k1](0))h 2k 0 NB 2k(2k)!g [2k](x)dx \begin{matrix} T_h^{[a,b]}(g) &=& \int_0^N g(x) \ dx + h^2 \frac{B_2(0)}{2} (g'(b)-g'(a)) + ... \\ & & + h^{2k} \frac{B_{2k}(0)}{(2k)!} (g^{[2k-1]}(N)-g^{[2k-1]}(0)) - h^{2k} \int_0^N \frac{B_{2k}}{(2k)!} g^{[2k]}(x) \ dx \end{matrix}

L’accélération consiste à éliminer les puissances de h 2h^2 en commençant par h 2h^2 avec des subdivisions deux fois plus fines à chaque itération. Ainsi T h 1(f)=(4T h/2(f)T h(f))/(41)T_h^1(f) = (4T_{h/2}(f)-T_h(f))/(4-1) n’a plus de termes en h 2h^2 et tend vers l’intégrale à approcher lorsque hh tend vers 0. On peut d’ailleurs vérifier qu’il s’agit de la méthode de Simpson. On élimine ensuite le terme en h 4h^4 en posant T h 2(f)=(4 2T h/2 1(f)T h 1(f))/(4 21)T_h^2(f)=(4^2 T_{h/2}^1(f)-T_h^1(f))/(4^2-1) et ainsi de suite. On construit un tableau triangulaire T dont chaque ligne ll contient T h/2 l(f),T h/2 l 1(f),...T_{h/2^l}(f), T_{h/2^l}^1(f), ... (avec des indices qui commencent à 0). Pour calculer le terme d’indice 0 de la ligne courante on fait une méthode des trapèzes sur 2 fois plus de subdivisions que la précédente, puis pour le jj-ième terme T[l,j] on effectue (4^j*T[l-1,j-1]-T[l,j-1])/(4^j-1) (on n’a donc besoin que de la ligne précédente pour calculer la ligne courante). On s’arrête par exemple lorsque la valeur absolue de la différence entre les derniers termes de deux lignes consécutives est inférieur à la précision souhaitée (erreur empirique).

5.8  Cas des fonctions périodiques.

Si ff est une fonction périodique régulière (C C^\infty), alors la méthode des trapèzes sur une période est d’ordre arbitrairement grand. En effet, pour une série de Fourier tronquée à l’ordre mm, la formule des trapèzes avec NN subdivisions donne le résultat exact de 0 Tf(t)dt\int_0^T f(t) dt dès que N>mN&gt;m. Il suffit ensuite d’utiliser que le reste de la série de Fourier (m>Nm&gt;N) a des coefficients à décroissance rapide.

La méthode des trapèzes donne donc de bons résultats pour une fonction périodique, on peut d’ailleurs aussi l’appliquer pour calculer une valeur approchée des coefficients de Fourier de la fonction. La liste des valeurs approchées obtenue est alors la transformée de Fourier discrète des valeurs de la fonction ff aux NN points de la subdivision, elle se calcule donc rapidement avec la transformée de Fourier rapide. Par exemple, pour approcher f(x)=e sin(x)f(x)=e^{\sin(x)}, on peut utiliser les commandes suivantes en Xcas :

f(x):=exp(sin(x));
N:=16; F:=seq(f(k/N*2.*pi),k,0,N-1); G:=fft(F);
k:=4;
g:=G[0]+sum(G[j]*exp(i*j*x),j,1,k)+sum(G[N-j]*exp(-i*j*x),j,1,k);
h:=normal(re(exp2trig(g)/N));



Ou directement 2*re(G[j]/N) est une valeur approchée du jj-ième coefficient de Fourier a ja_j de ff, et -2*im(G[j]/N) de b jb_j, par exemple :


On observe en effet une très bonne concordance (11 décimales).

Bien entendu, cela n’est pas très utile pour approcher e sin(x)e^{\sin(x)} (il vaut mieux composer exponentielle et sinus), mais cela pourrait le devenir pour une fonction périodique plus compliquée ou pour une fonction périodique dont on ne connait qu’un échantillonage régulier (par exemple un fichier numérique audio).

5.9  Quadratures gaussiennes.

5.9.1  Description

On a vu que l’interpolation polynomiale était de meilleure qualité en prenant les points de Tchebyshev plutot que des points équidistants, il est donc naturel de calculer des approximations d’intégrale de cette manière ou encore d’optimiser le choix des abscisses pour avoir une méthode d’intégration d’ordre maximal.

Si on se fixe nn abscisses x 1x_1 à x nx_n, on peut obtenir l’ordre 2n12n-1. En effet, considérons le polynôme P n= i=1 n(xx i)P_n=\prod_{i=1}^n (x-x_i), qui est de degré nn, si la méthode est d’ordre 2n12n-1 alors il sera orthogonal à tous les polynômes de degré inférieur strict à nn pour le produit scalaire <f|g>= a bf(x)g(x)dx&lt;f|g&gt;=\int_a^b f(x) g(x) \ dx puisque <P n|x j>= a bP nx j&lt;P_n|x^j&gt;=\int_a^b P_n x^j sera combinaison linéaire des P nx jP_n x^j en x k,k=1..nx_k, k=1..n (car la formule d’intégration est exacte puisque le degré du polynôme P nx jP_nx^j est au plus 2n12n-1). Donc P nP_n est à une constante multiplicative près le nn-ième polynôme orthogonal pour l’integrale sur [a,b][a,b], si [a,b]=[1,1][a,b]=[-1,1] c’est legendre(n). Réciproquement, si les x kx_k sont les racines de ce polynôme, alors la formule d’intégration est exacte, on effectue la division euclidienne du polynôme PP de degré au plus 2n12n-1 à intégrer par P nP_n P=P nQ+R,deg(Q)n1P= P_n Q + R , \quad \mbox{deg}(Q) \leq n-1 On a a bP nQ=0\int_a^b P_n Q=0 par orthogonalité et la combinaison linéaire correspondante en les x kx_k est nulle, et on a exactiture pour RR, car de degré au plus n1n-1.

Exemple :



5.9.2  Calcul des poids

On peut calculer les poids en appliquant la section 5.5. On peut ainsi montrer que les poids sont positifs en appliquant la formule d’intégration au polynôme jk(xx j)\prod_{j\neq k}(x-x_j) (la formule est exacte à cause du degré du polynome). On peut d’ailleurs montrer que le poids w iw_i en une racine du polynôme de Legendre sur [1,1][-1,1] est donné par : w i=2(1x i 2)P n(x i) 2=2(1x i 2)n 2P n1(x i) 2=2nP n1(x i)P n(x i)w_i=\frac{2}{(1-x_i^2)P'_n(x_i)^2} = \frac{2(1-x_i^2)}{n^2P_{n-1}(x_i)^2}=\frac{2}{nP_{n-1}(x_i)P_n'(x_i)}






Preuve de la dernière formule :
On a I(P n/(xx i))=w iP n(x i)I(P_n/(x-x_i))=w_i P'_n(x_i) la valeur de (P n/(xx i))(P_n/(x-x_i)) en x ix_i est par définition de P n(x i)P'_n(x_i) la limite (P n(x)P n(x i))/(xx i)(P_n(x)-P_n(x_i))/(x-x_i) lorsque xx tend vers x ix_i (rappelons que P n(x i)=0P_n(x_i)=0). Par exactitude de la formule d’intégration w iP n(x i)= 1 1P nxx i=1P n1(x i) 1 1P nP n1(x i)xx i=1P n1(x i) 1 1P nP n1(x)xx iw_i P'_n(x_i)=\int_{-1}^1 \frac{P_n}{x-x_i} = \frac1{P_{n-1}(x_i)}\int_{-1}^1 P_n \frac{P_{n-1}(x_i)}{x-x_i} = \frac1{P_{n-1}(x_i)}\int_{-1}^1 P_n \frac{P_{n-1}(x)}{x-x_i} la dernière égalité résulte du fait que (P n1(x)P n1(x i))/(xx i)(P_{n-1}(x)-P_{n-1}(x_i))/(x-x_i) est un polynôme de degré au plus n2n-2 donc orthogonal à P nP_n. Donc w iP n(x i)==1P n1(x i) 1 1P n1P n(x)xx iw_i P'_n(x_i)= = \frac1{P_{n-1}(x_i)}\int_{-1}^1 P_{n-1} \frac{P_n(x)}{x-x_i} Or P n(x)/(xx i)P_n(x)/(x-x_i) est un polynôme de degré n1n-1, si on fait son quotient par P n1P_{n-1} on obtient une constante qui vaut a n1a_{n-1} en utilisant la relation de récurrence à 2 crans P n=(a n1xb n1)P n1c n1P n2P_n=(a_{n-1}x-b_{n-1})P_{n-1}-c_{n-1}P_{n-2}. Le reste est de degré n2n-2 donc orthogonal à P n1P_{n-1}, d’où w iP n(x i)==1P n1(x i) 1 1P n1 2a n1w_i P'_n(x_i)= = \frac1{P_{n-1}(x_i)}\int_{-1}^1 P_{n-1}^2 a_{n-1} On conclut en utilisant la valeur de a n1=(2n1)/na_{n-1}=(2n-1)/n et de P n1 2=2/(2(n1)+1)\| P_{n-1}\|^2=2/(2(n-1)+1).

5.9.3  Erreur d’une quadrature gaussienne

On considère une quadrature gaussienne d’ordre 2n+12n+1 obtenue par interpolation aux n+1n+1 racines du n+1n+1-ième polynome de Legendre sur [1,1][-1,1].

Rappelons que le polynôme d’interpolation de ff aux points x 0,x 1,...,x nx_0,x_1,...,x_n s’écrit P n(t)=f[x 0]+f[x 0,x 1](tx 0)+...+f[x 0,...,x n](tx 0)...(tx n1)P_n(t)=f[x_0]+f[x_0,x_1](t-x_0)+...+f[x_0,...,x_n](t-x_0)...(t-x_{n-1}) Si on ajoute xx on obtient un polynôme d’interpolation de degré n+1n+1 P n+1(t)=f[x 0]+f[x 0,x 1](tx 0)+...+f[x 0,...,x n,x](tx 0)...(tx n1)(tx n)P_{n+1}(t)=f[x_0]+f[x_0,x_1](t-x_0)+...+f[x_0,...,x_n,x](t-x_0)...(t-x_{n-1})(t-x_n) qui coincide avec ff en t=xt=x donc f(x)=f[x 0]+f[x 0,x 1](xx 0)+...+f[x 0,...,x n,x](xx 0)...(xx n1)(xx n)f(x)=f[x_0]+f[x_0,x_1](x-x_0)+...+f[x_0,...,x_n,x](x-x_0)...(x-x_{n-1})(x-x_n) Le même calcul fait avec un point x n+1x_{n+1} en plus donne f(x)=f[x 0]+f[x 0,x 1](xx 0)+...+f[x 0,...,x n,x n+1](xx 0)...(xx n1)(xx n)+f[x 0,...,x n,x n+1,x](xx 0)...(xx n1)(xx n)(xx n+1)f(x)=f[x_0]+f[x_0,x_1](x-x_0)+...+f[x_0,...,x_n,x_{n+1}](x-x_0)...(x-x_{n-1})(x-x_n) + f[x_0,...,x_n,x_{n+1},x](x-x_0)...(x-x_{n-1})(x-x_n)(x-x_{n+1}) On a donc montré la formule : f[x 0,...,x n,x]=f[x 0,...,x n,x n+1]+f[x 0,...,x n,x n+1,x](xx n+1)(7) f[x_0,...,x_n,x]=f[x_0,...,x_n,x_{n+1}]+f[x_0,...,x_n,x_{n+1},x](x-x_{n+1}) \qquad (7) mais en fait on va ajouter plus qu’un point, on va en ajouter n+1n+1 f(x)(f[x 0]+f[x 0,x 1](xx 0)+...+f[x 0,...,x n](xx 0)...(xx n1)) = f[x 0,...,x n,x n+1](xx 0)...(xx n1)(xx n)+...+f[x 0,...,x 2n+1](xx 0)...(xx 2n)+f[x 0,...,x 2n+1,x](xx 0)...(xx 2n+1) \begin{matrix} &&f(x)-(f[x_0]+f[x_0,x_1](x-x_0)+...+f[x_0,...,x_n](x-x_0)...(x-x_{n-1}) )\\ &=&f[x_0,...,x_n,x_{n+1}](x-x_0)...(x-x_{n-1})(x-x_n) +...+f[x_0,...,x_{2n+1}](x-x_0)...(x-x_{2n}) + f[x_0,...,x_{2n+1},x](x-x_0)...(x-x_{2n+1}) \end{matrix} puis on intègre sur [1,1][-1,1], on obtient à gauche l’erreur et à droite, seul le dernier terme est non nul, car le polynôme de Legendre proportionnel à (xx 0)...(xx n1)(xx n)(x-x_0)...(x-x_{n-1})(x-x_n) , de degré n+1n+1, est orthogonal à tous les polynôme de degré n\leq n 1 1(f(x)P n(x))dx= 1 1f[x 0,...,x 2n+1,x](xx 0)...(xx 2n+1)dx\int_{-1}^1 (f(x) -P_n(x)) \ dx = \int_{-1}^1 f[x_0,...,x_{2n+1},x](x-x_0)...(x-x_{2n+1}) \ dx D’autre part, le résultat sur l’erreur d’interpolation ?? donne f[x 0,...,x n,x]=f [n+1](ξ x)(n+1)!f[x_0,...,x_n,x]=\frac{f^{[n+1]}(\xi_x)}{(n+1)!} en particulier |f[x 0,...,x n,x]|M n+1/(n+1)!|f[x_0,...,x_n,x]| \leq M_{n+1}/(n+1)! D’où la majoration | 1 1(f(x)P n(x))dx|M 2n+2(2n+2)! 1 1|(xx 0)...(xx 2n+1)|dx| \int_{-1}^1 (f(x) -P_n(x)) \ dx | \leq \frac{M_{2n+2}}{(2n+2)!} \int_{-1}^1|(x-x_0)...(x-x_{2n+1})| \ dx Il suffit ensuite de faire tendre les x n+1,...,x 2n+1x_{n+1},...,x_{2n+1} vers x 0,...,x nx_0,...,x_n pour enlever la valeur absolue et obtenir | 1 1(f(x)P n(x))dx|M 2n+2(2n+2)! 1 1L n+1 2(x)dx| \int_{-1}^1 (f(x) -P_n(x)) \ dx | \leq \frac{M_{2n+2}}{(2n+2)!} \int_{-1}^1 L_{n+1}^2(x) \ dx L n+1L_{n+1} est proportionnel au n+1n+1-ième polynôme de Legendre de coefficient dominant 1.

Par exemple, pour n=1n=1, on a 2 points d’interpolation en les racines de L 2=x 21/3L_2=x^2-1/3 et l’erreur d’interpolation est majorée par M 4/24 1 1(x 21/3)dx=M 4/24×8/45=M 4/135M_4/24\int_{-1}^1(x^2-1/3) \ dx=M_4/24 \times 8/45=M_4/135.

5.10  Méthode adaptative.

On calcule une valeur approchée de l’intégrale sur [a,b][a,b] par deux quadratures gaussiennes emboitées, on estime l’erreur, si elle est supérieure à la tolérance on divise en 2. On recommence en subdivisant en 2 l’intervalle où l’erreur est maximale. On s’arrête lorsque l’erreur estimée est inférieure à la tolérance.

L’estimation de l’erreur se fait par exemple avec deux quadratures gaussiennes emboitées (c’est-à-dire que les points d’interpolation de la moins fine sont contenues dans les points d’interpolation de la plus fine, pour éviter de devoir calculer la fonction en de nouveaux points, on considére alors l’erreur sur la quadrature la moins fine comme la valeur absolue de la différence des deux valeurs). Ou avec trois quadratures emboitées, Hairer propose de prendre comme quadrature la plus fine en h 30h^{30} (15 points), intermédiaire en h 14h^{14} (avec les mêmes points sauf le point central), moins fine en h 6h^6 (avec les points 1, 3, 5, 9, 11, 13), et d’estimer l’erreur par ε 1=|I 30I 14|,ε 2=|I 30I 6|;ε=ε 1(ε 1ε 2) 2\epsilon_1=| I_{30}-I_{14}|, \epsilon_2=| I_{30}-I_{6}|; \epsilon = \epsilon_1 \left(\frac{\epsilon_1}{\epsilon_2} \right)^2 On observe en effet que ε\epsilon est en h 30h^{30}, comme l’ordre de la méthode.

5.11  Accélération de Richardson-Romberg

Proposition 12   Soit gg une fonction de classe C 2kC^{2k} sur [a,b][a,b], T h(g)T_h(g) la valeur de la méthode des trapèzes sur [a,b][a,b] de pas h=(ba)/Nh=(b-a)/N (NN entier). Alors T h(g)T_h(g) admet un développement en puissances paires de hh à l’ordre 2k2k.

Pour montrer ce résultat, il faut établir la formule d’Euler-Mac Laurin. On commence par se placer sur une subdivision de l’intervalle [0,1][0,1], on intègre par parties 0 1f(t)dt\int_0^1 f(t)\ dt en faisant apparaitre la formule des trapèzes, on intègre donc 1 en syntax error at token $ 0 1f(t)dt=[(t12)f(t)] 0 1 0 1(t12)f(t)dt=f(0)+f(1)2 0 1(t12)f(t)dt\int_0^1 f(t) \ dt = [(t-\frac12)f(t)]_0^1 - \int_0^1 (t-\frac12)f'(t) \ dt = \frac{f(0)+f(1)}{2} - \int_0^1 (t-\frac12)f'(t) \ dt où encore T 1(f)= 0 1f(t)dt+ 0 1(t12)f(t)dtT_1(f)=\int_0^1 f(t) \ dt + \int_0^1 (t-\frac12)f'(t) \ dt Pour poursuivre, on pose syntax error at token $, qu’on va intégrer en 12((t12) 2+c)\frac12((t-\frac12)^2+c), où on choisit cc pour que l’intégrale soit nulle, donc c=1/6c=-1/6. On pose B 2=(t12) 21/6B_2=(t-\frac12)^2-1/6, on a : T 1(f)= 0 1f(t)dt+[B 22f] 0 1 0 1B 22f(t)dtT_1(f)=\int_0^1 f(t) \ dt + [\frac{B_2}{2} f']_0^1 - \int_0^1 \frac{B_2}{2}f'{'}(t) \ dt Plus généralement, on pose B p+1=pB p, 0 1B p+1(t)dt=0B_{p+1}'=pB_p, \quad \int_0^1 B_{p+1}(t) \ dt=0 ce qui définit de manière unique les B pB_p. La nullité de l’intégrale montre que B p+1(1)=B p+1(0)B_{p+1}(1)=B_{p+1}(0) ce qui simplifiera l’expression des termes tout intégrés. De plus, on montre par récurrence que les B pB_p ont une symétrie paire ou impaire selon la parité de pp par rapport à t=1/2t=1/2. Après pp intégrations par parties, on obtient : T 1(f) = 0 1f(t)dt+B 2(0)2(f(1)f(0))+... +B 2k(0)(2k)!(f [2k1](1)f [2k1](0)) 0 1B 2k(2k)!f [2k](t)dt \begin{matrix} T_1(f)&=&\int_0^1 f(t) \ dt + \frac{B_2(0)}{2} (f'(1)-f'(0)) + ... \\ & &+ \frac{B_{2k}(0)}{(2k)!} (f^{[2k-1]}(1)-f^{[2k-1]}(0)) - \int_0^1 \frac{B_{2k}}{(2k)!} f^{[2k]}(t) \ dt \end{matrix} En faisant le même raisonnement sur [k,k+1][k,k+1] pour k=1,...,N1k=1,...,N-1 et en sommant, on obtient la formule d’Euler-Mac Laurin : T 1 [0,N](f) = 0 Nf(t)dt+B 2(0)2(f(N)f(0))+... +B 2k(0)(2k)!(f [2k1](N)f [2k1](0)) 0 NB 2k(2k)!f [2k](t)dt \begin{matrix} T_1^{[0,N]}(f)&=&\int_0^N f(t) \ dt + \frac{B_2(0)}{2} (f'(N)-f'(0)) + ... \\ & & + \frac{B_{2k}(0)}{(2k)!} (f^{[2k-1]}(N)-f^{[2k-1]}(0)) - \int_0^N \frac{B_{2k}}{(2k)!} f^{[2k]}(t) \ dt \end{matrix} On pose alors x=a+htx=a+ht (donc dt=dx/hdt=dx/h) et f(t)=g(x)f(t)=g(x) (donc f(t)=df/dt=hdg/dxf'(t)=df/dt=h dg/dx), on obtient 1hT h [a,b](g) = 1h 0 Ng(x)dx+B 2(0)2h(g(b)g(a))+... +B 2k(0)(2k)!h 2k1(g [2k1](N)g [2k1](0)) 0 NB 2k(2k)!h 2kg [2k](x)1hdx \begin{matrix} \frac1h T_h^{[a,b]}(g)&=& \frac1h \int_0^N g(x) \ dx + \frac{B_2(0)}{2} h(g'(b)-g'(a)) + ... \\ & &+ \frac{B_{2k}(0)}{(2k)!} h^{2k-1} (g^{[2k-1]}(N)-g^{[2k-1]}(0)) - \int_0^N \frac{B_{2k}}{(2k)!} h^{2k} g^{[2k]}(x) \ \frac1h dx \end{matrix} donc T h [a,b](g) = 0 Ng(x)dx+h 2B 2(0)2(g(b)g(a))+... +h 2kB 2k(0)(2k)!(g [2k1](N)g [2k1](0))h 2k 0 NB 2k(2k)!g [2k](x)dx \begin{matrix} T_h^{[a,b]}(g) &=& \int_0^N g(x) \ dx + h^2 \frac{B_2(0)}{2} (g'(b)-g'(a)) + ... \\ & & + h^{2k} \frac{B_{2k}(0)}{(2k)!} (g^{[2k-1]}(N)-g^{[2k-1]}(0)) - h^{2k} \int_0^N \frac{B_{2k}}{(2k)!} g^{[2k]}(x) \ dx \end{matrix}

L’accélération consiste à éliminer les puissances de h 2h^2 en commençant par h 2h^2 avec des subdivisions deux fois plus fines à chaque itération. Ainsi T h 1(f)=(4T h/2(f)T h(f))/(41)T_h^1(f) = (4T_{h/2}(f)-T_h(f))/(4-1) n’a plus de termes en h 2h^2 et tend vers l’intégrale à approcher lorsque hh tend vers 0. On peut d’ailleurs vérifier qu’il s’agit de la méthode de Simpson. On élimine ensuite le terme en h 4h^4 en posant T h 2(f)=(4 2T h/2 1(f)T h 1(f))/(4 21)T_h^2(f)=(4^2 T_{h/2}^1(f)-T_h^1(f))/(4^2-1) et ainsi de suite. On construit un tableau triangulaire T dont chaque ligne ll contient T h/2 l(f),T h/2 l 1(f),...T_{h/2^l}(f), T_{h/2^l}^1(f), ... (avec des indices qui commencent à 0). Pour calculer le terme d’indice 0 de la ligne courante on fait une méthode des trapèzes sur 2 fois plus de subdivisions que la précédente, puis pour le jj-ième terme T[l,j] on effectue (4^j*T[l-1,j-1]-T[l,j-1])/(4^j-1) (on n’a donc besoin que de la ligne précédente pour calculer la ligne courante). On s’arrête par exemple lorsque la valeur absolue de la différence entre les derniers termes de deux lignes consécutives est inférieur à la précision souhaitée (erreur empirique).

5.12  Méthodes probabilistes.

Pour déterminer a bf(t)dt\int_a^b f(t) \ dt , on l’interprète comme une espérance, plus précisément comme (ba)E(f(X))(b-a)E(f(X))XX est une variable aléatoire qui suit la loi uniforme sur [a,b][a,b], et on approche cette valeur par ban k=1 nf(x k)\frac{b-a}{n} \sum_{k=1}^n f(x_k) x kx_k est obtenu par un générateur pseudo-aléatoire (selon la loi uniforme). Par exemple



La convergence en fonction de nn est assez lente, on peut l’observer en faisant plusieurs estimations :


En effet, les tirages sont équidistribués selon la même loi, la loi des grands nombres s’applique donc : on fait bab-a fois une moyenne de nn tirages, si nn est grand, on converge vers une loi normale dont l’écart-type est en (ba)σ/n(b-a)\sigma/\sqrt{n}. La valeur de la constante σ\sigma peut se calculer à partir de ff σ 2=1ba a bf 2(t)dt(1ba a bf(t)dt) 2\sigma^2 = \frac{1}{b-a}\int_a^b f^2(t) \ dt - \left( \frac{1}{b-a}\int_a^b f(t) \ dt \right)^2 par exemple ici


mais on ne fait pas ce calcul en pratique (puisqu’il faudrait calculer une intégrale), on estime l’écart-type σ/n\sigma/\sqrt{n} de la loi normale par l’écart-type de l’échantillon des estimations stddevp(I).

On peut donc obtenir rapidement une estimation de σ\sigma en prenant l’écart-type d’une séquence de valeurs de ff


Cette méthode converge donc beaucoup moins vite que les quadratures, en dimension 1. Mais elle se généralise très facilement en dimension plus grande en conservant la même vitesse de convergence alors que le travail nécessaire pour une méthode de quadrature croit comme une puissance de la dimension, et ne nécessite pas de paramétrer des domaines d’intégration compliqués (il suffit par exemple d’utiliser la méthode du rejet pour avoir un générateur uniforme dans un domaine inclus dans un cube).

6  Suites itératives et applications

Résumé:
Théorème du point fixe, méthode de Newton,convexité. Exemple: calcul de valeur approchée de racines carrées, Résolution d’équations.

6.1  Le point fixe dans R\R

Soit ff une fonction continue sur un intervalle I=[a,b]I=[a,b] de R\R, et à valeurs dans II (attention à bien choisir II pour que l’image de II par ff reste dans II). On s’intéresse à la suite u n+1=f(u n),u 0I(8) u_{n+1}=f(u_n), \quad u_0 \in I \qquad (8) Supposons que u nu_n converge vers une limite lIl \in I lorsque n+n \rightarrow +\infty, alors la limite doit vérifier f(l)=l f(l)=l puisque ff est continue. On dit que ll est un point fixe de ff. Ceci amène à l’idée d’utiliser ces suites pour résoudre numériquement l’équation f(x)=xf(x)=x. Nous allons donner un théorème permettant d’assurer que la suite (??) converge, et que la limite est l’unique solution de f(l)=lf(l)=l sur II.

Définition 3   On dit que ff est contractante de rapport k<1k&lt;1 sur II si x,yI,|f(y)f(x)|k|yx| \forall x,y \in I, \quad |f(y)-f(x)| \leq k |y-x|

En pratique, les fonctions ff que l’on considèrera seront continument dérivables, donc d’après le théorème des accroissements finis f(y)f(x)=f(θ)(yx),θ[x,y] f(y)-f(x)=f'(\theta) (y-x), \quad \theta \in [x,y] ainsi pour vérifier que ff est contractante, on étudie la valeur absolue de ff' sur II, il suffit de montrer que cette valeur absolue est strictement inférieure à un réel k<1k&lt;1 pour conclure (il faut donc chercher le maximum de |f||f'| sur II. Attention, il s’agit du maximum de |f||f'| et pas du maximum de ff', ce qui revient à chercher le maximum de ff' et de f-f').

On a alors le

Théorème 13   (du point fixe)
si
ff est contractante de I=[a,b]I=[a,b] dans II de rapport kk alors la suite (??) converge vers l’unique solution de f(l)=lf(l)=l dans II. On a de plus les encadrements : |u nl|k n|ba|,|u nl||u n+1u n|1k(9) |u_n-l| \leq k^n |b-a|, \quad |u_n -l | \leq \frac{|u_{n+1}-u_n|}{1-k} \qquad (9)

Démonstration : Tout d’abord si ff est contractante, on montre à partir de la définition de la continuité que ff est continue. Soit g(x)=f(x)xg(x)=f(x)-x, alors gg est continue, positive en aa et négative en bb, il existe donc l[a,b]l\in[a,b] tel que g(l)=0g(l)=0 (théorème des valeurs intermédiaires). Soit u nu_n une suite définie par (??). On a alors pour tout nn |u n+1l|=|f(u n)f(l)|k|u nl| |u_{n+1}-l|=|f(u_n)-f(l)| \leq k |u_n-l| Donc par une récurrence évidente : |u nl|k n|u 0l| |u_n-l| \leq k^n |u_0-l| ce qui entraine d’ailleurs que |u nl|k n|ab||u_n-l| \leq k^n |a-b|. Comme k[0,1[k \in [0,1[ , la suite géométrique k nk^n converge vers 0 lorsque nn tend vers l’infini, donc u nu_n tend vers ll. Notons que ll est unique car si ll' est une autre solution alors |ll|=|f(l)f(l)|k|ll||l-l'|=|f(l)-f(l')| \leq k|l-l'| donc (1k)|ll|0(1-k)|l-l'| \leq 0, or 1k>01-k&gt;0 et |ll|0|l-l'| \geq 0 donc |ll||l-l'| doit être nul. Passons à la preuve de la majoration (??) qui est importante en pratique car elle donne un test d’arrêt de calcul des termes de la suite récurrente, on écrit pour m>0m&gt;0 : u nl=u nu n+1+u n+1u n+2+...+u n+m1u n+m+u ml u_n-l= u_n - u_{n+1} + u_{n+1} - u_{n+2} + ... + u_{n+m-1}- u_{n+m} + u_m-l puis on majore avec l’inégalité triangulaire |u nl| j=0 m1|u n+ju n+j+1|+|u ml| |u_n-l| \leq \sum_{j=0}^{m-1} |u_{n+j}-u_{n+j+1}| + |u_m-l| puis on applique le fait que ff est contractante de rapport kk |u nl| j=0 m1k j|u nu n+1|+|u ml| |u_n-l| \leq \sum_{j=0}^{m-1} k^j |u_{n}-u_{n+1}| + |u_m-l| soit |u nl|1k m1k|u nu n+1|+|u ml| |u_n-l| \leq \frac{1-k^m}{1-k} |u_{n}-u_{n+1}| + |u_m-l| On fait alors tendre mm vers l’infini d’où le résultat.

Exemples : Cherchons une valeur approchée de 2\sqrt{2} par cette méthode. Il faut d’abord trouver une fonction ff dont 2\sqrt{2} est un point fixe, par exemple f(x)=x+2x+1 f(x)=\frac{x+2}{x+1} On vérifie que f(2)=2)f(\sqrt{2})=\sqrt{2}), puis que f=1/(x+1) 2f'=-1/(x+1)^2 donc ff décroit. On va voir si les hypothèses du théorème du point fixe s’appliquent sur par exemple [1,2][1,2]. Comme ff est décroissante f([1,2])=[f(2),f(1)]=[4/3,3/2]f([1,2])=[f(2),f(1)]=[4/3,3/2] qui est bien inclus dans [1,2][1,2] . De plus ff' est comprise entre 1/(1+1) 2=1/4-1/(1+1)^2=-1/4 et 1/(2+1) 2=1/9-1/(2+1)^2=-1/9 donc |f|<1/4|f'|&lt;1/4, ff est contractante de rapport 1/41/4. On peut donc itérer la suite à partir par exemple de u 0=1u_0=1 et on va converger vers 2\sqrt{2} (en s’en rapprochant à chaque cran d’un rapport inférieur à 1/41/4).

Considérons l’équation en xx xesin(x)=t,e[0,1[ x- e \sin(x) =t, \quad e \in [0,1[ c’est l’équation du temps utilisée en astronomie pour trouver la position d’une planète sur son orbite elliptique (ee étant l’excentricité de l’ellipse). Il n’y a pas de formule exacte permettant de calculer xx en fonction de tt. Si on a une valeur numérique pour tt, on peut trouver une valeur numérique approchée de xx par la méthode du point fixe, en réécrivant l’équation sous la forme f(x)=t+esin(x)=x f(x)=t+e\sin(x) = x On observe que ff envoie R\R dans [te,t+e][t-e,t+e] donc on peut prendre I=[te,t+e]I=[t-e,t+e], de plus |f|e<1|f'|\leq e &lt;1, ff est contractante de rapport e[0,1[e \in [0,1[, le théorème s’applique, il suffit de prendre une valeur initiale dans [te,t+e][t-e,t+e] et d’itérer la suite jusqu’à obtenir la précision désirée. Par exemple si on veut une valeur approchée de xx à 10 610^{-6} près, il suffira que la différence entre deux termes successifs de la suite u nu_n vérifie |u n+1u n|10 6(1e) |u_{n+1}-u_n| \leq 10^{-6} (1-e) on aura alors bien : |u nx||u n+1u n|1e10 6 |u_n-x| \leq \frac{|u_{n+1}-u_n|}{1-e} \leq 10^{-6}

Cette méthode n’est pas toujours optimale, car la vitesse de convergence vers la limite ll est dite “linéaire”, c’est-à-dire que le temps de calcul pour avoir nn décimales est proportionnel à nn (ou encore il faut effectuer un nombre d’itérations proportionnel à nn, chaque itération faisant gagner en précision de l’ordre du rapport kk de contractance). En effet, supposons que ff' est continue en ll et que 0<L=|f(l)|<10&lt;L=|f'(l)|&lt;1 . Il existe alors un intervalle I=[lη,l+η]I=[l-\eta,l+\eta] tel que xIL2|f(x)|1+L2 x \in I \Rightarrow \frac{L}{2} \leq |f'(x)| \leq \frac{1+L}{2} Le théorème des accroissements finis donne alors |u n+1l|=|f(u n)f(l)|=|f(θ)||u nl|,θ[u n,l] |u_{n+1} - l | = |f(u_n)-f(l)| = |f'(\theta)| |u_n-l|, \quad \theta \in [u_n,l] Si u 0Iu_0 \in I, alors θI\theta \in I donc |u 1l||u 0l||u_1-l| \leq |u_0-l| et u 1Iu_1 \in I, par récurrence on a pour tout nn, u nIu_n \in I L2|u nl||u n+1l|1+L2|u nl| \frac{L}{2} |u_n-l| \leq |u_{n+1} - l| \leq \frac{1+L}{2} |u_n-l| on a donc par récurrence (L2) n|u 0l||u nl|(1+L2) n|u 0l| \left(\frac{L}{2}\right)^n|u_0-l| \leq |u_n-l| \leq \left( \frac{1+L}{2} \right)^n|u_0-l| Donc pour avoir |u nl|ε|u_n-l| \leq \epsilon il suffit que (1+L2) n|u 0l|εnln(ε|u 0l|)ln(1+L2) \left( \frac{1+L}{2} \right)^n|u_0-l| \leq \epsilon \Rightarrow n \geq \frac{\ln(\frac{\epsilon}{|u_0-l|})}{\ln( \frac{1+L}{2}) } et il faut que (L2) n|u 0l|εnln(ε|u 0l|)ln(L2) \left(\frac{L}{2}\right)^n |u_0-l| \leq \epsilon \Rightarrow n \geq \frac{\ln(\frac{\epsilon}{|u_0-l|})}{\ln( \frac{L}{2}) }

Si ff est suffisamment régulière, il existe une méthode plus rapide lorsqu’on est proche de la racine ou lorsque la fonction a des propriétés de convexité, c’est la méthode de Newton. Et même si Newton n’est pas applicable, une simple dichotomie peut être plus efficace si la constante de contractance est supérieure à 1/21/2 (y compris prés de la solution de f(x)=xf(x)=x). Toutefois la méthode du point fixe reste intéressante si la constante de contractance est suffisamment petite (par exemple k=0.1k=0.1 garantit 15 décimales en 15 itérations) et présente l’avantage de se généraliser en dimension plus grande, cf. la section suivante.

6.2  Le point fixe dans R n\R^n

Le théorème précédent se généralise.

Théorème 14   Soit II un ensemble fermé de R n\R^n (ou d’un espace métrique complet) tel que ff envoie II dans II et tel que ff soit contractante sur II k<1,x,yI,|f(x)f(y)|k|xy|\exists k&lt;1, \forall x,y \in I, \quad |f(x)-f(y)| \leq k |x-y| Alors pour tout u 0Iu_0 \in I, la suite (u n)(u_n) définie par u n+1=f(u n)u_{n+1}=f(u_n) converge vers l’unique solution dans II de f(l)=lf(l)=l.

La démonstration de la convergence est un peu différente de celle donnée en dimension 1, on montre que (u n)(u_n) est une suite de Cauchy, car pour n>mn&gt;m |u nu m| j=m n1|u j+1u j|k m11k|u 1u 0||u_n-u_m| \leq \sum_{j=m}^{n-1}|u_{j+1}-u_j | \leq k^m \frac{1}{1-k} |u_1-u_0| donc (u n)(u_n) est convergente puisque nous sommes dans un fermé d’un espace complet. (Cela permet d’ailleurs de généraliser l’énoncé donné en dimension 1 au cas où aa ou bb est infini)

La vitesse de convergence est linéaire, la démonstration est identique à celle de la dimension 1.

Remarque :

6.3  La méthode de Newton dans R\R.

La méthode de Newton est une méthode de résolution de l’équation f(x)=0f(x)=0, attention à la différence avec le théorème du point fixe qui permet de résoudre numériquement f(x)=xf(x)=x. Si x 0x_0 est proche de la racine rr on peut faire un développement de Taylor à l’ordre 1 de la fonction ff en x 0x_0 : f(x)=f(x 0)+(xx 0)f(x 0)+O((xx 0) 2) f(x)=f(x_0)+(x-x_0)f'(x_0)+O((x-x_0)^2) Pour trouver une valeur approchée de rr, on ne garde que la partie linéaire du développement, on résout : f(r)=0f(x 0)+(rx 0)f(x 0) f(r)=0 \approx f(x_0) + (r-x_0) f'(x_0) donc (si f(x 0)0f'(x_0)\neq 0) : rx 0f(x 0)f(x 0) r \approx x_0 -\frac{f(x_0)}{f'(x_0)} Graphiquement, cela revient à tracer la tangente à la courbe représentative de ff et à chercher où elle coupe l’axe des xx. On considère donc la suite récurrente définie par une valeur u 0u_0 proche de la racine et par la relation : u n+1=u nf(u n)f(u n) u_{n+1} = u_n -\frac{f(u_n)}{f'(u_n)}

Il y a deux théorèmes importants, l’un d’eux prouve que si u 0u_0 est “assez proche” de rr alors la suite u nu_n converge vers rr, malheureusement il est difficile de savoir en pratique si on est “assez proche” de u 0u_0 pour que ce théorème s’applique. Le second théorème donne un critère pratique facile à vérifier qui assure la convergence, il utilise les propriétés de convexité de la fonction.

Théorème 15   Soit ff une fonction de classe C 2C^2 (2 fois continument dérivable) sur un intervalle fermé II. Soit rr une racine simple de ff située à l’intérieur de II (telle que f(r)=0f(r)=0 et f(r)0f'(r)\neq 0). Alors il existe ε>0\varepsilon&gt;0 tel que la suite définie par u n+1=u nf(u n)f(u n),|u 0r|ε u_{n+1} = u_n -\frac{f(u_n)}{f'(u_n)}, \quad |u_0-r| \leq \varepsilon converge vers rr.

Si on a |f|M|f'{'}| \leq M et |1/f|m|1/f'| \leq m sur un intervalle [rη,r+η][r-\eta,r+\eta] contenu dans II, alors on peut prendre tout réel ε>0\varepsilon&gt;0 tel que ε<2/(mM)\varepsilon &lt; 2/(mM) et εη\varepsilon \leq \eta.

Démonstration : on a u n+1r=u nrf(u n)f(u n)=(u nr)f(u n)f(u n)f(u n) u_{n+1}-r = u_n - r - \frac{f(u_n)}{f'(u_n)} = \frac{(u_n-r)f'(u_n)-f(u_n)}{f'(u_n)} En appliquant un développement de Taylor de ff en u nu_n à l’ordre 2, on obtient pour un réel θ\theta situé entre rr et u nu_n : 0=f(r)=f(u n)+(ru n)f(u n)+(ru n) 2f(θ)2 0 = f(r)=f(u_n)+(r-u_n) f'(u_n) + (r-u_n)^2 \frac{f'{'}(\theta)}{2} donc : (u nr)f(u n)f(u n)=(u nr) 2f(θ)2 (u_n-r)f'(u_n)-f(u_n)= (u_n-r)^2 \frac{f'{'}(\theta)}{2} d’où : |u n+1r||u nr| 21|f(u n)||f(θ)|2 |u_{n+1}-r| \leq |u_n-r|^2 \frac{1}{|f'(u_n)|} \frac{|f'{'}(\theta)|}{2} On commence par choisir un intervalle [rε,r+ε][r-\varepsilon,r+\varepsilon] contenant strictement rr et tel que |f|<M|f'{'}|&lt;M et |1/f|<m|1/f'|&lt;m sur [rε,r+ε][r-\varepsilon,r+\varepsilon] (c’est toujours possible car ff'{'} et 1/f1/f' sont continues au voisinage de rr puisque f(r)0f'(r)\neq 0). Si u nu_n est dans cet intervalle, alors θ\theta aussi donc |u n+1r||u nr| 2Mm2|u nr|Mm2|u nr|,(10) |u_{n+1}-r| \leq |u_n-r|^2 \frac{Mm}{2} \leq \frac{|u_n-r|Mm}{2} |u_n-r|, \qquad (10) On a |u nr|ε|u_n-r| \leq \varepsilon, on diminue si nécessaire ε\varepsilon pour avoir ε<2/(Mm)\varepsilon &lt; 2/(Mm), on a alors : |u n+1r|k|u nr|,k=εMm2<1 |u_{n+1}-r| \leq k |u_n-r|, \quad k=\frac{\varepsilon Mm}{2}&lt;1 donc d’une part u n+1u_{n+1} est encore dans l’intervalle [rε,r+ε][r-\varepsilon,r+\varepsilon] ce qui permettra de refaire le même raisonnement au rang suivant, et d’autre part on a une convergence au moins géométrique vers rr. En fait la convergence est bien meilleure lorsqu’on est proche de rr grace au carré dans |u nr| 2|u_n-r|^2, plus précisément, on montre par récurrence que |u nr||u 0r| 2 n(Mm2) 2 n1 |u_n-r| \leq |u_0 - r|^{2^n} \left( \frac{Mm}{2} \right)^{2^n-1} il faut donc un nombre d’itérations proportionnel à ln(n)\ln(n) pour atteindre une précision donnée.

Remarque : ce théorème se généralise sur C\C et même sur R n\R^n (cf. la section suivante).

Exemple : pour calculer 2\sqrt{2}, on écrit l’équation x 22=0x^2-2=0 qui a 2\sqrt{2} comme racine simple sur I=[1/2,2]I=[1/2,2], on obtient la suite récurrente u n+1=u nu n 222u n u_{n+1} = u_n - \frac{u_n^2-2}{2u_n} Si on prend η=1/2\eta=1/2, on a f=2xf'=2x et f=2f'{'}=2 donc on peut prendre M=2M=2 et m=1m=1 car |1/f|1|1/f'|\leq 1 sur [21/2,2+1/2][\sqrt{2}-1/2,\sqrt{2}+1/2]. On a 2/(mM)=12/(mM)=1, on peut donc prendre ε=1/2\varepsilon=1/2, la suite convergera pour tout u 0[21/2,2+1/2] u_0 \in [\sqrt{2}-1/2,\sqrt{2}+1/2].

Plus généralement, on peut calculer une racine kk-ième d’un réel aa en résolvant f(x)=x kaf(x)=x^k-a par la méthode de Newton.

L’inconvénient de ce théorème est qu’il est difficile de savoir si la valeur de départ qu’on a choisie se trouve suffisamment près d’une racine pour que la suite converge. Pour illustrer le phénomène, on peut par exemple colorer les points du plan complexe en n+1n+1 couleurs selon que la suite définie par la méthode de Newton converge vers l’une des nn racines d’un polynôme de degré nn fixé au bout de par exemple 50 itérations (la n+1n+1-ième couleur servant aux origines de suite qui ne semblent pas converger).

Passons maintenant à un critère très utile en pratique :

Définition 4   (convexité)
Une fonction
ff continument dérivable sur un intervalle II de R\R est dite convexe si son graphe est au-dessus de la tangente en tout point de II.

Il existe un critère simple permettant de savoir si une fonction de classe C 2C^2 est convexe :

Théorème 16   Si ff est C 2C^2 et f0f'{'} \geq 0 sur II alors ff est convexe.

Démonstration :
L’équation de la tangente au graphe en x 0x_0 est y=f(x 0)+f(x 0)(xx 0) y=f(x_0)+f'(x_0)(x-x_0) Soit g(x)=f(x)(f(x 0)+f(x 0)(xx 0)) g(x)=f(x)-(f(x_0)+f'(x_0)(x-x_0)) on a : g(x 0)=0,g(x)=f(x)f(x 0),g(x 0)=0,g=f0 g(x_0)=0, \quad g'(x)=f'(x)-f'(x_0), \quad g'(x_0)=0, \quad g'{'}=f'{'} \geq 0 donc gg' est croissante, comme g(x 0)=0g'(x_0)=0, gg' est négative pour x<x 0x&lt;x_0 et positive pour x>x 0x&gt;x_0, donc gg est décroissante pour x<x 0x&lt;x_0 et croissante pour x>x 0x&gt;x_0. On conclut alors que g0g \geq 0 puisque g(x 0)=0g(x_0)=0. Donc ff est bien au-dessus de sa tangente.

On arrive au deuxième théorème sur la méthode de Newton

Théorème 17   Si f(r)=0,f(r)>0f(r)=0, f'(r)&gt;0 et si f0f'{'} \geq 0 sur [r,b][r,b] alors pour tout u 0[r,b]u_0 \in [r,b] la suite de la méthode de Newton u n+1=u nf(u n)f(u n), u_{n+1} = u_n -\frac{f(u_n)}{f'(u_n)}, est définie, décroissante, minorée par rr et converge vers rr. De plus 0u nrf(u n)f(r) 0 \leq u_n -r \leq \frac{f(u_n)}{f'(r)}

Démonstration :
On a f0f'{'} \geq 0 donc si f(r)>0f'(r)&gt;0 alors f>0f'&gt;0 sur [r,b][r,b], ff est donc strictement croissante sur [r,b][r,b] on en déduit que f>0f&gt;0 sur ]r,b]]r,b] donc u n+1u nu_{n+1} \leq u_n. Comme la courbe représentative de ff est au-dessus de la tangente, on a u n+1ru_{n+1} \geq r (car u n+1u_{n+1} est l’abscisse du point d’intersection de la tangente avec l’axe des xx). La suite u nu_n est donc décroissante minorée par rr, donc convergente vers une limite lrl\geq r. À la limite, on a l=lf(l)f(l)f(l)=0 l=l-\frac{f(l)}{f'(l)} \Rightarrow f(l)=0 donc l=rl=r car f>0f&gt;0 sur ]r,b]]r,b].

Comme (u n)(u_n) est décroissante, on a bien 0u nr0 \leq u_n -r, pour montrer l’autre inégalité, on applique le théorème des accroissements finis, il existe θ[r,u n]\theta \in [r,u_n] tel que f(u n)f(r)=(u nr)f(θ) f(u_n)-f(r)=(u_n-r)f'(\theta) comme f(r)=0f(r)=0, on a u nr=f(u n)f(θ) u_n-r = \frac{f(u_n)}{f'(\theta)} et la deuxième inégalité du théorème en découle parce que ff' est croissante.

Variantes :
Il existe des variantes, par exemple si f(r)<0f'(r)&lt;0 et f0f'{'} \geq 0 sur [a,r][a,r]. Si f0f'{'} \leq 0, on considère g=fg=-f.

Application :
On peut calculer la valeur approchée de la racine kk-ième d’un réel a>0a&gt;0 en appliquant ce deuxième théorème. En effet si a>0a&gt;0, alors x kax^k-a est 2 fois continument dérivable et de dérivée première kx k1kx^{k-1} et seconde k(k1)x k2k(k-1)x^{k-2} strictement positives sur R +*\R^{+\ast} (car k2k \geq 2). Il suffit donc de prendre une valeur de départ u 0u_0 plus grande que la racine kk-ième, par exemple 1+a/k1+a/k (en effet (1+a/k) k1+ka/k=1+a(1+a/k)^k \geq 1+k a/k=1+a). En appliquant l’inégalité du théorème, on a : 0u naku n kakak k1u n kakaaku n kaka(1+ak) 0 \leq u_n - \sqrt[k]{a} \leq \frac{u_n^k - a}{k\sqrt[k]{a}^{k-1} } \leq \frac{u_n^k-a}{ka} \sqrt[k]{a} \leq \frac{u_n^k-a}{ka} (1+\frac{a}{k}) Pour avoir une valeur approchée de ak\sqrt[k]{a} à ε\varepsilon près, on peut donc choisir comme test d’arrêt u n kaka1+akε u_n^k -a \leq \frac{ka}{1+\frac{a}{k}} \varepsilon Par exemple pour 2\sqrt{2}, le test d’arrêt serait u n 222εu_n^2-2 \leq 2 \varepsilon.

6.4  La méthode de Newton dans R n\R^n.

Le premier énoncé du cas de la dimension 1 se généralise en :

Théorème 18   Soit ff une fonction de classe C 2C^2 (2 fois continument dérivable) sur un fermé II de R n\R^n. Soit rr une racine simple de ff située à l’intérieur de II (telle que f(r)=0f(r)=0 et f(r)=( jf i)(r)f'(r)=(\partial_j f_i)(r) inversible). Alors il existe ε>0\varepsilon&gt;0 tel que la suite définie par u n+1=u n(f(u n)) 1f(u n),|u 0r|ε u_{n+1} = u_n -(f'(u_n) )^{-1}f(u_n), \quad |u_0-r| \leq \varepsilon converge vers rr.

Si on a |f|M|f'{'}| \leq M et |(f) 1|m|(f')^{-1}| \leq m sur une boule centré en rr de rayon η>0\eta&gt;0 contenue dans II, alors on peut prendre tout réel ε>0\varepsilon&gt;0 tel que ε<2/(mM)\varepsilon &lt; 2/(mM) et εη\varepsilon \leq \eta.

La démonstration est calquée sur la dimension 1, mais il faut prendre le reste intégral dans la formule de Taylor u n+1r=u nrf(u n) 1f(u n)=f(u n) 1(f(u n)(u nr)f(u n)) u_{n+1}-r = u_n - r - f'(u_n)^{-1} f(u_n) = f'(u_n)^{-1} (f'(u_n)(u_n-r)-f(u_n) ) puis on applique Taylor le long du segment [r,u n][r,u_n] : 0=f(r)=f(u n)+f(u n)(ru n)+ 0 1(1θ)(ru n)f(r+θ(u nr))(ru n)dθ 0 = f(r)=f(u_n)+ f'(u_n) (r-u_n)+ \int_0^1 (1-\theta)(r-u_n) f'{'}(r+\theta (u_n-r)) (r-u_n) \, d\theta donc : u n+1r=f(u n) 1(ru n)( 0 1(1θ)f(r+θ(u nr))dθ)(ru n)u_{n+1}-r =-f'(u_n)^{-1} (r-u_n) \left(\int_0^1 (1-\theta)f'{'}(r+\theta (u_n-r)) \, d\theta \right) (r-u_n) et on en déduit (??) et on conclut de même en remplaçant intervalle centré en rr de rayon ε\varepsilon par boule de rayon ε\varepsilon.

Remarque : la convergence “numérique” (au sens du calcul en flottant) de la suite u nu_n ne suffit pas à montrer l’existence d’une racine proche de u nu_n. Une méthode de preuve alternative au calcul des constantes mm et MM consiste à trouver un rectangle ou une boule autour de u nu_n préservée par l’application xxf(x) 1f(x)x\rightarrow x-f'(x)^{-1} f(x).

6.5  Calcul approché des racines complexes simples

La section précédente nous a montré qu’on pouvait se ramener à la recherche de racines simples, ce qui donne envie d’essayer la méthode de Newton. On a malheureusement rarement la possibilité de pouvoir démontrer qu’à partir d’une valeur initiale donnée, la méthode de Newton converge, parce que les racines peuvent être complexes, et même si elles sont réelles, on n’a pas forcément de résultat sur la convexité du polynôme (cf. cependant une application des suites de Sturm qui permet de connaitre le signe de PP'{'} sur un intervalle sans le factoriser).

On effectue donc souvent des itérations de Newton, en partant de 0.0, en espérant s’approcher suffisamment d’une racine pour que le théorème de convergence théorique s’applique. On se fixe un nombre maximal d’itérations, si on le dépasse on prend alors une valeur initiale aléatoire complexe et on recommence.

Une fois une racine déterminée, on l’élimine en calculant le quotient euclidien QQ de PP par XrX-r (par l’algorithme de Horner), puis on calcule les racines du quotient QQ (qui sont des racines de PP).

Un problème pratique apparait alors, c’est que rr n’est pas exact donc le quotient QQ non plus, au fur et à mesure du calcul des racines de PP, on perd de plus en plus de précision. Il existe une amélioration simple, si rr' est une racine approchée de QQ, alors elle est racine approchée de PP et on a toutes les chances qu’elle soit suffisamment proche d’une racine de PP pour que le théorème s’applique, on effectue alors 1 ou 2 itérations de Newton avec rr' mais pour PP (et non QQ) afin d’améliorer sa précision comme racine de PP.

Une méthode de calcul plus stable utilise la recherche des valeurs propres de la matrice companion en double précision, puis affine par la méthode de Newton pour obtenir des valeurs approchées multi-précision, c’est ce que fait proot, par exemple proot(x^3+x+1,50).

Enfin, on peut appliquer directement la méthode de Newton pour trouver dans C n\C^n toutes les racines simultanément, c’est la méthode de Durand-Kerner, Weierstrass. On pose g x(z)= i=1 n(xz i)g_x(z)=\prod_{i=1}^n (x-z_i), il s’agit de résoudre en zz g x(z)=P(x)g_x(z)=P(x). On a a l’ordre 1 en zz g x(z+w)=g x(z) i=1 nw i ji(xz j)+O(w 2)=P(x)g_x(z+w)=g_x(z) - \sum_{i=1}^n w_i \prod_{j \neq i} (x-z_j) +O(w^2) =P(x) pour trouver w iw_i, on pose x=z ix=z_i, on obtient ji(z iz j)w i=P(z i)-\prod_{j \neq i}(z_i-z_j) w_i = P(z_i) donc w i=P(z i) ji(z iz j)w_i=-\frac{P(z_i)}{\prod_{j \neq i}(z_i-z_j)} On peut aussi calculer le produit du dénominateur en effectuant g x(z i)g_x'(z_i) (la dérivée porte sur xx). On retrouve la méthode de Newton à une variable où la dérivée du polynôme au dénominateur est remplacée par la valeur approchée du polynôme. D’où le programme

dw(P,N,eps):={ // Weierstrass, Durand-Kerner polynomial rooter
  local l,v,w,n,j,k,q,q1;
  P:=P/lcoeff(P);
  n:=degree(P);
  assume(l,symbol);
  v:=seq(exp(i*l/n*2.0*pi),l,0,n-1); w:=v;
  for k from 1 to N do
    q:=pcoeff(v);
    q1:=q';
    for j from 0 to n-1 do
      w[j]:=v[j]-horner(P,v[j])/horner(q1,v[j]);
    od;
    if (l2norm(w-v)<eps*l2norm(v))
      return w;
    v:=w;
  od;
  retourne "max iter reached";
}:;

Par exemple dw(x^3+x+1,100,1e-10) renvoie des valeurs approchées des racines de x 3+x+1x^3+x+1.

Si on s’intéresse seulement à la racine de module maximal d’un polynôme, on peut en trouver une estimation assez simplement en appliquant la méthode de la puissance à la matrice companion du polynôme. On peut améliorer la précision d’une racine par des itérations inverses ou par la méthode de Newton en une variable.

7  Réduction approchée des endomorphismes

On pourrait trouver des valeurs propres approchées d’une matrice en calculant le polynome caractéristique ou minimal puis en le factorisant numériquement. Mais cette méthode n’est pas idéale relativement aux erreurs d’arrondis (calcul du polynome caractéristiaue, de ses racines, et nouvelle approximation en calculant le noyau de AλIA-\lambda I), lorsqu’on veut calculer quelques valeurs propres on préfère utiliser des méthodes itératives directement sur AA ce qui évite la propagation des erreurs d’arrondi.

7.1  Méthode de la puissance

Elle permet de déterminer la plus grande valeur propre en valeur absolue d’une matrice diagonalisable lorsque celle-ci est unique. Supposons en effet que les valeurs propres de AA soient x 1,...,x nx_1,...,x_n avec |x 1||x 2|...|x n1|<|x n||x_1| \leq |x_2| \leq ... \leq |x_{n-1}| &lt; |x_n| et soient e 1,...,e ne_1,...,e_n une base de vecteurs propres correspondants. On choisit un vecteur aléatoire vv et on calcule la suite v k=Av k1=A kvv_k=Av_{k-1}=A^k v . Si vv a pour coordonnées V 1,...,V n)V_1,...,V_n) dans la base propre, alors v k= j=1 nV jx j ke j=x n kw k,w k= j=1 nV j(x jx n) ke j v_k = \sum_{j=1}^n V_j x_j^k e_j = x_n^k w_k, \quad w_k=\sum_{j=1}^n V_j \left(\frac{x_j}{x_n}\right)^k e_j L’hypothèse que x nx_n est l’unique valeur propre de module maximal entraine alors que lim k+w k=V ne n\lim_{k \rightarrow +\infty} w_k = V_n e_n puisque la suite géométrique de raison x j/x nx_j/x_n converge vers 0. Autrement dit, si V n0V_n\neq 0 (ce qui a une probabilité 1 d’être vrai pour un vecteur aléatoire), v kv_k est équivalent à V nx n ke nV_n x_n^k e_n. Lorsque nn est grand, v kv_k est presque colinéaire au vecteur propre e ne_n (que l’on peut estimer par v kv_k divisé par sa norme), ce que l’on détecte en testant si v k+1v_{k+1} et v kv_k sont presques colinéaires. De plus le facteur de colinéarité entre v k+1v_{k+1} et v kv_k est presque x nx_n, la valeur propre de module maximal.

Exercice : tester la convergence de v k=A kvv_k=A^kv vers l’espace propre associé à λ=3\lambda=3 pour la matrice [[1,-1],[2,4]] et le vecteur v=(1,0)v=(1,0). Attention à ne pas calculer A kA^k pour déterminer v kv_k, utiliser la relation de récurrence!

Si on n’observe pas de convergence ou si elle est trop lente, alors |x n1||x_{n-1}| est proche de |x n||x_n| ou égal, il est judicieux de faire subir à la matrice un shift, on remplace AA par AλIA-\lambda I. On peut prendre λ\lambda aléatoirement, ou bien mieux faire des itérations inverses sur AλIA-\lambda I si λ\lambda est une estimation d’une valeur propre (voir les itérations inverses ci-dessous).

Lorsqu’on applique cette méthode a une matrice réelle, il peut arriver quíl y ait deux valeurs propres conjuguées de module maximal. On peut appliquer la méthode ci-dessus avec un shift complexe non réel, mais on doit alors travailler en arithmétique complexe ce qui est plus couteux. Le même type de raisonnement que ci-dessus montre que pour kk grand, v k+2v_{k+2} est presque colinéaire à l’espace engendré par v kv_k et v k+1v_{k+1}, la recherche d’une relation av k+2+bv k+1+v k=0 av_{k+2}+ b v_{k+1} + v_k=0 permet alors de calculer les valeurs propres qui sont les deux racines de ax 2+bx+1=0ax^2+bx+1=0.

La convergence est de type série géométrique, on gagne le même nombre de décimales à chaque itération.

Applications :

Ceci peut par exemple servir à déterminer pour un polynôme PP donné squarefree (de degré nn et coefficient dominant p np_n) l’écart minimal entre 2 racines, on calcule
R:=normal(resultant(P,subst(P,x=x+y),x)/x^degree(P))
c’est un polynôme bicarré dont on cherche la plus petite racine en calculant le carré de la plus grande racine en module de numer(subst(R,y=1/sqrt(x))).

On peut obtenir un minorant à priori de cette plus petit racine en calculant resultant(P,P)=±p n 2n1 1i<jn(r ir j) 2 \mbox{resultant}(P,P')= \pm p_n^{2n-1} \prod_{1 \leq i &lt; j \leq n} (r_i-r_j)^2 on isole l’écart minimal au carré, on majore les autres carrés en majorant les racines, et on peut minorer le résultant à priori par 1 si PP est à coefficients entiers.

7.2  Itérations inverses

La méthode précédente permet de calculer la valeur propre de module maximal d’une matrice. Pour trouver une valeur propre proche d’une quantité donnée xx, on peut appliquer la méthode précédente à la matrice (AxI) 1(A-xI)^{-1} (en pratique on effectue LULU sur AxIA-xI et on résoud (AxI)u n+1=u n(A-xI)u_{n+1}=u_n). En effet, les valeurs propres de cette matrice sont les (x ix) 1(x_i-x)^{-1} dont la norme est maximale lorsqu’on se rapproche de x ix_i. Attention à ne pas prendre xx trop proche d’une valeur propre, car le calcul de (AxI)u n+1=u n(A-xI)u_{n+1}=u_n est alors peu précis (la matrice étant mal conditionnée).

7.3  Elimination des valeurs propres trouvées

Si la matrice AA est symétrique, et si e ne_n est un vecteur propre normé écrit en colonne, on peut considérer la matrice B=Ax ne ne n tB=A-x_n e_n e_n^t qui possède les mêmes valeurs propres et mêmes vecteurs propres que AA avec même multiplicité, sauf x nx_n qui est remplacé par 0. En effet les espaces propres de AA sont orthogonaux entre eux, donc Be n=x ne nx ne ne n te n=0,Be k=x ke kx ne ne n te k=x ke k Be_n=x_ne_n -x_n e_n e_n^t e_n = 0, Be_k = x_k e_k - x_n e_n e_n^t e_k = x_k e_k On peut donc calculer la 2ème valeur propre (en valeur absolue), l’éliminer et ainsi de suite.

Si la matrice AA n’est pas symétrique, il faut considérer B=Ax ne nf n t/e n.f nB=A-x_n e_n f_n^t /e_n.f_nf nf_n est vecteur propre de A tA^t associé à x nx_n. En effet f k.e j=0f_k.e_j=0 si iji \neq j car Ae k.f j=x ke k.f j=e k.A tf j=x je kf jAe_k.f_j=x_ke_k.f_j=e_k.A^tf_j=x_je_kf_j et donc f k.e k0f_k.e_k \neq 0 (sinon e ke_k est dans l’orthogonal de R n=\R^n=Vect(f 1,...,f n)(f_1,...,f_n).

7.4  Décomposition de Schur

Il s’agit d’une factorisation de matrice sous la forme A=PSP 1 A = P S P^{-1} PP est unitaire et SS diagonale supérieure. Existence (théorique) : on prend une valeur propre et un vecteur propre correspondant, puis on projette sur l’orthogonal de ce vecteur propre et on s’y restreint, on prend à nouveau une valeur propre et un vecteur propre correspondant, etc.

On peut approcher cette factorisation par un algorithme itératif qui utilise la factorisation QRQR d’une matrice quelconque comme produit d’une matrice unitaire par une matrice triangulaire supérieure à coefficients positifs sur la diagonale. On fait l’hypothèse que les valeurs propres de SS sur la diagonale sont classées par ordre de module strictement décroissant |λ 1|>|λ 2|>...>|λ n||\lambda_1|&gt;|\lambda_2|&gt;...&gt;|\lambda_n| (développement inspiré par Peter J. Olver dans le cas symétrique http://www.math.umn.edu/~olver/aims_/qr.pdf). On peut toujours s’y ramener quitte à remplacer AA par AαIA- \alpha I. Posons A 1=AA_1=A, et par récurrence A n=Q nR nA_n=Q_nR_n (avec Q nQ_n unitaire et RR triangulaire supérieure à coefficients diagonaux positifs), A n+1=R nQ nA_{n+1}=R_nQ_n. On a alors A k = (Q 1R 1)(Q 1R 1)(Q 1R 1)...(Q 1R 1)(Q 1R 1) = Q 1(R 1Q 1)(R 1Q 1)(R 1...Q 1)(R 1Q 1)R 1 = Q 1(Q 2R 2)(Q 2R 2)..(Q 2R 2)R 1 = Q 1Q 2(R 2Q 2)R 2..Q 2R 2R 1 = Q 1Q 2(Q 3R 3)...Q 3R 3R 2R 1 = Q 1...Q kR k...R 1 \begin{matrix} A^k & = & (Q_1 R_1) (Q_1 R_1) (Q_1 R_1) ... (Q_1 R_1) (Q_1 R_1) \\ & = & Q_1 (R_1 Q_1) (R_1 Q_1) (R_1 ... Q_1) (R_1 Q_1) R_1 \\ & = & Q_1 (Q_2 R_2) (Q_2 R_2) .. (Q_2 R_2) R_1 \\ & = & Q_1 Q_2 (R_2 Q_2) R_2 .. Q_2 R_2 R_1 \\ & = & Q_1 Q_2 (Q_3 R_3) ... Q_3 R_3 R_2 R_1 \\ & = & Q_1 ... Q_k R_k ...R_1 \end{matrix} D’autre part A=PSP 1A=PSP^{-1} donc A k=PS kP 1A^k = P S^k P^{-1}. Soit DD la forme diagonale de SS et UU la matrice de passage S=UDU 1S=UDU^{-1}, où UU est triangulaire supérieure et où on choisit la normalisation des coefficients sur la diagonale de UU valant 1. On a donc A k=PUD kU 1P 1 A^k = P U D^{k} U^{-1} P^{-1} Ensuite, on suppose qu’on peut factoriser U 1P 1=LU˜U^{-1}P^{-1}=L\tilde{U} sans permutations, donc qu’on ne rencontre pas de pivot nul, et quitte à multiplier les vecteurs unitaires de P 1P^{-1} par une constante complexe de module 1 on peut supposer que les pivots sont positifs donc que U˜\tilde{U} a des coefficients positifs sur la diagonale, on a alors A k=PUD kLU˜=Q 1...Q kR k...R 1 A^k = P U D^k L \tilde{U} = Q_1 ... Q_k R_k ...R_1 puis en multipliant par U˜ 1|D| k\tilde{U}^{-1} |D|^{-k} PUD kL|D| k=Q 1...Q kR k...R 1U˜ 1|D| k P U D^k L |D|^{-k} = Q_1 ... Q_k R_k ...R_1 \tilde{U}^{-1} |D|^{-k} R k...R 1U˜ 1|D| kR_k ...R_1 \tilde{U}^{-1} |D|^{-k} est triangulaire supérieure à coefficients positifs sur la diagonale et Q 1...Q kQ_1 ... Q_k est unitaire. On regarde ensuite les entrées de la matrice D kL|D| kD^k L |D|^{-k}, sous la diagonale elles convergent (géométriquement) vers 0, donc UD kL|D| kUD^k L |D|^{-k} tend vers une matrice triangulaire supérieure dont les coefficients diagonaux valent e ikarg(λ j)e^{i k\arg(\lambda_j)}. On montre que cela entraine que Q 1...Q kQ_1 ... Q_k est équivalent à P(D/|D|) kP(D/|D|)^k Q 1...Q kP(D/|D|) k,R k...R 1U˜ 1|D| k(D/|D|) kUD kL|D| k Q_1 ... Q_k \approx P (D/|D|)^{k}, \quad R_k ...R_1 \tilde{U}^{-1} |D|^{-k} \approx (D/|D|)^{-k} UD^k L |D|^{-k} Donc, Q kQ_k tend à devenir diagonale, et R kQ k=A k+1R_k Q_k=A_{k+1} triangulaire supérieure. De plus A=Q 1A 2Q 1 1=...=Q 1...Q kA k+1(Q 1...Q k) 1 A=Q_1 A_2 Q_1^{-1} = ... = Q_1 ... Q_k A_{k+1} (Q_1 ... Q_k)^{-1} la matrice A k+1A_{k+1} est donc semblable à AA.

En pratique, on n’impose pas la positivité des coefficients diagonaux de RR dans la factorisation QRQR, ce qui ne change évidemment pas le fait que Q kQ_k s’approche d’une matrice diagonale et A kA_k d’une matrice triangulaire supérieure (avec convergence à vitesse géométrique). On commence aussi par mettre la matrice AA sous forme de Hessenberg (par conjugaison par des matrices de Householder), c’est-à-dire presque triangulaire supérieure (on autorise des coefficients non nuls dans la partie inférieure seulement sur la sous-diagonale, a ij=0a_{ij}=0 si i>j+1i&gt;j+1). Cela réduit considérablement le temps de calcul de la décomposition QRQR, le produit RQRQ ayant encore cette propriété, une itération se fait en temps O(n 2)O(n^2) au lieu de O(n 3)O(n^3). Le calcul de RQRQ à partir de AA est d’ailleurs fait directement, on parle d’itération QRQR implicite.

On utilise aussi des “shifts” pour accélerer la convergence, c’est-à-dire qu’au lieu de faire QRQR et RQRQ sur la matrice A kA_k on le fait sur A kα kIA_k - \alpha_k Iλ k\lambda_k est choisi pour accélerer la convergence vers 0 du coefficient d’indice ligne nn colonne n1n-1 (idéalement il faut prendre α k\alpha_k proche de λ n\lambda_n la valeur propre de module minimal, afin de minimiser |λ nα k|/|λ n1α k||\lambda_n-\alpha_k|/|\lambda_{n-1}-\alpha_k|). En effet, si A kλ kI=Q kR kA_k - \lambda_k I = Q_k R_k et A k+1=R kQ k+λ kIA_{k+1}=R_kQ_k+\lambda_k I alors : (Aα 1I)...(Aα kI) = Q 1R 1(Q 1R 1(α 2α 1)I)...(Q 1R 1(α kα 1)I) = Q 1(R 1Q 1(α 2α 1)I)R 1(Q 1R 1(α 3α 1)I)...(Q 1R 1(α kα 1)I) = Q 1(A 2α 1I(α 2α 1)I)R 1Q 1(R 1Q 1(α 3α 1)I)R 1...(Q 1R 1(α kα 1)I) = Q 1(A 2α 2I)(A 2α 3I)...(A 2α kI)R 1 = ... = Q 1...Q kR k...R 1 \begin{matrix} (A-\alpha_1 I) ... (A-\alpha_k I) &= & Q_1R_1(Q_1R_1-(\alpha_2-\alpha_1)I) ...(Q_1R_1-(\alpha_k-\alpha_1)I) \\ &=& Q_1 (R_1Q_1 - (\alpha_2-\alpha_1)I)R_1 (Q_1R_1-(\alpha_3-\alpha_1)I) ...(Q_1R_1-(\alpha_k-\alpha_1)I) \\ &=& Q_1 (A_2 - \alpha_1 I -(\alpha_2-\alpha_1)I) R_1 Q_1(R_1Q_1-(\alpha_3-\alpha_1)I) R_1...(Q_1R_1-(\alpha_k-\alpha_1)I) \\ &=& Q_1 (A_2 - \alpha_2 I) (A_2 - \alpha_3 I) ... (A_2 - \alpha_{k}I) R_1 \\ &=& ... \\&=&Q_1 ... Q_k R_k ...R_1 \end{matrix} On peut aussi éliminer la dernière ligne et la dernière colonne de la matrice pour accélerer les calculs dès que le coefficient en ligne nn colonne n1n-1 est suffisamment petit.

On remarque que pour une matrice réelle si on choisit des shifts conjugués, alors Q 1...Q kR k...R 1Q_1...Q_k R_k...R_1 est réel. Or si QR=Q¯R¯QR=\overline{Q}\overline{R} et si RR est inversible Q¯ 1Q=R¯R 1 \overline{Q}^{-1} Q = \overline{R} R^{-1} On a donc une matrice symétrique (car Q¯ 1=Q t\overline{Q}^{-1}=Q^t) et triangulaire supérieure. On en déduit que Q¯ 1Q=D\overline{Q}^{-1} Q=D est diagonale, donc Q=Q¯DQ=\overline{Q} D. On peut donc rendre QQ réelle en divisant chaque colonne par un e iθe^{i\theta}, et rendre RR réelle en conjuguant par la matrice DD. Mais ce procédé de retour au réel après élimination de 2 valeurs propres complexes conjuguées d’une matrice réelle se heurte à un problème de conditionnement parce que le choix d’un shift intéressant pour la convergence va rendre la matrice RR proche d’une matrice non inversible (les deux derniers coefficients diagonaux de RR sont proches de 0). On a alors seulement Q¯ 1QR=R¯ \overline{Q}^{-1} Q R = \overline{R} Si on décompose Q¯ 1Q\overline{Q}^{-1} Q, RR, R¯\overline{R} par blocs n2,n2n-2,n-2, n2,2n-2,2, 2,n22,n-2 et 2,22,2, on a (QQ 11 QQ 12 QQ 21 QQ 22)(R 11 R 12 0 R 22) = (QQ 11R 11 QQ 21R 11 QQ 11R 12+QQ 12R 22 QQ 21R 12+QQ 22R 22) = (R¯ 11 R¯ 12 0 R¯ 22) \begin{matrix} \left(\begin{array}{cc} QQ_{11} & QQ_{12} \\ QQ_{21} & QQ_{22} \end{array} \right) \left(\begin{array}{cc} R_{11} & R_{12} \\ 0 & R_{22} \end{array} \right) &=& \left(\begin{array}{cc} QQ_{11} R_{11} & QQ_{21}R_{11} \\ QQ_{11} R_{12} + QQ_{12} R_{22} & QQ_{21} R_{12} + QQ_{22} R_{22} \end{array} \right) \\ &=& \left(\begin{array}{cc} \overline{R}_{11} & \overline{R}_{12} \\ 0 & \overline{R}_{22} \end{array} \right) \end{matrix} Donc on a QQ 11=R¯ 11R 11 1QQ_{11} =\overline{R}_{11} R_{11}^{-1}. Comme QQ est unitaire, QQ=Q¯ 1Q=Q tQQQ=\overline{Q}^{-1} Q=Q^t \, Q est symétrique, donc QQ 11QQ_{11} est diagonale puisque symétrique et triangulaire supérieure. On peut donc ramener Q 11Q_{11} et R 11R_{11} en des matrices réelles. L’algorihtme des itérations QRQR implicites traite de manière efficace le cas des couples de valeurs propres complexes conjuguées ou plus généralement de clusters de valeurs propres, c’est l’algorithme de Francis (aussi appelé bulge chasing en anglais, qu’on pourrait traduire par “à la poursuite du bourrelet”, cela vient de la forme que prend la matrice après application d’un shift, elle a des entrées non nulles en première colonne plus bas que la sous-diagonale qui forment un bourrelet non nul, l’annulation de ces entrées par des transformations de Householder déplace le bourrelet sur la colonne suivante).

Revenons à la localisation des valeurs propres (une autre approche consiste à rechercher un rectangle du plan complexe stable par itérée de la méthode de Newton). On suppose qu’on a maintenant une matrice unitaire PP et une matrice triangulaire supérieure SS (aux erreurs d’arrondi près) telles que P 1AP=S P^{-1} A P = S Que peut-on en déduire ? On va d’abord arrondir PP en une matrice exacte à coefficients rationnels, dont les dénominateurs sont une puissance de 2 (en fait c’est exactement ce que donne l’écriture d’un flottant en base 2, une fois ramené tous les exposants à la même valeur). On a donc une matrice P eP_e presque unitaire exacte et telle que S e=P e 1AP e S_e = P_e^{-1} A P_e est semblable à AA, et presque triangulaire supérieure. (comme P eP_e est presque unitaire, sa norme et la norme de son inverse sont proches de 1 donc S eS_e est proche de SS, les coefficients de S eS_e sont de la même taille que les coefficients de AA : le changement de base est bien conditionné et c’est la raison pour laquelle on a choisi d’effectuer des transformations unitaires).

Notons μ 1,...,μ n\mu_1, ..., \mu_n les coefficients diagonaux de S eS_e, soit ε\varepsilon un majorant de la norme des coefficients sous-diagonaux de S eS_e, et soit δ\delta un minorant de l’écart entre 2 μ j\mu_j distincts. On a donc S e=U+ES_e=U+EUU est triangulaire supérieure, EE est triangulaire inférieure avec des 0 sous la diagonale et des coefficients de module majorés par ε\varepsilon. Si ε\varepsilon est suffisamment petit devant δ\delta, on va montrer qu’on peut localiser les valeurs propres de S eS_e (qui sont celles de AA) au moyen des μ j\mu_j.

En effet, fixons jj et soit CC un cercle de centre μ=μ j\mu=\mu_j et de rayon αδ/2\alpha \leq \delta/2. Si AA est une matrice diagonalisable, on sait que nombre de valeurs propresC=12iπtrace C(AzI) 1 \mbox{nombre de valeurs propres} \in C = \frac{1}{2i\pi} \mbox{trace} \int_C (A-zI)^{-1} En prenant A=S eA=S_e, et en écrivant (S ezI) 1=(UzI+E) 1=(I+(UzI) 1E) 1(UzI) 1 (S_e-zI)^{-1} = (U-zI+E)^{-1} = ( I + (U-zI)^{-1}E)^{-1}(U-zI)^{-1} on développe le second terme si la norme de (UzI) 1E(U-zI)^{-1}E est strictement inférieure à 1 (S ezI) 1=(UzI) 1(UzI) 1E(UzI) 1+(UzI) 1E(UzI) 1E(UzI) 1+... (S_e-zI)^{-1} = (U-zI)^{-1} -(U-zI)^{-1}E(U-zI)^{-1} + (U-zI)^{-1}E(U-zI)^{-1}E(U-zI)^{-1} + ... puis on calcule la trace trace(S ezI) 1= j(μ jz) 1+η \mbox{trace}(S_e-zI)^{-1} = \sum_j (\mu_j-z)^{-1} + \eta avec |η|2πα||(UzI) 1||||(UzI) 1E||1||(UzI) 1E|| |\eta| \leq 2\pi \alpha || (U-zI)^{-1} || \frac{|| (U-zI)^{-1}E ||}{1-|| (U-zI)^{-1}E ||} Au final, le nombre de valeurs propres dans CC est donné par 1+η˜,|η˜|αmax zC||(UzI) 1||||(UzI) 1E||1||(UzI) 1E|| 1 + \tilde{\eta}, \quad |\tilde{\eta}| \leq \alpha \mbox{max}_{z \in C} || (U-zI)^{-1} || \frac{|| (U-zI)^{-1}E ||}{1-|| (U-zI)^{-1}E ||} Il suffit donc que le max soit plus petit que 1 pour avoir l’existence d’une valeur propre et une seule de S eS_e dans le cercle CC (à distance au plus α\alpha de μ\mu). Ce sera le cas si ε12(δ2||S e||) n1αn1 \varepsilon \leq \frac{1}{2} \left( \frac{\delta}{2 ||S_e||} \right)^{n-1} \frac{\alpha}{\sqrt{n-1}} on choisit donc α\alpha pour réaliser l’égalité ci-dessus, sous réserve que δ\delta ne soit pas trop petit, rappelons que α\alpha doit être plus petit ou égal à δ/2\delta/2. Si δ\delta est petit, il peut être nécessaire d’utiliser une précision plus grande pour les calculs de la décomposition de Schur en arithmétique flottante.

Typiquement, on peut espérer (pour un écart δ\delta pas trop petit) pouvoir localiser les racines d’un polynôme de degré nn par cette méthode avec précision bb bits en O(n 3b 2+n 2b 3)O(n^3 b^2 + n^2 b^3) opérations pour le calcul de la décomposition de Schur en flottant (n 3b 2n^3b^2 pour Hessenberg initial puis n 2b 2n^2b^2 par itération et un nombre d’itérations proportionnel à bb). Pour le calcul exact de S eS_e, il faut inverser une matrice de taille nn avec des coefficients de taille proportionnelle à bb donc O(n 4bln(n))O(n^4b\ln(n)) opérations (en modulaire, la taille des coefficients de l’inverse est O(nbln(n))O(nb \ln(n))) puis calculer un produit avec une matrice n,nn,n de coefficients de taille proportionnelle à bb, soit O(n 4b 2ln(nb))O(n^4b^2\ln(nb)) opérations. Asymptotiquement, on peut faire mieux avec des méthodes de multiplication et d’opérations matricielles par blocs. Pour éviter la perte d’un facteur nn, on peut aussi ne pas faire de calculs en mode exact et controler les erreurs sur la matrice SS. On peut regrouper les valeurs propres par “clusters” si elles sont trop proches à la précision de bb bits. Pour la recherche des racines d’un polynôme PP, on peut montrer, en calculant le résultant de PP et de PP' qui est en module plus grand ou égal à 1, et en l’écrivant comme produit des carrés de différences des racines, et en majorant toutes les différences de racine sauf une à l’aide de la norme infinie de PP, qu’il faut au pire b=O(n)b=O(n) bits pour séparer les racines).

8  Equations différentielles (résolution numérique)

8.1  Méthodes à un pas

On considère l’équation différentielle y=f(t,y),tR,y(t)R d,y(0)=y 0y'=f(t,y), \quad t \in \R, \quad y(t) \in \R^d, y(0)=y_0 y(t)y(t) est la fonction inconnue cherchée et où ff est une fonction régulière de tt et yy (par exemple C 1C^1 sur un domaine pour avoir existence et non recoupement des courbes intégrales dans ce domaine). On cherche à approcher numériquement y(t)y(t) pour t>0t&gt;0. On présente ici des méthodes de résolution numérique à un pas, dont le principe consiste à discrétiser l’intervalle [0,t][0,t] en des subdivisions en temps de petite taille [0,t 1],[t 1,t 2],...,[t n1,t n=t][0,t_1], [t_1,t_2], ..., [t_{n-1},t_n=t]. Si y iy_i est une valeur approchée de y(t i)y(t_i) la méthode à un pas se traduit par une relation de récurrence entre y iy_i et y i+1y_{i+1} qui reflète une méthode d’intégration approchée de y(t i+1)=y(t i)+ t i t i+1f(t,y(t))dty(t_{i+1})=y(t_i)+\int_{t_i}^{t_{i+1}} f(t,y(t)) \ dt Par exemple, la méthode d’Euler explicite utilise la méthode des rectangles à gauche y i+1=y i+(t i+1t i)f(t i,y i)=y i+hf(t i,y i)y_{i+1} = y_i + (t_{i+1}-t_i) f(t_i,y_i)=y_i+hf(t_i,y_i) h=t i+1t ih=t_{i+1}-t_i (pour une méthode à pas variable, le pas hh peut dépendre de ii) alors que la méthode d’Euler implicite utilise la méthode des rectangles à droite y i+1=y i+(t i+1t i)f(t i+1,y i+1)=y i+hf(t i+h,y i+1)y_{i+1} = y_i + (t_{i+1}-t_i) f(t_{i+1},y_{i+1})=y_i+hf(t_{i}+h,y_{i+1}) cette dernière relation nécéssite de résoudre une équation pour déterminer y i+1y_{i+1} d’où son nom de méthode implicite. Plus généralement, la méthode de résolution revient à se donner une fonction Φ(t,y,h)\Phi(t,y,h) et à poser : y i+1=y i+hΦ(t i,y i,h)y_{i+1}=y_i+h\Phi(t_i,y_i,h) pour la méthode d’Euler explicite, Φ(t,y,h)=f(t,y)\Phi(t,y,h)=f(t,y), pour la méthode d’Euler implicite, Φ\Phi s’obtient en résolvant une équation (par exemple avec la méthode du point fixe, pour hh suffisamment petit).

Lorsqu’on compare la solution de l’équation et une valeur approchée obtenue par une méthode à un pas, il faut distinguer

Plus précisément, on a le résultat suivant :

Théorème 19   Soit y(t)y(t) la solution de y=f(t,y),y(t 0)=y 0y'=f(t,y), y(t_0)=y_0 sur [t 0,T][t_0,T]. On considére une méthode de résolution à un pas : y i+1=y i+h iΦ(t i,y i,h i)y_{i+1}=y_i+h_i\Phi(t_i,y_i,h_i) Si la méthode est d’ordre pp, i.e. si pour h=max(h i)h=max(h_i) l’erreur locale satisfait |y(t)+hΦ(t,y(t),h)y(t+h)|C ph p+1,quadt[t 0,T],hH|y(t) + h\Phi(t,y(t),h)-y(t+h)|\leq C_p h^{p+1}, \ quad \forall t \in [t_0,T], h \leq H et si la fonction Φ\Phi est lipschitzienne en yy de constante Λ\Lambda pour hHh\leq H et yy dans un voisinage de la solution y(t)y(t), i.e. si |Φ(t,z,h)Φ(t,y,h)|Λ|zy||\Phi(t,z,h)-\Phi(t,y,h)| \leq \Lambda |z-y| alors l’erreur globale vérifie |y(t n)y n|h pC pΛ(e Λ(t nt 0)1)|y(t_n)-y_n| \leq h^p \frac{C_p}{\Lambda} (e^{\Lambda(t_n-t_0)}-1)

Par exemple, pour Euler explicite, Φ(t,y,h)=f(t,y)\Phi(t,y,h)=f(t,y), la constante Λ\Lambda est la constante de Lipschitz de ff, et on prendra pour C 1C_1 un majorant de 12| yf(t,y)|\frac12|\partial_y f(t,y)| dans un voisinage de la solution y(t)y(t) pour t[t 0,t n]t \in [t_0,t_n].

Pour prouver ce résultat, il faut déterminer comment se propagent les erreurs locales introduites à chaque pas. Par exemple, on a une erreur locale au pas 1 y(t 1)y 1y(t_1)-y_1 donc une condition initiale modifiée pour le pas 2 y 1y_1 au lieu de y(t 1)y(t_1). Cette erreur se propage au pas 2 en une erreur |y 1y(t 1)+h 1(Φ(t 1,y 1,h 1)Φ(t 1,y(t 1),h 1)|(1+h 1Λ)|y 1y(t 1)|e h 1Λ|y 1y(t 1)|| y_1-y(t_1)+h_1(\Phi(t_1,y_1,h_1)-\Phi(t_1,y(t_1),h_1)| \leq (1+h_1 \Lambda)|y_1-y(t_1)| \leq e^{h_1 \Lambda} |y_1-y(t_1)| De même aux pas suivants, donc au pas nn l’erreur locale au pas 1 s’est propagée en une erreur inférieure ou égale à  e h n1Λ...e h 2Λe h 1Λ|y 1y(t 1)|=e Λ(t nt 0)|y 1y(t 1)|C ph 0 p+1e Λ(t nt 0)e^{h_{n-1} \Lambda}... e^{h_2 \Lambda} e^{h_1 \Lambda} |y_1-y(t_1)| = e^{\Lambda (t_n-t_0)} |y_1-y(t_1)| \leq C_ph_0^{p+1} e^{\Lambda (t_n-t_0)} Il faut ensuite sommer les erreurs locales propagées de chaque pas i=0 n1C ph i p+1e Λ(t nt i)C ph p i=0 n1h ie Λ(t nt i)\sum_{i=0}^{n-1} C_p h_i^{p+1} e^{\Lambda (t_n-t_i)} \leq C_p h^p \sum_{i=0}^{n-1} h_i e^{\Lambda (t_n-t_i)} Comme e Λ(t nt)e^{\Lambda(t_n-t)} est positive décroissante sur [t 0,t n][t_0,t_n], on peut majorer la somme par l’intégrale C ph p t 0 t ne Λ(t nt)dtC_p h^p \int_{t_0}^{t_n} e^{\Lambda (t_n-t)} \ dt d’où le résultat.

(Voir aussi Demailly ou Hairer)

8.2  Méthodes de Runge-Kutta (explicites)

Ce sont des méthodes explicites qui utilisent une méthode de Newton-Cotes pour approcher f(t,y(t))dt\int f(t,y(t)) \ dt sur [t i,t i+1][t_i,t_{i+1}]. Pour simplifier les notations, notons t i=α,t i+1=βt_i=\alpha, t_{i+1}=\beta, on a alors α βf(t,y(t)) k=0 Nω kf(α k,y(α k)))\int_{\alpha}^{\beta} f(t,y(t)) \equiv \sum_{k=0}^N \omega_k f(\alpha_k,y(\alpha_k))) Pour estimer la valeur de f(α k,y(α k))f(\alpha_k,y(\alpha_k)), il est nécessaire d’approcher y(α k)y(\alpha_k) ce qui se fait par une méthode de Newton-Cotes, en utilisant les estimations des valeurs des y(α j),j<ky(\alpha_j), j&lt;k. On a donc des méthodes de Newton-Cotes avec un sous-ensemble croissant de points d’interpolation, donc pour chaque valeur de kk une suite de coefficients ω j,k,j<k\omega_{j,k}, j&lt;k correspondant à la méthode de Newton-Cotes utilisée. Il faut aussi indiquer la valeur de α k\alpha_k en donnant un coefficient c k[0,1]c_k \in [0,1] tel que α k=t i+c k(t i+1t i)=t i+c kh\alpha_k = t_i + c_k (t_{i+1}-t_i) = t_i+c_k h

En pratique on stocke un tableau dont les lignes donnent c kc_k et les c kω j,k,j<kc_k\omega_{j,k}, j&lt;k, et le calcul de y(α k)y(\alpha_k) se fait ligne par ligne y(α k)Y k=y(α 0)+h j=0 k1c kω j,kf(α j,y(α j))y(\alpha_{k}) \approx Y_{k}=y(\alpha_0) + h \sum_{j=0}^{k-1} c_k\omega_{j,k} f(\alpha_j,y(\alpha_j)) . Par exemple pour la méthode d’Euler explicite, il y a deux lignes contenant 0 et un seul coefficient : 0 : 1 : 1\begin{array}{ccc} 0 &:& \\ 1 &:& 1 \end{array} . Pour la méthode du point milieu, il y a trois lignes, la deuxière ligne exprime comment on estime y(t i+h/2)y(t_i+h/2), la troisième y(t i+1)=y(t i+h)y(t_{i+1})=y(t_i+h) : syntax error at token & on a donc y(t i+12h)Y 1=y(t i)+12hf(t i,y(t i))\begin{array}{cccc} 0 & : & \\ \frac12 &y(t_i+\frac12h) \approx Y_1=y(t_i)+\frac12hf(t_i,y(t_i)) y(t i+h)Y 2=y(t i)+hf(t i+h2,Y 1)=y(t i)+hf(t i+h2,y(t i)+h2f(t i,y(t i)))y(t_i+h) \approx Y_2=y(t_i)+hf(t_i+\frac{h}{2},Y_1)=y(t_i)+hf(t_i+\frac{h}{2},y(t_i)+\frac{h}{2}f(t_i,y(t_i)))

La suite des temps α k\alpha_k est croissante, mais pas forcément de manière stricte, on peut avoir α k=α k+1\alpha_k=\alpha_{k+1}, la valeur de y(α k)y(\alpha_k) n’étant pas estimée par la même méthode de Newton-Cotes que y(α k+1)y(\alpha_{k+1}). La valeur des coefficients est ensuite déterminée pour obtenir un ordre le plus grand possible pour l’erreur locale (ce qui peut nécessiter la résolution de systèmes avec pas mal d’inconnues).

Ainsi, la méthode RK4 utilise le tableau suivant syntax error at token & Ce qui se traduit par Y 1 = y(t 0)+h2f(t 0,y 0) Y 2 = y(t 0)+h2f(t 0+h2,Y 1) Y 3 = y(t 0)+hf(t 0+h,Y 2) Y 4 = y(t 0)+h6(f(t 0,y(t 0))+2f(t 0+h2,Y 1)+2f(t 0+h2,Y 2)+f(t 0+h,Y 3))\begin{array}{cccccc} 0 & : & \\ \frac12 & \begin{matrix} Y_1&=&y(t_0)+\frac{h}{2}f(t_0,y_0) \\ Y_2&=&y(t_0)+\frac{h}{2}f(t_0+\frac{h}{2},Y_1) \\ Y_3 &=& y(t_0)+h f(t_0+h,Y_2) \\ Y_4 &=& y(t_0) + \frac{h}{6} \left(f(t_0,y(t_0))+ 2f(t_0+\frac{h}{2},Y_1)+2f(t_0+\frac{h}{2},Y_2)+f(t_0+h,Y_3)\right) \end{matrix} Les méthodes de Newton-Cotes utilisées sont les rectangles à gauche puis à droite pour estimer le point milieu, et la méthode de Simpson (en prenant la moyenne des deux estimations pour le point milieu). On peut montrer qu’elle est d’ordre 4 (erreur locale en O(h 5)O(h^5))

Les méthodes de résolution numériques implémentées dans Xcas sont des méthodes explicites de Runge-Kutta emboitées avec pas adaptatif, (le pas adaptatif est calculé en estimant l’erreur avec 2 méthodes emboitées RK4 et Prince-Dormand, cf. Hairer).

9  Quelques références

Index

A  Développement de Taylor, séries entières, fonctions usuelles

Résumé: Séries entières. Calcul des fonctions transcendantes usuelles.

Soit ff une fonction indéfiniment dérivable sur un intervalle II de R\R et x 0Ix_0 \in I. On peut alors effectuer le développement de Taylor de ff en x 0x_0 à l’ordre nn T n(f)(x)=f(x 0)+(xx 0)f(x 0)+...+(xx 0) nf [n](x 0)n! T_n(f)(x)= f(x_0) + (x-x_0) f'(x_0) + ... + (x-x_0)^n \frac{f^{[n]}(x_0)}{n!} et se demander si T n(f)T_n(f) converge lorsque nn tend vers l’infini, si la limite est égale à f(x)f(x) et si on peut facilement majorer la différence entre f(x)f(x) et T n(f)(x)T_n(f)(x). Si c’est le cas, on pourra utiliser T n(f)(x)T_n(f)(x) comme valeur approchée de f(x)f(x).

On peut parfois répondre à ces questions simultanément en regardant le développement de Taylor de ff avec reste : il existe θ\theta compris entre x 0x_0 et xx tel que R n(x):=f(x)T n(f)(x)=(xx 0) n+1f [n+1](θ)(n+1)! R_n(x) := f(x)- T_n(f)(x) = (x-x_0)^{n+1}\frac{f^{[n+1]}(\theta)}{(n+1)!} C’est le cas pour la fonction exponentielle que nous allons détailler, ainsi que les fonctions sinus et cosinus.

A.1  La fonction exponentielle

Soit f(x)=exp(x)f(x)=\exp(x) et x 0=0x_0=0, la dérivée nn-ième de ff est exp(x)\exp(x), donc R n(x)=exp(θ)x n+1/(n+1)!R_n(x)=\exp(\theta)x^{n+1}/(n+1)! avec θ\theta compris entre 0 et xx, ainsi si xx est positif |R n(x)|e xx n+1/(n+1)!|R_n(x)| \leq e^x x^{n+1}/(n+1)! et si xx est négatif, |R n(x)|x n+1/(n+1)!|R_n(x)| \leq x^{n+1}/(n+1)!. Dans les deux cas, la limite de R nR_n est 0 lorsque nn tend vers l’infini, car pour n2xn \geq 2x, on a x n+1(n+1)!=x nn!xn+112x nn! \frac{x^{n+1}}{(n+1)!} = \frac{x^n}{n!} \frac{x}{n+1}\leq \frac{1}{2}\frac{x^n}{n!} on a donc pour tout xx réel e x=lim n+T n(f)(x)=lim n+ k=0 nx kk!= k=0 x kk! e^x = \lim_{n \rightarrow +\infty} T_n(f)(x) = \lim_{n \rightarrow +\infty} \sum_{k=0}^n \frac{x^k}{k!} = \sum_{k=0}^\infty \frac{x^k}{k!}

Comment en déduire une valeur approchée de e xe^x? Il suffira d’arrêter la sommation lorsque R:=x n+1/(n+1)!R:=x^{n+1}/(n+1)! si x<0x&lt;0 ou lorsque R:=e xx n+1/(n+1)!R:=e^x x^{n+1}/(n+1)! si x>0x&gt;0 est inférieur à l’erreur absolue souhaitée, le plus tôt étant le mieux pour des raisons d’efficacité et pour éviter l’accumulation d’erreurs d’arrondi. Si on veut connaitre e xe^x à une erreur relative ε\varepsilon donnée (par exemple ε=2 53\varepsilon=2^{-53} pour stocker le résultat dans un double) il suffit que R/e x<εR/e^x &lt; \varepsilon, donc si xx est positif, il suffit que x n+1/(n+1)!<εx^{n+1}/(n+1)!&lt;\varepsilon, on peut donc arrêter la sommation lorsque le terme suivant est plus petit que ε\varepsilon.

On observe que plus xx est grand, plus nn devra être grand pour réaliser le test d’arrêt, ce qui est facheux pour le temps de calcul. De plus, le résultat final peut être petit alors que les termes intermédiaires calculés dans la somme peuvent être grands, ce qui provoque une perte de précision relative, par exemple si on veut calculer e 10e^{-10} ou plus généralement l’exponentielle d’un nombre négatif de grande valeur absolue.

Exercice : combien de termes faut-il calculer dans le développement de l’exponentielle de -10 pour que le reste soit plus petit que 2 532^{-53} ? Quel est la valeur du plus grand terme rencontré dans la suite ? Quelle est la perte de précision relative occasionné par cette méthode de calcul ?

On peut utiliser les propriétés de la fonction exponentielle pour éviter ce problème. Pour les nombres négatifs, on peut utiliser l’équation e x=1/e xe^{-x}=1/e^x (ne change pas l’erreur relative). Pour les grands réels, on peut utiliser e 2x=(e x) 2e^{2x}=(e^x)^2 (multiplie par 2 l’erreur relative). On peut aussi, si on connait une valeur approchée de ln(2)\ln(2), effectuer la division euclidienne de xx par ln(2)\ln(2) avec reste symétrique : x=aln(2)+r,aZ,|r|ln(2)2 x = a \ln(2) + r, \quad a \in \Z, |r| \leq \frac{ln(2)}{2} puis si rr est positif, on somme la série de T(f)(r)T(f)(r), si rr est négatif, on calcule T(f)(r)T(f)(-r) et on inverse, on applique alors : e x=2 ae r e^x = 2^a e^r

Il faut toutefois noter que ln(2)\ln(2) n’étant pas connu exactement, on commet une erreur d’arrondi absolu sur rr d’ordre aηa \eta, où η\eta est l’erreur relative sur ln(2)\ln(2), il faut donc ajouter une erreur d’arrondi relative de x/ln(2)ηx/\ln(2) \eta qui peut devenir grande si xx est grand. Puis il faut ajouter la somme des erreurs d’arrondi due au calcul de e re^r, que l’on peut minimiser en utilisant la méthode de Horner pour évaluer T n(f)(r)T_n(f)(r) (car elle commence par sommer les termes de plus haut degré qui sont justement les plus petits termes de la somme). Les coprocesseurs arithmétiques qui implémentent la fonction exponentielle ont un format de représentation interne des double avec une mantisse plus grande que celle des double (par exemple 64 bits au lieu de 53), et une table contenant des constantes dont ln(2)\ln(2) avec cette précision, le calcul de e xe^x par cette méthode entraine donc seulement une erreur relative d’arrondi au plus proche sur le résultat converti en double (donc de 2 532^{-53}).

Notons que en général xx lui-même a déjà été arrondi ou n’est connu qu’avec une précision relative. Or si x>0x&gt;0 est connu avec une erreur relative de ε\varepsilon (donc une erreur absolue de ε|x|\varepsilon |x|, alors e x+ε|x|=e xe ε|x| e^{x+\varepsilon |x|}= e^x e^{\varepsilon |x|} donc on ne peut pas espérer mieux qu’une erreur relative de e ε|x|1e^{\varepsilon |x|}-1 sur l’exponentielle de xx. Si εx\varepsilon x est petit cette erreur relative (impossible à éviter, quel que soit l’algorithme utilisé pour calculer l’exponentielle) est d’ordre ε|x|\varepsilon |x|. Si εx\varepsilon x est grand alors l’erreur relative devient de l’ordre de 1, et la valeur de l’exponentielle calculée peut être très éloignée de la valeur réelle! Notons que pour les double, il y aura dans ce cas débordement soit vers l’infini soit vers 0 (par exemple si xx est supérieur à 709, l’exponentielle renvoie infini).

Exercice : refaire les mêmes calculs pour les fonction sinus ou cosinus. On utilise par exemple sin(x+π)=sin(x)\sin(x+\pi)=-sin(x), sin(x)=sin(x)\sin(-x)=-\sin(x), sin(x)=cos(π/2x)\sin(x)=\cos(\pi/2-x) pour se ramener au calcul de sin(x)\sin(x) ou de cos(x)\cos(x) sur [0,π/4][0,\pi/4]. sin(x)= n=0 (1) nx 2n+1(2n+1)!,cos(x)= n=0 (1) nx 2n(2n)! \sin(x)=\sum_{n=0}^\infty (-1)^n \frac{x^{2n+1}}{(2n+1)!}, \quad \cos(x)=\sum_{n=0}^\infty (-1)^n \frac{x^{2n}}{(2n)!}

Cette méthode a toutefois ces limites, car il peut devenir impraticable de calculer la dérivée nn-ième d’une fonction (par exemple avec tan(x)\tan(x)), et encore plus de la majorer. D’où l’intérêt de développer une théorie des fonctions qui sont égales à leur développement de Taylor à l’infini d’une part, et d’avoir d’autres méthodes pour majorer le reste, nous présentons ici le cas des séries alternées.

A.2  Séries entières.

Les séries de type prendre la limite lorsque nn tend vers l’infini du développement de Taylor en x=0 sont de la forme n=0 a nx n:=lim k+ n=0 ka nx n,a n=f [n](0)n! \sum_{n=0}^\infty a_n x^n := \lim_{ k \rightarrow +\infty} \sum_{n=0}^k a_n x^n, a_n=\frac{f^{[n]}(0)}{n!} On peut s’intéresser plus généralement à n=0 a nx n\sum_{n=0}^\infty a_n x^n lorsque a na_n est un complexe quelconque, c’est ce qu’on appelle une série entière, on peut aussi les voir comme des polynômes généralisés.

S’il existe un point x 0x_0 tel que |a nx 0 n||a_n x_0^n| est borné (ce sera le cas en particulier si la série converge en x 0x_0), alors |a nx n|=|a nx 0 n||xx 0| nM|xx 0| n |a_n x^n| = |a_n x_0^n| |\frac{x}{x_0}|^n \leq M |\frac{x}{x_0}|^n la série converge donc en xx si |x|<|x 0||x|&lt;|x_0| et on peut majorer le reste de la série au rang nn par |R n|M|xx 0| n+11|xx 0| |R_n| \leq M \frac{ |\frac{x}{x_0}|^{n+1}} {1-|\frac{x}{x_0}|} la vitesse de convergence est donc du même type que pour le théorème du point fixe (le nombre de termes à calculer pour trouver une valeur approchée avec kk décimales dépend linéairement kk, les constantes sont d’autant plus grandes que |x||x| est grand).

Théorème 20   S’il existe un rang n 0n_0, un réel M>0M&gt;0 et un complexe x 0x_0 tels que pour n>n 0n&gt;n_0, on ait : |a nx 0| nM |a_n x_0|^n \leq M alors la série converge pour |x|<|x 0||x|&lt;|x_0| et pour nn 0n\geq n_0, on a : |R n|M|xx 0| n+11|xx 0|(11) |R_n| \leq M \frac{ |\frac{x}{x_0}|^{n+1}} {1-|\frac{x}{x_0}|} \qquad (11)

On en déduit qu’il existe un réel positif R0R\geq 0 éventuellement égal à ++\infty tel que la série converge (la limite de la somme jusqu’à l’infini existe) lorsque |x|<R|x|&lt;R et n’existe pas lorsque |x|>R|x|&gt;R, ce réel est appelé rayon de convergence de la série. Par exemple ce rayon vaut ++\infty pour l’exponentielle, le sinus ou le cosinus. Il est égal à 1 pour la série géométrique x n\sum x^n (car elle diverge si |x|>1|x|&gt;1 et converge si |x|<1|x|&lt;1). On ne peut pas dire ce qui se passe génériquement lorsqu’on est à la limite, c’est-à-dire lorsque |x|=R|x|=R (si R+R\neq +\infty). Mais cela n’a en fait pas trop d’importance en pratique car même si la série converge, elle converge souvent trop lentement pour donner de bonnes approximations. En fait, la vitesse de convergence d’une série entière de rayon R+R\neq +\infty est en gros la même que celle d’une série géométrique de raison |x|/R|x|/R.

Lorsque 2 séries ont un rayon de convergence non nul, alors on peut effectuer leur somme, leur produit comme des polynômes et la série somme/produit a un rayon de convergence au moins égal au plus petit des 2 rayons de convergence des arguments. On peut inverser une série entière non nulle en 0 en appliquant (1+x) 1=1x+x 2x 3+... (1+x)^{-1} = 1-x+x^2-x^3+... et on obtient une série entière de rayon de convergence non nul. On peut aussi composer deux séries entières gg et ff en gfg\circ f (avec les règles de calcul de composition des polynômes) si f(0)=0f(0)=0. On peut enfin dériver et intégrer une série entière terme à terme dans son rayon de convergence.

On dit qu’une fonction est développable en série entière en 0 si elle est égale à son développement de Taylor en 0 sommé jusqu’en l’infini dans un disque de centre 0 et de rayon non nul. Les fonctions exponentielle, sinus, cosinus sont donc développables en série entière en 0. La fonction tangente également car le dénominateur cosinus est non nul en 0, mais son rayon de convergence n’est pas l’infini et le calcul des a na_n est assez complexe. La fonction (1+x) α(1+x)^\alpha est développable en séries entières pour tout αR\alpha \in \R avec un rayon de convergence 1 (ou l’infini pour α\alpha entier positif). (1+x) α=1+αx+α(α1)2!x 2+...+α(α1)...(αn+1)n!x n+... (1+x)^\alpha = 1 + \alpha x + \frac{\alpha (\alpha-1)}{2!} x^2 + ... + \frac{\alpha (\alpha-1) ... (\alpha -n +1)}{n!} x^n + ... Pour α=1\alpha=-1, c’est la série géométrique de raison x-x, en effet si |x|<1|x|&lt;1 : n=0 k(x) n=1(x) k+11+x k11+x \sum_{n=0}^k (-x)^n = \frac{1-(-x)^{k+1}}{1+x} \rightarrow_{k\rightarrow \infty} \frac{1}{1+x} En intégrant par rapport à xx, on obtient que ln(1+x)\ln(1+x) est développable en série entière en 0 de rayon de convergence 1 et ln(1+x)= n=0 (x) n+1n+1 \ln(1+x) = \sum_{n=0}^\infty \frac{(-x)^{n+1}}{n+1} On peut calculer de manière analogue le développement en série entière de arctan(x)\arctan(x) en iintégrant celui de 1/(1+x 2)1/(1+x^2), de même pour arccos(x)\arccos(x) et arcsin(x)\arcsin(x) en intégrant celui de (1x 2) 1/2(1-x^2)^{-1/2}. arctan(x)= n=0 (1) nx 2n+12n+1, \arctan(x)=\sum_{n=0}^\infty (-1)^{n} \frac{x^{2n+1}}{2n+1}, On peut donc calculer ln\ln, arctan\arctan, ... par ces formules, mais il faut répondre à la question où arrête-t-on la somme pour obtenir une précision donnée? Dans le cas de ln(1+x)\ln(1+x), on pourrait répondre comme avec l’exponentielle en majorant la dérivée n+1n+1-ième, mais ce n’est plus faisable pour arctan,arcsin,arccos\arctan, \arcsin, \arccos. On va donner un autre critère qui ne nécessite pas de calculer cette dérivée mais utilise l’alternance des signes dans la somme.

A.3  Série alternée

Théorème 21   Soit S n= k=0 n(1) ku kS_n= \sum_{k=0}^n (-1)^k u_k la somme jusqu’au rang nn d’une série de réels tels que la suite des u ku_k décroit à partir d’un rang n 0n_0 et tend vers 0 lorsque k+k\rightarrow +\infty. Alors S nS_n converge vers une limite SS. Si nn 0n\geq n_0, la limite est comprise entre deux sommes partielles succesives S nS_n et S n+1S_{n+1} et le reste est majoré par la valeur absolue du premier terme non sommé : |R n||u n+1| |R_n| \leq |u_{n+1}|

Démonstration :
on montre que les suites v n=S 2nv_n=S_{2n} et w n=S 2n+1w_n=S_{2n+1} sont adjacentes. On a v n+1v n=S 2n+2S 2n=(1) 2n+2u 2n+2+(1) 2n+1u 2n+1=u 2n+2u 2n+10 v_{n+1}-v_n= S_{2n+2}-S_{2n}= (-1)^{2n+2} u_{2n+2} + (-1)^{2n+1} u_{2n+1} = u_{2n+2}-u_{2n+1} \leq 0 donc v nv_n est décroissante, de même w nw_n est croissante, et v nw n=u 2n+1v_n-w_n=u_{2n+1} est positif et tend vers 0. On en déduit que v nv_n et w nw_n convergent vers la même limite SS telle que v n>S>w nv_n&gt;S&gt;w_n et les inégalités du théorème s’en déduisent.

Remarque
lorsqu’on utilise une suite alternée pour trouver une valeur approchée, il faut que u nu_n tende assez vite vers 0, sinon il y aura perte de précision sur la mantisse lorsqu’on effectuera u 2nu 2n+1u_{2n}-u_{2n+1}. On sommera aussi les termes par ordre décroissant pour diminuer les erreurs d’arrondi.

A.4  La fonction logarithme

Si nous voulons calculer ln(1+x)\ln(1+x) pour x[0,1[x \in [0,1[ avec une précision ε\varepsilon, il suffit de calculer k=0 n(1) kx k+1k+1 \sum_{k=0}^n (-1)^k \frac{x^{k+1}}{k+1} pour nn tel que la valeur absolue du terme suivant soit plus petit que ε\varepsilon : n tel que x n+1n+1<ε n \mbox{ tel que } \frac{x^{n+1}}{n+1} &lt; \varepsilon en effet, les signes sont alternés et la suite x k+1k+1\frac{x^{k+1}}{k+1} décroit vers 0.

Si la suite décroit lentement vers 0, cette méthode est mauvaise numériquement et en temps de calcul car il y a presque compensation entre termes successifs donc perte de précision sur la mantisse et il y a beaucoup de termes à calculer. C’est le cas pour le logarithme, si xx est voisin de 1, il faut calculer nn termes pour avoir une précision en 1/n1/n, par exemple 1 million de termes pour avoir une précision de 1e61e-6 (sans tenir compte des erreurs d’arrondi). Si xx est proche de 1/21/2 il faut de l’ordre de ln(ε)/ln(2)-\ln(\varepsilon)/\ln(2) termes ce qui est mieux, mais encore relativement grand (par exemple 50 termes environ pour une précision en 1e161e-16, 13 termes pour 1e41e-4). On a donc intérêt à se ramener si possible à calculer la fonction en un xx où la convergence est plus rapide (donc |x||x| le plus petit possible). Par exemple pour le calcul de ln(1+x)\ln(1+x) on peut :

Nous sommes donc en mesure de calculer précisément le logarithme ln(1+x)\ln(1+x) pour disons |x|<1/2|x|&lt;1/2. Pour calculer lnln sur R +\R^+, on se ramène à [1,2][1,2] en utilisant l’écriture mantisse-exposant, puis si x[3/2,2]x\in[3/2,2] on peut en prendre la racine carrée pour se retrouver dans l’intervalle souhaité. On peut aussi effectuer une division par 2\sqrt{2}.

Remarquons que si xx est connu à une erreur relative ε\varepsilon près, comme ln(x(1±ε))=ln(x)+ln(1±ε) \ln(x(1 \pm \varepsilon))=\ln(x) + \ln(1 \pm \varepsilon) ln(x)\ln(x) est connu à une erreur absolue de |ln(1±ε)|ε|\ln(1 \pm \varepsilon)| \approx \varepsilon. Si ln(x)\ln(x) est proche de 0, on a une grande perte de précision relative.

Finalement, nous savons calculer ln\ln et exp\exp sous réserve d’avoir dans une table la valeur de ln(2)\ln(2). Pour calculer ln(2)\ln(2) précisément, on peut utiliser ln(2)=ln(1/2)=ln(11/2) \ln(2)=-ln(1/2)=-ln(1-1/2) et le développement en série calculé en mode exact avec des fractions à un ordre suffisant, on majore le reste en utilisant que le terme général de la série ln(1+x)\ln(1+x) est borné par M=1M=1 en x=1x=1, donc d’après (??) : |R n|12 n |R_n| \leq \frac{1}{2^n} (on peut même obtenir 1/(n2 n)1/(n2^n) car on a besoin de MM uniquement pour les termes d’ordre plus grand que nn, on peut donc prendre M=1/nM=1/n). Par exemple, pour avoir ln(2)\ln(2) avec une mantisse de 80 bits, on effectue une fois pour toutes avec un logiciel de calcul formel :
a:=sum((1/2)^k/k,k=1..80)|
puis la division en base 2 avec 81 bits de précision iquo(numer(a)*2^81,denom(a))

Exercice : pour les fonctions trigonométriques, il faut une méthode de calcul de π\pi. On peut par exemple faire le calcul de 16arctan(1/5)4arctan(1/239)16 \arctan(1/5)-4\arctan(1/239) en utilisant le développement de la fonction arctan\arctan à un ordre suffisant.

A.5  Autres applications

On peut calculer certaines intégrales de la même manière, par exemple 0 1/211+x 3 \int _0^{1/2} \frac{1}{\sqrt{1+x^3}} mais aussi des fonctions définies par des intégrales (cas de nombreuses fonctions spéciales).

A.5.1  Exemple : la fonction d’erreur (error fonction, erf)

Cette fonction est définie à une constante multiplicative près par : f(x)= 0 xe t 2dt f(x)=\int_0^x e^{-t^2} \ dt On peut développer en séries entières l’intégrand (rayon de convergence ++\infty), puis intégrer terme à terme, on obtient f(x)= n=0 +(1) nx 2nn!(2n+1) f(x)= \sum_{n=0}^{+\infty} (-1)^n \frac{x^{2n}}{n! (2n+1)} Ce développement converge très rapidement pour |x|1|x|\leq 1. Par contre, pour |x||x| grand, il faut calculer beaucoup de termes avant que le reste soit suffisamment petit pour être négligeable, et certains termes intermédiaires sont grands, ce qui provoque une perte de précision qui peut rendre le résultat calculé complètement faux. Contrairement à la fonction exponentielle, il n’y a pas de possibilité de réduire l’argument à une plage où la série converge vite. Il faut donc

Exercice : donner une valeur approchée de f(1)f(1) à 1e161e-16 près. Combien de termes faut-il calculer dans la somme pour trouver une valeur approchée de f(7)f(7) à 1e161e-16 près ? Comparer la valeur de f(7)f(7) et la valeur absolue du plus grand terme de la série, quelle est la perte de précision relative si on effectue les calculs en virgule flottante ? Combien de chiffres significatifs faut-il utiliser pour assurer une précision finale de 16 chiffres en base 10 ? Calculer le développement asymptotique en l’infini et déterminer un encadrement de f(7)f(7) par ce développement. Combien de termes faut-il calculer pour déterminer f(10)f(10) à 1e161e-16 près par le développement asymptotique et par le développement en séries ? Quelle est la meilleure méthode pour calculer f(10)f(10) ?

A.5.2  Recherche de solutions d’équations différentielles

On peut aussi appliquer les techniques ci-dessus pour calculer des solutions de certaines équations différentielles dont les solutions ne s’expriment pas à l’aide des fonctions usuelles, on remplace dans l’équation la fonction inconnue par son développement en séries et on cherche une relation de récurrence entre a n+1a_{n+1} et a na_n. Si on arrive à montrer par exemple qu’il y a une solution ayant un développement alternée, ou plus généralement, si on a une majoration |a n+1/a n|<C|a_{n+1}/a_n|&lt;C, alors le reste de la série entière est majoré par |a nx n|/(1|Cx|)|a_nx^n|/(1-|Cx|) lorsque |x|<1/C|x|&lt;1/C, on peut alors calculer des valeurs approchées de la fonction solution à la précision souhaitée en utilisant le développement en séries entières.

A.5.3  Exemple : fonctions de Bessel d’ordre entier

Soit mm un entier positif fixé, on considère l’équation différentielle x 2y+xy+(x 2m 2)y=0 x^2 y'{'} + x y' + (x^2-m^2)y=0 dont on cherche une solution série entière y= k=0 a kx ky=\sum_{k=0}^\infty a_k x^k . En remplacant dans l’équation, si xx est dans le rayon de convergence de la série (rayon supposé non nul), on obtient k=0 k(k1)a kx k+ k=0 ka kx k+ k=0 (x 2m 2)a kx k=0 \sum_{k=0}^\infty k(k-1)a_k x^k + \sum_{k=0}^\infty k a_k x^k + \sum_{k=0}^\infty (x^2-m^2) a_k x^k =0 soit encore 0 = k=0 (k 2m 2+x 2)a kx k = m 2a 0+(1m 2)a 1x+ k=2 [(k 2m 2)a k+a k2]x k \begin{matrix} 0 &=& \sum_{k=0}^\infty (k^2-m^2+x^2) a_k x^k \\ &=& -m^2 a_0 + (1-m^2)a_1 x + \sum_{k=2}^\infty [(k^2-m^2) a_k +a_{k-2}]x^k \end{matrix} Par exemple, prenons le cas m=0m=0. On a alors a 0a_0 quelconque, a 1a_1 nul et pour k2k\geq 2 a k=a k2k 2 a_k = - \frac{a_{k-2}}{k^2} Donc tous les aa d’indice impair sont nuls. Les pairs sont non nuls si a 00a_0\neq 0, et ils sont de signe alterné. Soit xx fixé, on observe que pour 2k>|x|2k &gt; |x|, |a 2kx 2k|<|a 2k2x 2k2| |a_{2k} x^{2k}| &lt; |a_{2k-2} x^{2k-2}| donc la série k=0 a kx k\sum_{k=0}^\infty a_k x^k est alternée à partir du rang partie entière de |x||x| plus un. Donc elle converge pour tout xx (le rayon de convergence de yy est ++\infty) et le reste de la somme jusqu’à l’ordre 2n2n est inférieur en valeur absolue à : |R 2n(x)||a 2n+2x 2n+2| |R_{2n}(x)| \leq |a_{2n+2} x^{2n+2}| Par exemple, pour avoir une valeur approchée à 1e101e-10 près de y(x)y(x) pour a 0=1a_0=1 et |x|1|x|\leq 1, on calcule y= k=0 2na kx ky=\sum_{k=0}^{2n} a_k x^k , on s’arrête au rang nn tel que |a 2n+2x 2n+2||a 2n+2|10 10 |a_{2n+2} x^{2n+2}| \leq |a_{2n+2}| \leq 10^{-10} On remarque que : a 2n=(1) n2 24 2...(2n) 2=(1) n2 2nn! 2 a_{2n} = \frac{(-1)^n}{2^2 4^2 ... (2n)^2} = \frac{(-1)^n}{2^{2n} n!^2} donc n=7n=7 convient.

Pour m0m \neq 0, on peut faire un raisonnement analogue (les calculs sont un peu plus compliqués).

On a ainsi trouvé une solution y 0y_0 de l’équation différentielle de départ dont on peut facilement calculer une valeur approchée (aussi facilement que par exemple la fonction sinus pour |x|1|x| \leq 1), on peut alors trouver toutes les solutions de l’équation différentielle (en posant y=y 0zy=y_0 z et en cherchant zz).

Exercice : faire de même pour les solutions de yxy=0y'{'}-xy=0 (fonctions de Airy).

A.6  Développements asymptotiques et séries divergentes

Un développement asymptotique est une généralisation d’un développement de Taylor, par exemple lorsque le point de développement est en l’infini. De nombreuses fonctions ayant une limite en l’infini admettent un développement asymptotique en l’infini, mais ces développements sont souvent des séries qui semblent commencer par converger mais sont divergentes. Ce type de développement s’avère néanmoins très utile lorsqu’on n’a pas besoin d’une trop grande précision sur la valeur de la fonction.

Nous allons illustrer ce type de développement sur un exemple, la fonction exponentielle intégrale, définie à une constante près par f(x)= x +e ttdt f(x)=\int_x^{+\infty} \frac{e^{-t}}{t} \ dt On peut montrer que l’intégrale existe bien, car l’intégrand est positif et inférieur à e te^{-t} (qui admet e t-e^{-t} comme primitive, cette primitive ayant une limite en ++\infty). Pour trouver le développement asymptotique de ff en ++\infty, on effectue des intégrations par parties répétées, en intégrant l’exponentielle et en dérivant la fraction rationnelle f(x) = [e tt] x + x +e tt 2dt = e xx x +e tt 2dt = e xx([e tt 2] x + x +2e tt 3) = e xxe xx 2+ x +2e tt 3dt = ... = e x(1x1x 2+2x 3+...+(1) nn!x n+1) x +(1) n(n+1)!e tt n+2dt = S(x)+R(x) \begin{matrix} f(x)&=&[\frac{-e^{-t}}{t}]_x^{+\infty} - \int_x^{+\infty} \frac{-e^{-t}}{-t^2} \ dt \\ &=& \frac{e^{-x}}{x} - \int_x^{+\infty} \frac{e^{-t}}{t^2} \ dt \\ &=& \frac{e^{-x}}{x} - ([\frac{-e^{-t}}{t^2}]_x^{+\infty} - \int_x^{+\infty} \frac{-2e^{-t}}{-t^3}) \\ &=& \frac{e^{-x}}{x} - \frac{e^{-x}}{x^2} + \int_x^{+\infty} \frac{2e^{-t}}{t^3} \ dt \\ &=& ... \\ &=& e^{-x}\left(\frac{1}{x} - \frac{1}{x^2} + \frac{2}{x^3} + ... + \frac{(-1)^n n!}{x^{n+1}}\right) - \int_x^{+\infty} \frac{(-1)^n (n+1)!e^{-t}}{t^{n+2}} \ dt \\ &=& S(x) + R(x) \end{matrix} S(x)=e x(1x1x 2+2x 3+...+(1) nn!x n+1),R(x)= x +(1) n(n+1)!e tt n+2dt(12) S(x)=e^{-x} \left(\frac{1}{x} - \frac{1}{x^2} + \frac{2}{x^3} + ... + \frac{(-1)^n n!}{x^{n+1}}\right), \quad R(x)=- \int_x^{+\infty} \frac{(-1)^n (n+1)!e^{-t}}{t^{n+2}} \ dt \qquad (12) Le développement en séries est divergent puisque pour x>0x&gt;0 fixé et nn tendant vers l’infini lim n+n!x n+1=+ \lim_{n\rightarrow +\infty} \frac{n!}{x^{n+1}} = +\infty mais si xx est grand, au début la série semble converger, de manière très rapide : 1x>>1x 2>>2x 3 \frac{1}{x} &gt;&gt; \frac{1}{x^2} &gt;&gt; \frac{2}{x^3} On peut utiliser S(x)S(x) comme valeur approchée de f(x)f(x) pour xx grand si on sait majorer R(x)R(x) par un nombre suffisamment petit. On a |R(x)| x +(n+1)!e tx n+2=(n+1)!e xx n+2 | R(x) | \leq \int_x^{+\infty} \frac{(n+1)!e^{-t}}{x^{n+2}} = \frac{(n+1)!e^{-x}}{x^{n+2}} On retrouve une majoration du type de celle des séries alternées, l’erreur relative est inférieure à la valeur absolue du dernier terme sommé divisé par e x/xe^{-x}/x. Pour xx fixé assez grand, il faut donc trouver un rang nn, s’il en existe un, tel que (n+1)!/x n+1<ε(n+1)!/x^{n+1}&lt;\epsilonε\epsilon est la précision relative que l’on s’est fixée. Par exemple, si x100x\geq 100, n=11n=11 convient pour ε=12!/100 12=5e16\epsilon=12!/100^{12}=5e-16 (à peu près la précision relative d’un “double”). Ceci permet d’avoir une approximation de la fonction avec une bonne précision et peu de calculs, mais contrairement aux séries entières, il n’est pas possible d’améliorer cette précision de manière arbitraire en poussant le développement plus loin, il y a une précision maximale possible (qui dépend de xx).

Ce type de développement asymptotique peut être effectué pour d’autres fonctions du même type, par exemple x +e t 2dt, x +sin(t)tdt,... \int_x^{+\infty} e^{-t^2} \ dt, \quad \int_x^{+\infty} \frac{\sin(t)}{t} \ dt, \quad ...

Digression: calcul approché de la constante d’Euler γ\gamma
On peut montrer que lim n+u n,u n= k=1 n1kln(n)(13) \lim_{n\rightarrow +\infty} u_n, \quad u_n=\sum_{k=1}^{n}\frac{1}{k} - \ln(n) \qquad (13) existe (par exemple en cherchant un équivalent de u n+1u nu_{n+1}-u_n qui vaut 12n 2\frac{-1}{2n^2}) et on définit γ\gamma comme sa limite. Malheureusement, la convergence est très lente et cette définition n’est pas applicable pour obtenir la valeur de γ\gamma avec une très grande précision. Il y a un lien entre γ\gamma et la fonction exponentielle intégrale, plus précisément lorsque x0x\rightarrow 0, f(x)f(x) admet une singularité en ln(x)-\ln(x), plus précisément f(x)+ln(x)f(x)+\ln(x) admet un développement en séries (de rayon de convergence ++\infty), car : f(x)+ln(x) = x 1e t1tdt+ 1 +e ttdt = 0 1e t1tdt+ 1 +e ttdt 0 xe t1tdt \begin{matrix} f(x)+\ln(x)&=&\int_x^{1}\frac{e^{-t}-1}{t} \ dt + \int_1^{+\infty} \frac{e^{-t}}{t} \ dt \\ &=& \int_0^{1}\frac{e^{-t}-1}{t} \ dt + \int_1^{+\infty} \frac{e^{-t}}{t} \ dt - \int_0^{x} \frac{e^{-t}-1}{t} \ dt \end{matrix} Que vaut la constante du membre de droite : C= 0 1(e t1)1tdt+ 1 +e t1tdt C=\int_0^{1}(e^{-t}-1)\frac{1}{t} \ dt + \int_1^{+\infty} e^{-t} \frac{1}{t} \ dt Il se trouve que C=γC=-\gamma (voir plus bas une démonstration condensée) et donc : γ= 0 x1e ttdtf(x)ln(x)(14) \gamma= \int_0^{x} \frac{1-e^{-t}}{t} \ dt -f(x)-\ln(x) \qquad (14) Pour obtenir une valeur approchée de γ\gamma, il suffit donc de prendre un xx assez grand pour pouvoir calculer f(x)f(x) par son développement asymptotique à la précision requise, puis de calculer l’intégrale du membre de droite par le développement en séries en x=0x=0 (en utilisant une précision intermédiaire plus grande puisque ce développement en séries va sembler diverger au début avant de converger pour nn suffisamment grand). Par exemple, on pose x=13x=13, on calcule f(13)f(13) par (??) avec n=13n=13 (qui correspond au moment où le terme général de la série est minimum puisque le rapport de deux termes successifs est en n/xn/x) et une erreur absolue inférieure à e 1313!/13 14=4e12e^{-13} 13!/13^{14}=4e-12

f(13)f(13) \approx exp(-13)*sum((-1)^n*n!/13.^(n+1),n=0..13)

puis on remplace dans (??), avec 0 x1e ttdt= n=0 (1) nx n+1(n+1)(n+1)! \int_0^{x} \frac{1-e^{-t}}{t} \ dt = \sum_{n=0}^{\infty} (-1)^n \frac{x^{n+1}}{(n+1) (n+1)!} dont on obtient une valeur approchée, en faisant la somme jusqu’au rang 49 (pour lequel le terme général est de l’ordre de 1e-12), le reste de cette somme R 50R_{50} est positif et est inférieur à (-1)^50*13.^51/51/51!) qui est de l’ordre de 8e-12

evalf(sum((-1)^n*13^(n+1)/(n+1)/(n+1)!,n=0..49))

La somme argument de evalf étant exacte, il n’y a pas de problèmes de perte de précision, on peut aussi faire les calculs intermédiaires en arithmétique approchée, on doit alors prendre 4 chiffres significatifs de plus pour tenir compte de la valeur du plus grand terme sommé dans la série, terme que l’on détermine par exemple par

seq(13.^(n+1)/(n+1)/(n+1)!,n=0..20)

ce terme vaut 13^11/11/11! soit 4000 environ)

Digits:=16; sum((-1)^n*13.^(n+1)/(n+1)/(n+1)!,n=0..49)

On obtient finalement comme valeur approchée de γ\gamma

-exp(-13)*sum((-1)^n*n!/13.^(n+1),n=0..13)-ln(13)+
sum((-1)^n*13^(n+1)/(n+1)/(n+1)!,n=0..49)

soit 0.577215664897 avec une erreur inférieure à 1.2e-11. Bien entendu, cette méthode est surtout intéressante si on veut calculer un grand nombre de décimales de la constante d’Euler, sinon on peut par exemple appliquer la méthode d’accélération de Richardson à la suite convergente (??) qui définit γ\gamma ou d’autres méthodes d’accélération (en transformant par exemple la série en série alternée). On calcule alors de deux manières différentes f(x)f(x) pour xx plus grand (déterminé par la précision qu’on peut obtenir par le développement aymptotique de ff).

On peut calculer π\pi de la même manière avec le développement en séries et asymptotique de la fonction sinus intégral (on remplace exponentielle par sinus dans la définition de ff) et l’égalité (dont un schéma de preuve est aussi donné plus bas) 0 +sin(t)tdt=π2(15) \int_0^{+\infty} \frac{\sin(t)}{t} \ dt = \frac{\pi}{2} \qquad (15)

Calcul de CC (et preuve de (??)):
Pour cela on effectue une intégration par parties, cette fois en intégrant 1/t1/t et en dérivant l’exponentielle (moins 1 dans la première intégrale). C = 0 1(e t1)1tdt+ 1 +e t1tdt = [(e t1)ln(t)] 0 1+ 0 1ln(t)e tdt+[e tln(t)] 1 ++ 1 +ln(t)e tdt = 0 +ln(t)e tdt \begin{matrix} C&=&\int_0^{1}(e^{-t}-1)\frac{1}{t} \ dt + \int_1^{+\infty} e^{-t} \frac{1}{t} \ dt\\ &=&[(e^{-t}-1)\ln(t)]_0^1 +\int_0^1 \ln(t) e^{-t} \ dt + [e^{-t} \ln(t)]_1^{+\infty} +\int_1^{+\infty} \ln(t) e^{-t} \ dt \\ &=& \int_0^{+\infty} \ln(t) e^{-t} \ dt \end{matrix} Pour calculer cette intégrale, on utilise l’égalité (qui se démontre par récurrence en faisant une intégration par parties) : n!= 0 +t ne tdt n!= \int_0^{+\infty}t^n e^{-t} \ dt On va à nouveau intégrer par parties, on intègre un facteur multiplicatif 1 et on dérive l’intégrand, on simplifie, puis on intègre tt et on dérive l’autre terme, puis t 2/2t^2/2, etc. C = [te tln(t)] 0 + 0 +te t(1tln(t))dt = 0 0 +e tdt+ 0 +te tln(t)dt = 1+[t 22e tln(t)] 0 + 0 +t 22e t(1tln(t))dt = 1 0 +t2e t+ 0 +t 22e tln(t)dt = 112+ 0 +t 22e tln(t)dt = ... = 112...1n+ 0 +t nn!e tln(t)dt = 112...1n+ln(n)+I n \begin{matrix} C&=&[te^{-t} \ln(t)]_0^{+\infty} - \int_0^{+\infty} t e^{-t}(\frac{1}{t}-\ln(t)) \ dt \\ &=& 0 - \int_0^{+\infty} e^{-t} \ dt + \int_0^{+\infty} t e^{-t} \ln(t) \ dt \\ &=& -1 + [\frac{t^2}{2}e^{-t} \ln(t)]_0^{+\infty} - \int_0^{+\infty} \frac{t^2}{2} e^{-t}(\frac{1}{t}-\ln(t)) \ dt \\ &=& -1 - \int_0^{+\infty} \frac{t}{2} e^{-t} + \int_0^{+\infty} \frac{t^2}{2} e^{-t} \ln(t) \ dt \\ &=& -1 - \frac{1}{2} + \int_0^{+\infty} \frac{t^2}{2} e^{-t} \ln(t) \ dt \\ &=& ...\\ &=& -1 - \frac{1}{2} - ... - \frac{1}{n} + \int_0^{+\infty} \frac{t^n}{n!} e^{-t} \ln(t) \ dt \\ &=& -1 - \frac{1}{2} - ... - \frac{1}{n} + \ln(n) + I_n \end{matrix} I n= 0 +t nn!e t(ln(t)ln(n))dt I_n=\int_0^{+\infty} \frac{t^n}{n!} e^{-t} (\ln(t)-\ln(n)) \ dt Pour déterminer I nI_n on fait le changement de variables t=nut=nu I n = 0 +(nu) nn!e nuln(u)ndu = n n+1n! 0 +e n(ln(u)u)ln(u)du \begin{matrix} I_n&=&\int_0^{+\infty} \frac{(nu)^n}{n!} e^{-nu} \ln(u) n\ du \\ &=& \frac{n^{n+1}}{n!} \int_0^{+\infty} e^{n(ln(u)-u)} \ln(u) \ du \end{matrix} Or en faisant le même changement de variables t=nut=nu : n!= 0 +t ne tdt=n n+1 0 +e n(ln(u)u)du n!= \int_0^{+\infty}t^n e^{-t} \ dt = n^{n+1} \int_0^{+\infty} e^{n(ln(u)-u)} \ du Donc I n= 0 +e n(ln(u)u)ln(u)du 0 +e n(ln(u)u)du I_n= \frac{\int_0^{+\infty} e^{n(ln(u)-u)} \ln(u) \ du} {\int_0^{+\infty} e^{n(ln(u)-u)} \ du} Lorsque nn tend vers l’infini, on peut montrer que I n0I_n \rightarrow 0, en effet les intégrales sont équivalentes à leur valeur sur un petit intervalle autour de u=1u=1, point où l’argument de l’exponentielle est maximal, et comme l’intégrand du numérateur a une amplitude ln(u)\ln(u) qui s’annule en u=1u=1, il devient négligeable devant le dénominateur. Finalement on a bien C=γC=-\gamma.

On peut remarquer qu’en faisant le même calcul que CC mais en remplacant e te^{-t} par e αte^{-\alpha t} pour (α)>0\Re(\alpha)&gt;0, donne limI n=ln(α)\lim I_n=-\ln(\alpha) (car le point critique où la dérivée de la phase s’annule est alors 1/α1/\alpha). Ceci peut aussi se vérifier pour α\alpha réel en faisant le changement de variables αt=u\alpha t=u 0 1(e αt1)1tdt+ 1 +e αt1tdt=γln(α) \int_0^{1}(e^{-\alpha t}-1)\frac{1}{t} \ dt + \int_1^{+\infty} e^{-\alpha t} \frac{1}{t} \ dt = -\gamma -\ln(\alpha) En faisant tendre α\alpha vers i-i, ln(α)-\ln(\alpha) tend vers ln(i)=iπ2\ln(i)=i\frac{\pi}{2} et on obtient 0 1(e it1)1tdt+ 1 +e it1tdt=γ+iπ2 \int_0^{1}(e^{it}-1)\frac{1}{t} \ dt + \int_1^{+\infty} e^{i t} \frac{1}{t} \ dt = -\gamma + i \frac{\pi}{2} dont la partie imaginaire nous donne (??), et la partie réelle une autre identité sur γ\gamma faisant intervenir la fonction cosinus intégral.

B  La moyenne arithmético-géométrique.

B.1  Définition et convergence

Soient aa et bb deux réels positifs, on définit les 2 suites u 0=a,v 0=b,u n+1=u n+v n2,v n+1=u nv n(16) u_0=a, v_0=b, \quad u_{n+1}=\frac{u_n+v_n}{2}, v_{n+1}=\sqrt{u_nv_n} \qquad (16) On va montrer que ces 2 suites sont adjacentes et convergent donc vers une limite commune notée M(a,b)M(a,b) et il se trouve que la convergence est très rapide, en raison de l’identité : u n+1v n+1=12(u nv n) 2=12(u n+v n) 2(u nv n) 2(17) u_{n+1}-v_{n+1}=\frac{1}{2}(\sqrt{u_n}-\sqrt{v_n})^2 =\frac{1}{2(\sqrt{u_n}+\sqrt{v_n})^2}(u_n-v_n)^2 \qquad (17) la convergence est quadratique.

On suppose dans la suite que aba\geq b sans changer la généralité puisque échanger aa et bb ne change pas la valeur de u nu_n et v nv_n pour n>0n&gt;0. On a alors u nv nu_n \geq v_n (d’après (??) pour n>0n&gt;0) et u n+1u nu_{n+1} \leq u_n car u n+1u n=12(v nu n)0 u_{n+1}-u_n=\frac{1}{2}(v_n-u_{n}) \leq 0 et v n+1=u nv nv nv n=v nv_{n+1}=\sqrt{u_nv_n} \geq \sqrt{v_nv_n}=v_n. Donc (u n)(u_n) est décroissante minorée (par v 0v_0), (v n)(v_n) est croissante majorée (par u 0u_0), ces 2 suites sont convergentes et comme u n+1=u n+v n2u_{n+1}=\frac{u_n+v_n}{2}, elles convergent vers la même limite ll qui dépend de aa et bb et que l’on note M(a,b)M(a,b). On remarque aussi que M(a,b)=bM(a/b,1)=aM(1,b/a)M(a,b)=bM(a/b,1)=aM(1,b/a).

Précisons maintenant la vitesse de convergence lorsque ab>0a \geq b&gt;0. On va commencer par estimer le nombre d’itérations nécessaires pour que u nu_n et v nv_n soient du même ordre de grandeur. Pour cela, on utilise la majoration ln(u n+1)ln(v n+1)ln(u n)ln(v n+1)=12(ln(u n)ln(v n)) \ln(u_{n+1})-\ln(v_{n+1}) \leq \ln(u_{n})-\ln(v_{n+1}) = \frac{1}{2} (\ln(u_{n})-\ln(v_{n})) donc lnu nv n=ln(u n)ln(v n)12 n(ln(a)ln(b))=12 nlnab \ln \frac{u_n}{v_n} = \ln(u_n)-\ln(v_n) \leq \frac{1}{2^n} (\ln(a)-\ln(b)) = \frac{1}{2^n} \ln \frac{a}{b} Donc si nln(ln(a/b)/m)ln(2)n \geq \frac{\ln( \ln(a/b)/m)}{\ln(2)} alors lnu nv nm\ln \frac{u_n}{v_n} \leq m (par exemple, on peut prendre m=0.1m=0.1 pour avoir u n/v n[1,e 0.1])u_n/v_n \in [1,e^{0.1}]). Le nombre minimum d’itérations n 0n_0 est proportionnel au log du log du rapport a/ba/b. Ensuite on est ramené à étudier la convergence de la suite arithmético-géométrique de premiers termes a=u n 0a=u_{n_0} et b=v n 0b=v_{n_0} et même en tenant compte de M(a,b)=aM(1,b/a)M(a,b)=aM(1,b/a) à a=1a=1 et b=v n/u nb=v_n/u_n donc 0ab1e 0.10\leq a-b \leq 1-e^{-0.1}. Alors l’équation (??) entraine u n+1v n+118(u nv n) 2 u_{n+1}-v_{n+1} \leq \frac{1}{8}(u_n-v_n)^2 puis (par récurrence) 0u nv n18 2 n1(ab) 2 n 0 \leq u_n-v_n \leq \frac{1}{8^{2^n-1}}(a-b)^{2^n} Donc comme M(a,b)M(a,b) est compris entre v nv_n et u nu_n, l’erreur relative sur la limite commune est inférieure à une précision donnée ε\epsilon au bout d’un nombre d’itérations proportionnel au ln(ln(1/ε))\ln(\ln(1/\epsilon)).

Typiquement dans la suite, on souhaitera calculer M(1,b)M(1,b) avec bb de l’ordre de 2 n2^{-n} en déterminant nn chiffres significatifs, il faudra alors O(ln(n))O(\ln(n)) itérations pour se ramener à M(1,b)M(1,b) avec b[e 0.1,1]b\in [e^{-0.1},1] puis O(ln(n))O(\ln(n)) itérations pour avoir la limite avec nn chiffres significatifs.

Le cas complexe
On suppose maintenant que a,bCa, b \in \C avec (a)>0,(b)>0\Re(a)&gt;0, \Re(b)&gt;0. On va voir que la suite arithmético-géométrique converge encore.
Étude de l’argument
On voit aisément (par récurrence) que (u n)>0\Re(u_n)&gt;0 ; de plus (v n)>0\Re(v_n) &gt; 0 car par définition de la racine carrée (v n)0\Re(v_n)\geq 0 et est de plus non nul car le produit de deux complexes d’arguments dans ]π/2,π/2[]-\pi/2,\pi/2[ ne peut pas être un réel négatif. On en déduit que arg(u n+1)=arg(u n+v n)\arg(u_{n+1})=\arg(u_n+v_n) se trouve dans l’intervalle de bornes arg(u n)\arg(u_n) et arg(v n)\arg(v_n) et que arg(v n+1)=12(arg(u n)+arg(v n))\arg(v_{n+1})=\frac{1}{2}(\arg(u_n)+\arg(v_n)) donc |arg(u n+1arg(v n+1)|12|arg(u n)arg(v n)| | \arg(u_{n+1}-\arg(v_{n+1}) | \leq \frac{1}{2}|\arg(u_n)-\arg(v_n)| Après nn itérations, on a |arg(u n)arg(v n)|π2 n |\arg(u_n)-\arg(v_n)| \leq \frac{\pi}{2^n} Après quelques itérations, u nu_n et v nv_n seront donc presque alignés. Faisons 4 itérations. On peut factoriser par exemple v nv_n et on est ramené à l’étude de la suite de termes initiaux a=u n/v na=u_n/v_n d’argument arg(u n)arg(v n)\arg(u_n)-\arg(v_n) petit (inférieur en valeur absolue à π/16\pi/16) et b=1b=1. On suppose donc dans la suite que |arg(u nv n)|π/162 n |\arg(\frac{u_n}{v_n})| \leq \frac{\pi/16}{2^n} Étude du module
On a : u n+1v n+1=12(u nv n+1u nv n) \frac{u_{n+1}}{v_{n+1}}= \frac{1}{2}\left(\sqrt{\frac{u_{n}}{v_{n}}}+\frac{1}{\sqrt{\frac{u_{n}}{v_{n}}}}\right) Posons u nv n=ρ ne iθ n \frac{u_{n}}{v_{n}}=\rho_n e^{i\theta_n}, on a : |u n+1v n+1| = 12|ρ ne iθ n/2+1ρ ne iθ n/2| = 12|(ρ n+1ρ n)cosθ n2+i(ρ n1ρ n)sinθ n2| = 12(ρ n+1ρ n) 2cos 2θ n2+(ρ n1ρ n) 2sin 2θ n2 = 12ρ n+1ρ n+2cosθ n \begin{matrix} |\frac{u_{n+1}}{v_{n+1}}| &= & \frac{1}{2}\left|\sqrt{\rho_n} e^{i\theta_n/2} + \frac{1}{\sqrt{\rho_n}} e^{-i\theta_n/2} \right| \\ &=& \frac{1}{2} \left| (\sqrt{\rho_n}+ \frac{1}{\sqrt{\rho_n}})\cos\frac{\theta_n}{2} + i (\sqrt{\rho_n}- \frac{1}{\sqrt{\rho_n}})\sin\frac{\theta_n}{2} \right| \\ &=& \frac{1}{2} \sqrt{ (\sqrt{\rho_n}+ \frac{1}{\sqrt{\rho_n}})^2\cos^2\frac{\theta_n}{2} + (\sqrt{\rho_n}- \frac{1}{\sqrt{\rho_n}})^2\sin^2\frac{\theta_n}{2} } \\ &=& \frac{1}{2} \sqrt{ \rho_n+ \frac{1}{\rho_n} +2\cos \theta_n } \end{matrix} Si ρ\rho désigne le max de ρ n\rho_n et 1/ρ n1/\rho_n, on a alors la majoration |u n+1v n+1|12ρ+ρ+2ρ=ρ |\frac{u_{n+1}}{v_{n+1}}| \leq \frac{1}{2} \sqrt{ \rho + \rho + 2 \rho } = \sqrt{\rho} donc en prenant les logarithmes lnρ n+112lnρ=12|lnρ n|(18) \ln \rho_{n+1} \leq \frac{1}{2} \ln \rho=\frac{1}{2} |\ln \rho_n| \qquad (18) On rappelle qu’on a la majoration |arg(u nv n)|=|θ n|π/162 n12 n+1 |\arg(\frac{u_n}{v_n})| = |\theta_n| \leq \frac{\pi/16}{2^n} \leq \frac{1}{2^{n+1}} qui va nous donner la minoration de ρ n+1\rho_{n+1} ρ n+1=|u n+1v n+1| = 12ρ n+1ρ n+22(1cosθ n) = 12ρ n+1ρ n+24sin 2(θ n2) 12ρ n+1ρ n+2θ n 2 12ρ n+1ρ n+2×1θ n 2ρ n+1ρ n+2 121ρ+1ρ+21ρ×1θ n 24 1ρ1θ n 24 1ρ114×2 2n+2 \begin{matrix} \rho_{n+1}=|\frac{u_{n+1}}{v_{n+1}}| & = & \frac{1}{2} \sqrt{ \rho_n+ \frac{1}{\rho_n} +2 - 2 (1-\cos \theta_n) } \\ & = & \frac{1}{2} \sqrt{ \rho_n+ \frac{1}{\rho_n} +2 - 4 \sin^2 (\frac{\theta_n}{2}) } \\ & \geq & \frac{1}{2} \sqrt{ \rho_n+ \frac{1}{\rho_n} +2 - \theta_n^2} \\ & \geq & \frac{1}{2} \sqrt{ \rho_n+ \frac{1}{\rho_n} +2} \times \sqrt{1 - \frac{\theta_n^2}{\rho_n+ \frac{1}{\rho_n} +2}} \\ & \geq & \frac{1}{2} \sqrt{ \frac{1}{\rho} + \frac{1}{\rho} +2\frac{1}{\rho}} \times \sqrt{1 - \frac{\theta_n^2}{4}} \\ & \geq & \frac{1}{\sqrt{\rho}} \sqrt{1 - \frac{\theta_n^2}{4}} \\ & \geq & \frac{1}{\sqrt{\rho}} \sqrt{1 - \frac{1} {4 \times 2^{2n+2}}} \end{matrix} en prenant les log et en minorant ln(1x)\ln(1-x) par 2x-2x lnρ n+112(|lnρ n|+ln(114×2 2n+2))12(|lnρ n|+12 2n+3) \ln \rho_{n+1} \geq \frac{1}{2} (-|\ln \rho_n|+\ln(1 -\frac{1} {4 \times 2^{2n+2}} )) \geq -\frac{1}{2} (|\ln \rho_n|+\frac{1} {2^{2n+3}} ) Finalement avec (??) |lnρ n+1|12(|lnρ n|+12 2n+3) |\ln \rho_{n+1}| \leq \frac{1}{2} (|\ln \rho_n|+\frac{1}{2^{2n+3}} ) On en déduit |lnρ n|12 nlnρ 0+12 n+3+...+12 2n+1+12 2n+2=12 nlnρ 0+12 n+2 |\ln \rho_n| \leq \frac{1}{2^n} \ln \rho_0 + \frac{1}{2^{n+3}} + ... + \frac{1}{2^{2n+1}} + \frac{1}{2^{2n+2}} = \frac{1}{2^n} \ln \rho_0 + \frac{1}{2^{n+2}} La convergence du ln(u n/v n)\ln(u_n/v_n) vers 0 est donc géométrique, donc u nu_n et v nv_n convergent quadratiquement.

B.2  Lien avec les intégrales elliptiques

Le calcul de la limite commune des suites u nu_n et v nv_n en fonction de aa et bb n’est pas trivial au premier abord. Il est relié aux intégrales elliptiques, plus précisément on peut construire une intégrale dépendant de deux paramètres aa et bb et qui est invariante par la transformation u n,v nu n+1,v n+1u_n,v_n \rightarrow u_{n+1},v_{n+1} (??) I(a,b)= +dt(a 2+t 2)(b 2+t 2) I(a,b)=\int_{-\infty}^{+\infty} \frac{dt} {\sqrt{(a^2+t^2)(b^2+t^2)}} On a en effet I(a+b2,ab)= +du((a+b2) 2+u 2)(ab+u 2) I(\frac{a+b}{2},\sqrt{ab}) = \int_{-\infty}^{+\infty} \frac{du}{\sqrt{((\frac{a+b}{2})^2+u^2)(ab+u^2)}} On pose alors u=12(tabt),t>0 u=\frac{1}{2} (t-\frac{ab}{t}), \quad t&gt;0 tut \rightarrow u est une bijection croissante de t]0,+[t\in]0,+\infty[ vers u],+[u \in ]-\infty,+\infty[, donc I(a+b2,ab) = 0 +dt/2(1+ab/t 2)((a+b2) 2+1/4(tab/t) 2)(ab+1/4(tab/t) 2) = 2 0 +dt(a 2+t 2)(b 2+t 2)=I(a,b) \begin{matrix} I(\frac{a+b}{2},\sqrt{ab}) &=& \int_{0}^{+\infty} \frac{dt/2(1+ab/t^2)}{\sqrt{((\frac{a+b}{2})^2+1/4(t-ab/t)^2)(ab+1/4(t-ab/t)^2)}}\\ &=& 2 \int_{0}^{+\infty} \frac{dt}{\sqrt{(a^2+t^2)(b^2+t^2)}} = I(a,b) \end{matrix} On note au passage que II est définie si a,bCa,b \in \C vérifient (a)>0,(b)>0\Re(a)&gt;0, \Re(b)&gt;0, on peut montrer que la relation ci-dessus s’étend (par holomorphie).

Lorsque a=b=la=b=l (par exemple lorsqu’on est à la limite), le calcul de I(l,l)I(l,l) est explicite I(l,l)= +dt(l 2+t 2)=πl I(l,l)=\int_{-\infty}^{+\infty} \frac{dt}{(l^2+t^2)} = \frac{\pi}{l} donc I(a,b)=I(M(a,b),M(a,b))=πM(a,b) I(a,b)=I(M(a,b),M(a,b))=\frac{\pi}{M(a,b)} On peut transformer I(a,b)I(a,b) en posant t=but=bu I(a,b)=2 0 +du(a 2+b 2u 2)(1+u 2)=2a 0 +du(1+(b/a) 2u 2)(1+u 2) I(a,b)=2\int_{0}^{+\infty} \frac{du}{\sqrt{(a^2+b^2u^2)(1+u^2)}} = \frac{2}{a} \int_{0}^{+\infty} \frac{du}{\sqrt{(1+(b/a)^2u^2)(1+u^2)}} Puis en posant u=tan(x)u=\tan(x) (du=(1+u 2)dxdu=(1+u^2) dx) I(a,b)=2a 0 π21+tan(x) 21+(b/a) 2tan(x) 2dx I(a,b)=\frac{2}{a} \int_0^{\frac{\pi}{2}} \sqrt{\frac{1+\tan(x)^2}{1+(b/a)^2\tan(x)^2}} \ dx et enfin en posant tan 2(x)=sin(x) 21sin(x) 2\tan^2(x)=\frac{\sin(x)^2}{1-\sin(x)^2} I(a,b)=2a 0 π211(1b 2a 2)sin(x) 2dx I(a,b)= \frac{2}{a} \int_0^{\frac{\pi}{2}} \sqrt{ \frac{1}{1-(1-\frac{b^2}{a^2})\sin(x)^2} } \ dx Si on définit pour m<1m&lt;1 K(m)= 0 π2dx1msin(x) 2 K(m)=\int_0^{\frac{\pi}{2}} \frac{dx}{\sqrt{1-m \sin(x)^2}} alors on peut calculer KK en fonction de II, en posant m=1b 2/a 2m=1-b^2/a^2 soit b 2/a 2=1mb^2/a^2=1-m K(m)=a2I(a,a1m)=a2πM(a,a1m)=π2M(1,1m) K(m)=\frac{a}{2} I(a,a\sqrt{1-m})=\frac{a}{2}\frac{\pi}{M(a,a\sqrt{1-m})} =\frac{\pi}{2M(1,\sqrt{1-m})} d’où l’on déduit la valeur de l’intégrale elliptique en fonction de la moyenne arithmético-géométrique : K(m)= 0 π2dx1msin(x) 2=π2M(1,1m)(19) K(m)=\int_0^{\frac{\pi}{2}} \frac{dx}{\sqrt{1-m \sin(x)^2}}= \frac{\pi}{2M(1,\sqrt{1-m})} \qquad (19) Dans l’autre sens, pour xx et yy positifs K((xyx+y) 2)=π2M(1,1(xyx+y) 2)=π2M(1,2x+yxy)=π22x+yM(x+y2,xy)=π4x+yM(x,y) K( (\frac{x-y}{x+y})^2 )= \frac{\pi}{2M(1,\sqrt{1-(\frac{x-y}{x+y})^2})} = \frac{\pi}{2M(1,\frac{2}{x+y}\sqrt{xy})} = \frac{\pi}{2 \frac{2}{x+y} M(\frac{x+y}{2},\sqrt{xy}) } = \frac{\pi}{4} \frac{x+y}{M(x,y)} et finalement M(x,y)=π4x+yK((xyx+y) 2) M(x,y)=\frac{\pi}{4} \frac{x+y}{ K\left( (\frac{x-y}{x+y}\right)^2 )}

B.3  Application : calcul efficace du logarithme.

On peut utiliser la moyenne arithmético-géométrique pour calculer le logarithme efficacement, pour cela on cherche le développement asymptotique de K(m)K(m) lorsque mm tend vers 1. Plus précisément, on va poser 1m=k 21-m=k^2 avec k]0,1]k \in ]0,1], donc K(m)= 0 π2dx1(1k 2)sin(x) 2= 0 π2dy1(1k 2)cos(y) 2 K(m)= \int_0^{\frac{\pi}{2}} \frac{dx}{\sqrt{1-(1-k^2) \sin(x)^2}} =\int_0^{\frac{\pi}{2}} \frac{dy}{\sqrt{1-(1-k^2) \cos(y)^2}} en posant y=π/2xy=\pi/2-x, et K(m)= 0 π2dysin(y) 2+k 2cos(y) 2 K(m)=\int_0^{\frac{\pi}{2}} \frac{dy}{\sqrt{\sin(y)^2+k^2 \cos(y)^2}} la singularité de l’intégrale pour kk proche de 0 apparait lorsque yy est proche de 0. Si on effectue un développement de Taylor en y=0y=0, on trouve sin(y) 2+k 2cos(y) 2=k 2+(1k 2)y 2+O(y 4) \sin(y)^2+k^2 \cos(y)^2 = k^2 + (1-k^2) y^2 + O(y^4) Il est donc naturel de comparer K(m)K(m) à l’intégrale J= 0 π2dyk 2+(1k 2)y 2 J=\int_0^{\frac{\pi}{2}} \frac{dy}{\sqrt{k^2 + (1-k^2) y^2}} qui se calcule en faisant par exemple le changement de variables y=k1k 2sinh(t) y=\frac{k}{\sqrt{1-k^2}} \sinh(t) ou directement avec Xcas,

supposons(k>0 && k<1);
J:=int(1/sqrt(k^2+(1-k^2)*y^2),y,0,pi/2)

qui donne après réécriture : J=11k 2(ln(πk)+ln(12(1k 2+4k 2π 2+1k 2)))(20) J= \frac{1}{\sqrt{1-k^{2}}} \left( \ln\left(\frac{\pi}{k}\right) + \ln\left( \frac{1}{2} \left(\sqrt{ 1-k^{2} +4 \frac{k^{2}}{\pi^2}} +\sqrt{1-k^{2}} \right) \right) \right) \qquad (20) et on peut calculer le développement asymptotique de JJ en 0

series(J,k=0,5,1)

qui renvoie : J=ln(πk)+O((1ln(k)) 5) J =\ln\left(\frac{\pi}{k}\right) +O( \left(\frac{-1}{\ln(k)}\right)^5) on peut alors préciser ce développement par

series(J+ln(k)-ln(pi),k=0,5,1)

qui renvoie (après simplifications et où la notation O˜\tilde{O} peut contenir des logarithmes) (1π 2+ln(π)ln(k)12)k 2+O˜(k 4) \left(\frac{1}{\pi^2} + \frac{\ln(\pi)-\ln(k)-1}{2}\right) k^{2} + \tilde{O}(k^4) donc J=ln(k)+ln(π)+(1π 2+ln(π)ln(k)12)k 2+O˜(k 4)(21) J=-\ln(k)+\ln(\pi)+\left(\frac{1}{\pi^2} + \frac{\ln(\pi)-\ln(k)-1}{2}\right) k^{2} + \tilde{O}(k^4) \qquad (21) Examinons maintenant KJK-J, il n’a plus de singularité en y=0y=0, et il admet une limite lorsque k0k \rightarrow 0, obtenue en remplacant kk par 0 (KJ) |k=0= 0 π2(1sin(y)1y)dy=[ln(tan(y2))ln(y)] 0 π2=ln(4π) (K-J)_{|k=0} = \int_0^{\frac{\pi}{2}} \left(\frac{1}{\sin(y)}-\frac{1}{y}\right) \ dy = \left[\ln\left(\tan\left(\frac{y}{2}\right)\right) - \ln(y) \right]_0^{\frac{\pi}{2}} = \ln(\frac{4}{\pi}) D’où pour KK K k0=ln(4k)+O((1ln(k)) 5) K_{k \rightarrow 0} = \ln\left(\frac{4}{k}\right) + O( \left(\frac{-1}{\ln(k)}\right)^5) Pour préciser la partie du développement de KK en puissances de kk, nous allons majorer KJln(4/π)K-J-\ln(4/\pi), puis Jln(π/k)J-\ln(\pi/k). Posons A=sin(y) 2+k 2cos(y) 2,B=y 2+(1y 2)k 2 A=\sin(y)^2+k^2 \cos(y)^2, \quad B=y^2+(1-y^2)k^2 Majoration de KJln(4/π)K-J-\ln(4/\pi)
L’intégrand de la différence KJln(4π)K-J-\ln(\frac{4}{\pi}) est 1A1B(1sin(y)1y) = BAABysin(y)ysin(y) = BAAB(A+B)ysin(y)ysin(y) = (y 2sin(y) 2)(1k 2)AB(A+B)ysin(y)ysin(y)(22) \begin{matrix} \frac{1}{\sqrt{A}} - \frac{1}{\sqrt{B}} - \left( \frac{1}{\sin(y)}-\frac{1}{y} \right) &= & \frac{\sqrt{B}-\sqrt{A}}{\sqrt{A} \sqrt{B}} - \frac{y-\sin(y)}{y\sin(y)} \\ &= & \frac{B-A}{\sqrt{A} \sqrt{B} (\sqrt{A}+\sqrt{B})} - \frac{y-\sin(y)}{y\sin(y)} \\ &=& \frac{(y^2-\sin(y)^2)(1-k^2)}{\sqrt{A} \sqrt{B} (\sqrt{A}+\sqrt{B})} - \frac{y-\sin(y)}{y\sin(y)} \end{matrix} \qquad (22) Soit KJln(4π)= 0 π2(ysin(y))[(1k 2)ysin(y)(y+sin(y))AB(A+B)]AB(A+B)ysin(y)(23) K-J-\ln(\frac{4}{\pi})= \int_0^{\frac{\pi}{2}} \frac{(y-\sin(y))[(1-k^2)y \sin(y)(y+\sin(y))-\sqrt{AB}(\sqrt{A}+\sqrt{B})]} {\sqrt{A} \sqrt{B} (\sqrt{A}+\sqrt{B})y\sin(y)} \qquad (23) On décompose l’intégrale en 2 parties [0,k][0,k] et [k,π/2][k,\pi/2]. Sur [0,k][0,k] on utilise (??), on majore chaque terme séparément et on minore AA et BB par A=k 2+(1k 2)sin(y) 2k 2,B=k 2+(1k 2)y 2k 2 A=k^2+(1-k^2)\sin(y)^2 \geq k^2, \quad B=k^2+(1-k^2)y^2 \geq k^2 Donc | 0 k| 0 k|BA|2k 3dy+ 0 k(1sin(y)1y)dy 0 ky 2sin(y) 22k 3dy+ln(tan(k2))ln(k2) 13k 3+12k+14sin(2k)2k 3+ln(sin(k2))ln(k2)ln(cos(k2)) 13k 3+12k+14(2k8k 36+32k 55!2k 3ln(cos(k2)) k 230ln(112!(k2) 2) k 230+k 24 \begin{matrix} | \int_0^{k} | &\leq &\int_0^k \frac{|B-A|}{2k^3} \ dy + \int_0^k ( \frac{1}{\sin(y)}-\frac{1}{y} ) \ dy \\ &\leq& \int_0^k \frac{y^2-\sin(y)^2}{2k^3} \ dy + \ln (\tan(\frac{k}{2})) -\ln(\frac{k}{2}) \\ &\leq & \frac{\frac{1}{3} k^{3}+\frac{-1}{2} k+\frac{1}{4} \sin(2 k)}{2 k^{3}} + \ln (\sin(\frac{k}{2})) -\ln(\frac{k}{2}) - \ln (\cos(\frac{k}{2})) \\ &\leq & \frac{\frac{1}{3} k^{3}+\frac{-1}{2} k+\frac{1}{4} (2k-\frac{8k^3}{6}+\frac{32k^5}{5!}}{2 k^{3}} - \ln (\cos(\frac{k}{2})) \\ &\leq & \frac{k^2}{30}- \ln (1- \frac{1}{2!}\left(\frac{k}{2}\right)^2) \\ &\leq & \frac{k^2}{30} +\frac{k^2}{4} \end{matrix} Sur [k,π/2][k,\pi/2], on utilise (??) et on minore AA et BB par A=sin(y) 2+k 2cos(y) 2sin(y) 2,B=y 2+(1y 2)k 2y 2 A=\sin(y)^2+k^2 \cos(y)^2 \geq \sin(y)^2, \quad B=y^2+(1-y^2)k^2 \geq y^2 on obtient | k π2| k π2(ysin(y))|C|ysin(y)(y+sin(y)), | \int_k^{\frac{\pi}{2}} | \leq \int_k^{\frac{\pi}{2}} \frac{(y-\sin(y))|C|} {y \sin(y) (y+\sin(y))} , où : C = (1k 2)ysin(y)(y+sin(y))AB+BA = A(By)B(Asin(y))AyBsin(y)+(1k 2)ysin(y)(y+sin(y)) = A(By)B(Asin(y))k 2(y+sin(y)) \begin{matrix} C&=&(1-k^2)y \sin(y)(y+\sin(y))-A\sqrt{B}+B\sqrt{A} \\ &=& -A(\sqrt{B}-y)-B(\sqrt{A}-\sin(y)) -Ay-B\sin(y) + (1-k^2)y \sin(y)(y+\sin(y)) \\ &=& -A(\sqrt{B}-y)-B(\sqrt{A}-\sin(y)) - k^2(y+\sin(y)) \end{matrix} Donc |C| A(By)+B(Asin(y))+k 2(y+sin(y)) ABy 2B+y+BAsin(y) 2A+sin(y)+k 2(y+sin(y)) Ak 22y+Bk 22sin(y)+k 2(y+sin(y)) \begin{matrix} |C| &\leq& A(\sqrt{B}-y)+B(\sqrt{A}-\sin(y)) + k^2(y+\sin(y)) \\ &\leq& A \frac{B-y^2}{\sqrt{B}+y} + B \frac{A-\sin(y)^2}{\sqrt{A}+\sin(y)} + k^2(y+\sin(y)) \\ &\leq & A \frac{k^2}{2y} + B \frac{k^2}{2\sin(y)} + k^2(y+\sin(y)) \end{matrix} et | k π2| k π2(ysin(y))k 2(A2y+B2sin(y)+(y+sin(y)))ysin(y)(y+sin(y)) | \int_k^{\frac{\pi}{2}} | \leq \int_k^{\frac{\pi}{2} } \frac{(y-\sin(y))k^2(\frac{A}{2y} + \frac{B}{2\sin(y)} + (y+\sin(y))) } {y \sin(y) (y+\sin(y))} On peut majorer ysin(y)y 3/6y-\sin(y) \leq y^3/6, donc | k π2|k 26 k π2Ay2sin(y)(sin(y)+y)+By 2sin(y) 2(sin(y)+y)+y 2sin(y) | \int_k^{\frac{\pi}{2}} | \leq \frac{k^2}{6} \int_k^{\frac{\pi}{2}} \frac{Ay}{2\sin(y) (\sin(y)+y)} + \frac{By^2}{\sin(y)^2(\sin(y)+y)} + \frac{y^2}{\sin(y)} On majore enfin AA et BB par 1, | k π2|k 26 k π2y2sin(y) 2+y 2sin(y) | \int_k^{\frac{\pi}{2}} | \leq \frac{k^2}{6} \int_k^{\frac{\pi}{2}} \frac{y}{2\sin(y)^2} + \frac{y^2}{\sin(y)} Le premier morceau se calcule par intégration par parties k 26 k π2y2sin(y) 2 = k 26([ytan(y)] k π/2+ k π21tan(y)) = k 26(ktan(k)+[ln(sin(y))] k π2) = k 26(ktan(k)ln(sin(k))) k 26(1ln(k)) \begin{matrix} \frac{k^2}{6} \int_k^{\frac{\pi}{2}} \frac{y}{2\sin(y)^2} &=& \frac{k^2}{6} \left( [-\frac{y}{\tan(y)}]_k^{\pi/2} + \int_k^{\frac{\pi}{2}} \frac{1}{\tan(y)} \right) \\ &=& \frac{k^2}{6} \left(\frac{k}{\tan(k)}+ [\ln(\sin(y))]_k^{\frac{\pi}{2}} \right)\\ &=& \frac{k^2}{6} \left(\frac{k}{\tan(k)}-\ln(\sin(k)) \right)\\ &\leq & \frac{k^2}{6}(1-\ln(k)) \end{matrix} Le deuxième morceau se majore en minorant sin(y)(2y)/π\sin(y)\geq (2y)/\pi k 26 k π2y 2sin(y)k 26 0 π2π2y=k 2π 396 \frac{k^2}{6} \int_k^{\frac{\pi}{2}} \frac{y^2}{\sin(y)} \leq \frac{k^2}{6} \int_0^{\frac{\pi}{2}} \frac{\pi}{2} y = \frac{k^2\pi^3}{96} Finalement |KJln(4π)|k 2(16ln(k)+π 396+16+130+14) |K-J-\ln(\frac{4}{\pi})| \leq k^2 \left( -\frac{1}{6} \ln(k) + \frac{\pi^3}{96} + \frac{1}{6} + \frac{1}{30}+ \frac{1}{4} \right) JJ est donné en (??).

Majoration de Jln(π/k)J-ln(\pi/k)
On a |Jln(πk)|=|(11k 21)ln(πk)+11k 2ln(12(1k 2+4k 2π 2+1k 2))| |J - \ln\left(\frac{\pi}{k}\right)| = \left| (\frac{1}{\sqrt{1-k^2}}-1) \ln\left(\frac{\pi}{k}\right) + \frac{1}{\sqrt{1-k^2}} \ln\left( \frac{1}{2} \left(\sqrt{ 1-k^{2} +4 \frac{k^{2}}{\pi^2}} +\sqrt{1-k^{2}} \right) \right) \right| et on va majorer la valeur absolue de chaque terme de la somme. Pour k1/2k\leq 1/2, on a 11k 21=k 21k 2+1k 2k 23/4+3/2 \frac{1}{\sqrt{1-k^2}}-1=\frac{k^2}{\sqrt{1-k^2}+1-k^2} \leq \frac{k^2}{3/4+\sqrt{3}/2} Pour le second terme, on majore le facteur 11k 2\frac{1}{\sqrt{1-k^2}} par 23\frac{2}{\sqrt{3}}, l’argument du logarithme est inférieur à 1 et supérieur à 12(1k 22+1k 2(14π 2)2)=1k 2(11π 2)>1k 2 \frac{1}{2}(1 - \frac{k^2}{2} +1- \frac{k^2(1-\frac{4}{\pi^2})}{2}) = 1 - k^2 ( 1-\frac{1}{\pi^2}) &gt; 1-k^2 donc le logarithme en valeur absolue est inférieur à 2k 2 2 k^2 donc, pour k1/2k\leq 1/2, |Jln(πk)|k 23/4+3/2ln(πk)+k 243 |J-\ln\left(\frac{\pi}{k}\right)| \leq \frac{k^2}{3/4+\sqrt{3}/2} \ln\left(\frac{\pi}{k}\right) + k^2 \frac{4}{\sqrt{3}} Finalement, pour k<1/2k&lt;1/2 |Kln(4k)|k 2(lnπ3/4+3/2+43+π 396+920(13/4+3/2+16)ln(k))(24) |K-\ln\left(\frac{4}{k}\right) | \leq k^2 \left( \frac{\ln \pi}{3/4+\sqrt{3}/2} + \frac{4}{\sqrt{3} } + \frac{\pi^3}{96} + \frac{9}{20} - (\frac{1}{3/4+\sqrt{3}/2}+\frac{1}{6}) \ln(k) \right) \qquad (24) que l’on peut réécrire |π2M(1,k)ln(4k)|k 2(3.80.8ln(k))(25) |\frac{\pi}{2M(1,k)}-\ln\left(\frac{4}{k}\right) | \leq k^2(3.8-0.8\ln(k)) \qquad (25) La formule (??) permet de calculer le logarithme d’un réel positif avec (presque) nn bits lorsque k2 n/2k \leq 2^{-n/2} (ce à quoi on peut toujours se ramener en calculant le logarithme d’une puissance 2 m2^m-ième de xx ou le logarithme de 2 mx2^{m}x, en calculant au préalable ln(2)\ln(2)). Par exemple, prenons k=2 27k=2^{-27}, on trouve (en 8 itérations) M(1,2 27)=M 1=0.0781441403763M(1,2^-{27})=M_1=0.0781441403763. On a, avec une erreur inférieure à 19×2 54=1.1×10 1519 \times 2^{-54}=1.1\times 10^{-15} M(1,2 27)=M 1=π2ln(2 29)=π58ln(2), M(1,2^-{27})=M_1=\frac{\pi}{2\ln(2^{29})}=\frac{\pi}{58\ln(2)}, On peut donc déduire une valeur approchée de π\pi si on connait la valeur approchée de ln(2)\ln(2) et réciproquement. Si on veut calculer les deux simultanément, comme les relations entre ln\ln et π\pi seront des équations homogènes, on est obligé d’introduire une autre relation. Par exemple pour calculer une valeur approchée de π\pi on calcule la différence ln(2 29+1)ln(2 29)\ln(2^{29}+1)-\ln(2^{29}) dont on connait le développement au premier ordre, et on applique la formule de la moyenne arithmético-géométrique. Il faut faire attention à la perte de précision lorsqu’on fait la différence des deux logarithmes qui sont très proches, ainsi on va perdre une trentaine de bits, il faut grosso modo calculer les moyennes arithmético-géométrique avec 2 fois plus de chiffres significatifs.

L’intérêt de cet algorithme apparait lorsqu’on veut calculer le logarithme avec beaucoup de précision, en raison de la convergence quadratique de la moyenne arithmético-géométrique (qui est nettement meilleure que la convergence linéaire pour les développements en série, ou logarithmiquement meilleure pour l’exponentielle), par contre elle n’est pas performante si on ne veut qu’une dizaine de chiffres significatifs. On peut alors calculer les autres fonctions transcendantes usuelles, telle l’exponentielle, à partir du logarithme, ou les fonctions trigonométriques inverses (en utilisant des complexes) et directes.

On trouvera dans Brent-Zimmermann quelques considérations permettant d’améliorer les constantes dans les temps de calcul par rapport à cette méthode (cela nécessite d’introduire des fonctions spéciales θ\theta) et d’autres formules pour calculer π\pi.

  

Retour à la page principale de Giac/Xcas.