Vous êtes sur la page 1sur 9

Plan du cours

Problèmes et précision 3
Problèmes numériques 3
Précision numérique 4
Vitesse de convergence 6
Méthodes numériques et langage C
Calcul numérique de fonctions et résolution d’équations Programmation de séries 7
Séries numériques 8
Récurrence 10
R. Flamary
Résolution d’équations 14
Dichotomie 15
Methode de Newton 18
17 octobre 2018 Point fixe 22

Calcul de fonctions usuelles 24


Racine carrée 25
Fonctions trigonométriques 29
Fonction exponentielle 32

2 / 33

Calcul numérique de fonctions et résolution d’équations Précision numérique


Algorithme itératif
Problèmes
I Principe :
I Calculer y tel que
I Initialisation approximative de la solution.
y = f (x)
I Dans une boucle : mise à jour de la solution (amélioration de la précision)
I Trouver x tel que I De nombreux calculs numériques du cours sont sous cette forme.
f (x) = 0
I La question de la précision numérique détermine le nombre d’itérations.
I En utilisant uniquement des opérations standards fournies par un processeur.
I Il existe plusieurs approches pour la condition d’arrêt des itérations.
I Les deux problèmes sont liés mais différent dans leur objectif.

Nombre n d’itérations max. Précision minimale 


Objectifs du cours
I On arrête après n itérations. I On arrête lorsque la variation de
I Programmation (efficace) des séries entières. la solution entre deux itérations
I Typiquement boucle for
I Méthodes classiques de résolution d’équation (Dichotomie, Newton). est inférieure ou égale à .
I Complexité du calcul facile à
I Exemples de calcul de fonctions usuelles. I Difficulté d’évaluer le nombre
estimer T () = nT (iteration).
I Représentation des fonctions en séries entières. d’itérations nécessaires.
I Précision finale du calcul plus
I Meilleur contrôle de la précision
difficile à évaluer (en général).
du résultat.
3 / 33 4 / 33
Exemple de précision numérique Vitesse de convergence
Soit la série suivante permettant de calculer la constante de Néper :
I Soit la suite (xk ) qui converge vers la valeur x∗ .

X n
X
1 1
e= et l’approximation en = I On dit que la suite est convergente d’ordre q vers x∗ si il existe µ ∈]0, 1[ tel que
k! k!
k=0 k=0
|xk+1 − x∗ |
lim =µ
k→∞ |xk − x∗ |q
Précision en fonction des itérations
100 I µ est la vitesse de convergence qui majore la déviation à la limite entre 2
10-2 itérations.
Calcul de la série 10-4 I Les ordres q les plus communs sont :
I Flottant 64 bits. 10-6
I q = 1, convergence linéaire.
10-8
I e − en erreur de la solution. 10-10 I q > 1, super-linéaire.
I 1 10-12 I q = 2, convergence quadratique.
n!
mise à jour de la solution.
I |en − en−1 | variation de la
10-14 I La convergence quadratique implique un doublement du nombre de chiffres précis
|e−en |
10-16 à chaque itération.
solution. 10-18
1
n!
I La vitesse de convergence des méthodes itératives permet de prédire un ordre de
10-20 |en −en−1|
10-22 0 5 10 15 20 25
grandeur des nombres d’itérations nécessaires pour obtenir une précision donnée.
n

5 / 33 6 / 33

Fonction analytique et série entière Programmation de série numérique

n
X
Toute fonction analytique peut être exprimée sous la forme d’une série entière : Sn = uk
k=0

X Principe général
f (x) = ak (x − x0 )k
k=0 I Boucle for.

où les ak sont des réels et la série converge vers f (x) dans un voisinage de x0 I Initialisation de l’accumulateur à 0 ou à u0 .
I Les fonctions analytiques sont continues et infiniment différentiables. I Ajout de ui pour chaque valeur de i.
(k) I Programmation d’une fonction u(i) ?
I La série entière est une série de Taylor avec ak = f (x0 )
n!
Implémentation type Discussion
Applications float sum_u_i(int n)
1
I On suppose que la fonction
2 {
I Calcul numérique de fonctions complexes (exponentielle,trigos,...). 3 float res=0; float u(int i) est définie.
I Approximations physiques. 4 for (int k=0;k<=n;k++) I Efficacité dépend de uk
5 res=res+u(k);
6 return res; I T (sum u i)=
7 } I S(sum u i)=

7 / 33 8 / 33
Calcul de tous les éléments de la série Fonction récursive (rappel)
n
X I Une fonction récursive est une fonction qui s’appelle elle même.
Sn = uk I Pour le calcul de séries, les fonctions récursives ont souvent une complexité
k=0
spatiale S(n) ou S(log(n)) (à cause de la pile).
Principe
I Il est nécessaire de s’assurer que la fonction se termine quelle que soit la valeur
I Pour des raisons de complexité numérique, il est parfois nécessaire de calculer donnée en entrée (théorème de terminaison).
tous les éléments de la série Sk jusqu’à Sn .
Code source Sortie
I Utilise toujours une boucle for. 1 int factorielle(int i) 1 $./ex_factoriel
I La fonction retourne un pointeur vers les valeurs de la série. 2 { 2 i=0, i!=1
3 if (i<=0) 3 i=1, i!=1
I Nécessite une allocation mémoire (malloc), libérer la mémoire avec free. 4 return 1; 4 i=2, i!=2
5 else 5 i=3, i!=6
Implémentation type Discussion 6 return i*factorielle(i-1); 6 i=4, i!=24
float* sum_u_i(int n)
1
I On suppose que la fonction 7 } 7 i=5, i!=120
2 { 8 8 i=6, i!=720
3 float *res=malloc((n+1)* float u(int i) est définie.
9 int main() 9 i=7, i!=5040
sizeof(float)); I Efficacité dépend de uk 10 { 10 i=8, i!=40320
4 res[0]=u(0); for (int i=0;i<=8;i++)
I T (sum u i)=
11
5 for (int k=1;k<=n;k++) 12 printf("i=%d, i!=%d\n",i,
6 res[k]=res[k-1]+u(k); I S(sum u i)= factorielle(i));
7 return res; 13 return 0;
8 } 14 }

9 / 33 10 / 33

Récurrence pour le calcul de séries (1) Récurrence pour le calcul de séries (2)
I Une récurrence dans la suite est une fonction simple permettant de calculer uk+1 Fonction à calculer :
n
X
à partir de uk : f unc(x, n) = xi
uk+1 = r(uk , k) i=1

I Trouver une récurrence dans une série numérique permet souvent de la calculer I La récurrence est évidente :
avec une complexité moindre. xi = xi−1 ∗ x
I Si T (u) > T (r) il faut utiliser la relation de récurrence. I On calculera donc dans la boucle le terme xi qui sera mis à jour à chaque
I Exemple d’un codage non efficace de la fonction suivante (Ex. 5 Cours 1) : itération.
n
X
f unc(x, n) = xi Code Complexité
i=1
1 float func(float x,int n) I Nb opérations :
2 {
3 float f=0,xi=x;
Code Complexité
4 for (int i=1;i<=n;i++) I Complexité T () :
1 float func(float x,int n) I Nb opérations : {
I Complexité S() :
5
2 {
6 f=f+xi;
3 float f=0;
7 xi=xi*x;
4 for (int i=1;i<=n;i++)
5 f=f+puissance(x,i); I Complexité T () : 8 }
9 return f;
6 return f; I Complexité S() : 10 }
7 }

11 / 33 12 / 33
Exercice 1 Résolution d’équations unidimensionnelles
Soit la série de Taylor de la fonction exponentielle :
Objectif

X xk Trouver un réel x∗ ∈ [a, b] satisfaisant la condition :
exp(x) =
k!
k=0
f (x) = 0
Coder une implémentation efficace utilisant la récurrence permettant de calculer la
série jusqu’à l’ordre n.
Quelle est sa complexité ? Quelle serait la complexité si on utilisait les fonctions I f (x) est une fonction continue sur l’intervalle [a, b].
puissance et factorielle toutes deux de complexité T () = O(n). I On suppose également que f (a)f (b) < 0.
Solution Complexité I Le passage de la fonction en 0 est assuré par le théorème des valeurs
I Nb opérations : intermédiaires.

Méthodes de résolution
I Complexité T () :
I Complexité S() : I Dichotomie.
I Méthode de la fausse position.
Si 2 fonctions O(n) dans la boucle :
I Méthode de Newton.
I Complexité T () :
I Méthode du point fixe.
I Complexité S() :

13 / 33 14 / 33

Dichotomie Exercice 2 : Dichotomie en C

Code Exercice
1 double dichotom(double a,double b,
Diviser pour mieux régner
double eps) I Compléter la fonction à gauche.
I Mise à jour de l’intervalle [a, b] assurant une 2 { I On suppose que la fonction
3 double c=(a+b)/2;
contraction. double f(double x) est définie.
4 double fa=f(a),fc=f(c);
I Calculer f (c) avec c = a+b
. 5 I Possibilité d’utiliser les fonctions de
2
I Si f (a)f (c) > 0 alors a ← c, sinon b ← c
6 <math.h>
7
I Convergence atteinte lorsque
I c est la solution de l’équation. 8
9 |b − a| < .
10
I Minimiser le nombre d’opérations
11
Propriétés sachant que l’appel à f (x) est
12
0 potentiellement coûteux.
I Précision numérique n = bn − an simple à calculer : n = (conv. linéaire).
13

2n 14 return c;
I Nombre d’itérations jusqu’à convergence : n = log2 0

. 15 }

I On prend souvent  = a+b


2
δ où δ est la précision machine (δ = 10−16 en 64 bits).
I Dans tous les cas n est majoré par le nombre de bits de la mantisse.

15 / 33 16 / 33
Méthode de la fausse position Méthode de Newton
Variante de la dichotomie Principe 6 Méthode de Newton
5 f(x)
I On trace une droite entre les points I Méthode itérative (pas d’intervalle).
4
Tangente en x1
(a, f (a)) et (b, f (b)). I Initialisation x0 .
I c est l’abscisse du point d’ordonnée nulle 3
I La dérivée de la fonction en f (xk ) donne 2
de cette droite : une approximation linéaire :
1
f (a) − f (b)
(c − b) + f (b) = 0 f˜(x) = f (xk ) + (x − xk )f 0 (xk ) 0
a−b x2 x1
1
Ce qui nous donne : I La nouvelle valeur est obtenue en 2
1.0 1.5 2.0 2.5 3.0 3.5
a−b annulant l’approximation : x
c=a− f (a)
f (a) − f (b)
f (xk )
xk+1 = xk −
I Si f (a)f (c) > 0 alors a ← c, sinon b ← c f 0 (xk )
Propriétés
Propriétés I Convergence quadratique à proximité d’une solution.
I Convergence superlinéaire (plus rapide que la dichotomie). I Itérations peu précises loin d’une solution.
I Une variation s’appelant la méthode de la sécante ne nécessite pas que I Peut diverger si f a une dérivée nulle.
f (a)f (b) < 0. I Méthode de la fausse position est une Newton approchée (gradient approché).
17 / 33 18 / 33

Convergence de la méthode de Newton Fractale de Newton


La convergence de la méthode de Newton vers une solution de l’équation est assurée si Soit l’équation complexe suivante :
la fonction f (x) vérifie les conditions suivantes :
f (z) = z p − 1 = 0
1. f est de classe C 2 sur [a, c] (continue et dérivable deux fois).
2. f (a)f (b) < 0. (⇒ ∃x, f (x) = 0 avec la continuité). La méthode de Newton converge vers les solutions du problème de la forme
z = ek2iπ/p . Si on détermine le point de convergence pour chaque pixel d’initialisation
3. ∀x ∈ [a, b] f 0 (x) 6= 0. on obtient une fractale de Newton :
00
4. f (x) est de signe constant sur [a, b] (une seule solution dans l’intervalle).
Pour p = 3 Pour p = 5
5. |f (a)|/|f 0 (a)| < b − a et |f (b)|/|f 0 (b)| < b − a (on reste dans l’intervalle [a, b]).

Exercice 3 :
Vérifier la convergence sur [1, A] pour f (x) = x2 − A = 0 avec A > 1

Source: [3, Chap 4]


19 / 33 20 / 33
Exercice 4 : Méthode de Newton Méthode du point fixe

Code Exercice Principe


double newton(double x0,double eps)
I Si on peut réécrire f (x) = 0 sous la forme
1
2 { I Compléter la fonction à gauche.
3 double x; I On suppose que la fonction g(x) = x
4
double f(double x) ainsi que sa
5
6
dérivée double df(double x) sont L’équation ci dessus est une équation du point fixe associée à f (x) = 0.
7 définies. I Algorithme
8 I Possibilité d’utiliser les fonctions de
9 1. On initialise x0 ∈ R
<math.h>
10 2. Pour chaque itération k :
11 I Convergence atteinte lorsque xk+1 ← g(xk )
12
|xk − xk−1 | < .
13 Propriétés Exercice 5
14
I Minimiser le nombre d’opérations
Soit l’équation de Ferrari
15 sachant que l’appel à f (x) et f 0 (x) I Cet algorithme converge vers la f (x) = x4 + 6x2 − 60x + 36. Donner 2
16 return x; est potentiellement coûteux. solution de l’équation f (x) = 0 sous
17 } fonctions g(x) point fixe de cette
certaines conditions. équation.
I Il peut exister plusieurs fonctions g
pour une équation donnée.

21 / 33 22 / 33

Convergence de la méthode du point fixe Calcul de fonctions usuelles


Problème
I Calculer les valeurs de fonctions mathématiques usuelles.
Théorème du point fixe de Banach
Soit E un espace métrique complet et g : E → E une application contractante I Utiliser uniquement des opérations disponibles sur le processeur (somme,
(k-lipschitzienne pour k < 1). multiplication).
I g possède un unique point fixe x∗ et ce point fixe est attractif. I Questions :
I Toute suite de E vérifiant la récurrence xk+1 = g(xk ) converge vers x ∗ I Implémentation en virgule flottante.
I Série de Taylor, méthode de Newton ?
Résultat majeur pour prouver la convergence de suites I Précision d’une implémentation physique ?

Application lipschitzienne
Soient E une partie de R,f : E → R une application et k un réel positif, on dit que f Fonctions étudiées Discussion
est k-lipschitzienne si I Racine carrée et racine carrée I Calculs approchés implémentés en
2
∀(x, y) ∈ E , |f (x) − f (y)| ≤ k |x − y|. inverse. matériel.
I Fonctions trigonométriques. I Extensions INTEL récentes
Si k ∈ [0, 1[ on dit que f est contractante. (SSE,MMX,AVX,SMVL).
I Exponentielle.
I Calcul sur des séquences en
mémoire (très efficaces).

23 / 33 24 / 33
Racine carrée Racine carrée (2)
Soit la fonction racine carrée

sqrt(x) = x Initialisation
I Vitesse de convergences des méthodes itérative dépendent de l’initialisation.
I Problème équivalent à résoudre
I Pour un flottant en base binaire de la forme m.22n on initialise par :
l’équation :
x0 = 2n
f (x) = x2 − S

I Si on applique la méthode de Newton


Autres variantes et généralisation
on trouve l’itération :
I Méthodes de calculs décimale par décimale (Bâtons de Neper, Algorithme de la
potence). Plus lente que la méthode de Héron mais ne nécessite pas d’inversion.
f (xn )
xk+1 = xn − = I Approximation de Bakhshali. Équivalente à 2 itération de la méthode de Newton.
f 0 (xn )
I Méthode de Newton pour la racine nième :
I Méthode exposée par Héron d’Alexandrie dans son ouvrage Metrica.  
1 A
xk+1 = (n − 1)xk + n−1
I Certains calculs égyptiens suggèrent que le méthode est encore plus ancienne. n xk
I Interprétation géométrique simple (moyenne des cotés d’un rectangle).
I Vitesse de convergence quadratique (Newton).
25 / 33 26 / 33

Racine carrée inverse Racine carrée inverse rapide


1
isqrt(x) = √ Principe Code
x float Q_rsqrt( float number )
Soit x un flottant IEEE 754. 1
2 {
Méthode de Newton I Calcul sur les flottants peut être plus 3 long i;
I Équation : coûteux que sur des entiers. 4 float x2, y;
const float threehalfs = 1.5F;
I Approximation de log2 (S) en traitant
5
6
f (x) = le flottant comme un entier : 7 x2 = number * 0.5F;
1 8 y = number;
I Itérations : IS ≈ Llog2 (S)+C, log2(S) ≈ (IS +C) 9 i = * ( long * ) &y; // evil
L floating point bit level
xk+1 = hacking
I log2(x) = −1/2log2 (S) on trouve
10 i = 0x5f3759df - ( i >> 1 ); //
donc : what the fuck?
Cas d’utilisation 11 y = * ( float * ) &i;
Ix ≈ 12 y = y * ( threehalfs - ( x2 * y * y
I Illumination dans les scènes 3D en infographie. ) ); // 1st iteration
I Calcul rapide de vecteur normal : Dans le code − 32 C = 0x5f3759df 13 // y = y * ( threehalfs - ( x2 * y *
y ) ); // 2nd iteration, this
v I La dernière étape est une itération de can be removed
v̂ = p Newton (et une seconde commentée). 14
kvk
15 return y;
I Tiré du code source de Quake 3. 16 }

27 / 33 28 / 33
Fonction sinus Exercice 6 : Fonction Sinus
X∞
(−1)n 2n+1
sin(x) = x
X∞
(−1)n 2n+1 n=0
(2n + 1)!
sin(x) = x
n=0
(2n + 1)!
Code Exercice
Implémentation dans la Glibc (Bibliothèque C standard) 1 double sinslow(double x)
2 { I Compléter la fonction à gauche.
I Méthodes de réduction de l’intervalle : sin(x + k2π) = sin(x). 3 double res=x,temp=x; I Utiliser la série de Taylor pour calculer
4
I Utilisation de la fonction fsin des processeurs intel en 32 et 64 bits. 5
la valeur du sinus.
I Sinon implémentation détaillée dans sysdeps/ieee754/dbl-64/s sin.c 6 I Convergence atteinte lorsque
7 |xk − xk−1 |
< 1e − 16.
8
|xk |
Algorithme simplifié dans fdlibm 9
10

I Méthodes de réduction de l’intervalle sur [− π4 , π4 ]. 11


Discussion
12 return res;
I Fonction sinus impaire donc calcul uniquement pour x > 0. 13 } I Problèmes ?
I Si |x| < 2−27 alors on retourne x.
I Sinon on utilise une approximation polynomiale de degré 13.

29 / 33 30 / 33

Exercice 7 : Fonction Sinus Fonction exponentielle


Code Exercice
1 double sinfast(double x)
2 { I Compléter la fonction à gauche. X∞
xn
exp(x) =
3 I Coder la méthode de réduction de n=0
n!
4
l’intervalle sur [−π, π].
5
6 I Appeler la fonction sinslow lorsque Implémentation dans fdlibm
7 vous avez réduit l’intervalle. I Réduction de l’intervalle, on cherche l’entier k tel que
8
9
ln(2)
10 x = k ∗ ln(2) + r, |r| <=
11 } 2
I Calcul précis de exp(r) avec approximation polyomiale.
I exp(x) = 2k exp(r)
I Approximation polynomiale de Renez très précise autour de 0 (bornée par 2−59 ).
I Cas particuliers :
I ∞ pour x > 7.09782712893383973096e + 02
I 0 pour x < −7.45133219101941108420e + 02

31 / 33 32 / 33
Ressources bibliographiques I

[1] “Freely distributable libm (fdlibm),” http://www.netlib.org/fdlibm/, version du


2015-09-28.
[2] “The gnu c library,” http://www.gnu.org/software/libc/, version du 2015-09-28.

[3] J. Bastien and J.-N. Martin, Introduction à l’analyse numérique : applications sous
Matlab : cours et exercices corrigés. Dunod, 2003.

[4] R. P. Brent and P. Zimmermann, Modern computer arithmetic. Cambridge


University Press, 2010, vol. 18.

[5] D. Goldberg, “What every computer scientist should know about floating-point
arithmetic,” ACM Computing Surveys (CSUR), vol. 23, no. 1, pp. 5–48, 1991.

[6] D. Henderson, “Elementary functions : Algorithms and implementation,”


Mathematics and Computer Education, vol. 34, no. 1, p. 94, 2000.

[7] W. H. Press, S. A. Teukolsky, W. T. Vetterling, and B. P. Flannery, Numerical


recipies in C. Cambridge university press Cambridge, UK, 1992.

33 / 33

Vous aimerez peut-être aussi