Tout
petit Cours de Mathématiques Appliquées
à l'usage des Physiciens utilisateurs de
l'Informatique
Gérard
A. Langlet
COURS Numéro 1. De l'Erreur
(Errare humanum
est, perseverare diabolicum)
Calculons les puissances de 2 à
partir de 50 sur l'ordinateur le plus courant, un compatible PC, qui permet
l'affichage des nombres avec 17 chiffres décimaux au maximum[1] :
2*50 51 52 53
1125899906842624
2251799813685248.2 4503599627370496.4 9007199254740993
Si l'on ne possédait pas une culture
mathématique de base, on pourrait penser qu'à partir de 51, les puissances de 2
jouissent d'un comportement chaotique,
imprévisible, car elles sont tantôt paires, tantôt impaires, parfois même non
entières.
Si des puissances de 2 représentent
la valeur d'un angle
a exprimée en radians, itérées par
doublement de l'angle, par exemple à partir d'un angle de 1 radian, de sorte
que l'angle vaut 2 radians après la première itération, puis 4 radians après la
seconde, puis 8 radians après la troisième, puis 16 radians après la quatrième,
puis 32 radians après la cinquième, la valeur de l'angle est toujours
prévisible : il vaut 2 puissance n radians après l'itération n.
Mais prévisible ne signifie pas calculable,
ou, alors, il faut se doter des moyens adéquats, que l'on ne trouve pas, en
général : si on veut conserver seulement 5 chiffres justes en base 10,
c'est-à-dire entre 15 et 16 chiffres justes en base 2, il faudra disposer d'une
arithmétique capable de calculer avec au moins 1016 chiffres en binaire, pour
connaître SEULEMENT les 5 premiers chiffres justes de la valeur de 2 puissance
1000. Si l'on veut TOUS les chiffres justes, il faut une arithmétique
représentant les nombres en binaire... sur 2000
bits.
L'arithmétique à la norme IEEE,
disponible sur PC, SUN, Macintosh et autres ordinateurs lambda, ne le permet
pas.
Il faut se garder de croire qu'un
ordinateur calcule juste et dispense son utilisateur de publier des résultats
quelconques sans que ceux-ci soient accompagnés d'une estimation de l'erreur,
relative ou absolue, maximale; une telle précaution évitera que l'on puisse
tirer des conclusions fausses en interprétant des résultats calculés.
2*64
1.8446744073709553E19
Et , pourtant, 2 puissance 64 se
représente en binaire exactement par 1 suivi de 64 zéros.
L'ordinateur affiche un nombre en
base 10, qu'il convient de multiplier par 10 puissance 19, mais ce nombre à
multiplier ne possède que 17 chiffres significatifs connus (et encore, en
restant optimiste).
Si ce nombre représente un angle en
radians, et si l'on parvient à en prendre une ligne trigonométrique quelconque,
par exemple le sinus, il ne faudra
pas oublier les chiffres inconnus à droite, car ils représentent toujours des
radians. Dans le cas présent, l'angle est connu avec une erreur de plus de 100
radians, et son sinus CALCULE SUR ORDINATEUR sera N'IMPORTE QUOI.
On pourrait en déduire, sinon, que
le sinus d'un angle, possède un comportement chaotique... et ON l'a fait, et,
hélas, publié maintes fois (du moins avec le carré du sinus).
En effet, si l'on prend un angle
a QUELCONQUE, le carré de son sinus
sera connu avec une précision d'environ 16 chiffres en base 10, initialement.
Il existe plusieurs manières de
calculer le carré du sinus de l'angle 2a :
1) ON DOUBLE
LA VALEUR DE
a, ON PREND LE SINUS ET ON L'ELEVE AU
CARRE.
Oui, mais... si on itère ce doublement, même en partant d'une valeur
représentable comme 1 radian, on ne pourra pas obtenir une valeur suffisamment
exacte, à partir de l'itération numéro 53 (l'erreur relative atteindra alors
déjà 100%).
2) On
utilise les formules trigonométriques pour transformer l'application :
sinus carré de 2a se récrit en fonction de a comme le carré de 2 sina cosa
Posons alors X=sin2a; alors, le carré du cosinus est 1-X, de sorte que l'application revient
à itérer la formule Xn+1=
4 Xn (1-Xn)
c'est-à-dire l'équation logistique bien connue. (Au
passage, ce changement de variable prouve sans
appel que ladite équation ne peut, en aucun cas, exhiber un
comportement chaotique, puisque, inversement, son itération revient à itérer
une application linéaire, le simple doublement de la variable
a.
Mais, à chaque itération, l'ordinateur introduit une erreur statistique d'arrondi de 1/2 bit sur le dernier bit significatif de la représentation interne, ET propage l'erreur d'arrondi précédente, ceci toujours dans le même sens : l'erreur relative sur le carré d'une variable vaut deux fois l'erreur relative sur la variable - consulter les manuels de physique de la classe de seconde. L'erreur initiale double à chaque itération, puis, à la 52e itération, atteint le bit le plus significatif de la représentation interne du nombre (à la norme IEEE), donc le premier chiffre significatif de la représentation décimale (déjà malade à la 50e itération, car il faut 3 bits pour coder une puissance de 10).
3) On passe
par le calcul matriciel.
On appelle une seule fois la fonction sinus, pour l'unique condition initiale, par exemple l'angle a de 1 radian.
On est certain que le nombre 1 est
représentable en machine. On élève le
sinus au carré (par multiplication avec lui-même), ce qui fournit X initial pour vérifier, le plus
proprement possible, l'itération de l'équation logistique. Du sinus, on déduit
le cosinus initial, de sorte que l'on forme la matrice de rotation :
M: cosa
sina dont le déterminant vaut, par définition 1,
nombre -sina cosa toujours codable dans tout ordinateur.
Si l'on multiplie cette matrice de
rotation par elle-même, on obtient la matrice de rotation de l'angle 2a, par définition, dont le
déterminant vaut 1, par définition aussi.
La valeur absolue du produit des
termes de la deuxième diagonale donne alors le carré du sinus de l'angle
courant, que l'on comparera à la valeur de X
obtenue après la même itération, à chaque fois.
En ajoutant à cette valeur le
produit des termes de la diagonale principale, on obtiendra le déterminant,
dont on affichera la valeur à chaque itération.
L'avantage procuré par ce contrôle
garde-fou provient du fait que l'on va vérifier un nombre que l'on sait
mathématiquement égal à 1. Ainsi l'écart éventuel à 1 est l'erreur absolue sur le calcul, à chaque
itération, mais aussi l'erreur relative. La vérification devient visuelle, et fort
simple.
Travaux pratiques du cours numéro 1
a) Ecrire un
programme en n'importe quel langage de programmation (évidemment en double précision) affichant le numéro de
l'itération (0 pour la condition initiale), la valeur du carré du sinus de
l'angle courant, la valeur de X
itérée à l'aide de l'équation logistique, la valeur absolue du produit des
termes de la seconde diagonale de la matrice de rotation associée, ainsi que la
valeur courante du déterminant de cette dernière.
b) Faire
tourner le programme aussi en simple
précision et comparer les résultats.
c)
(facultatif) Essayer en quadruple
précision, ou bien avec Mathematica,
(ou Maple V) en précision
variable. Afficher, en couleur RVB,
les graphes de la variation des trois résultats en fonction du numéro de
l'itération, et en tenant compte de l'erreur relative fournie par le calcul du
déterminant : il suffit d'afficher la barre d'erreur comme une ligne verticale
colorée, pour chaque paramètre. Alors, par superposition des trois couleurs, la
zone (ex-chaotique) pour laquelle il est impossible de tirer des conclusions
lorsqu'on a travaillé avec un ordinateur, apparaîtra, visuellement, en blanc
cassé ou en blanc intense, selon que l'on aura géré les couleurs en intensité
normale ou en surintensité.
COURS Numéro 2. Essais
comparatifs.
Faire tourner le programme de la
leçon numéro 1 sur des ordinateurs de marques différentes : on suggère le PC (IBM ou clones) et Macintosh
(APPLE), car les micro-processeurs de ces deux machines sont de deux marques différentes mais respectent une même
norme de codage des constantes en virgule flottante, la norme IEEE,
effectivement avec 64 bits pour les constantes en double précision, dont 52
bits pour la partie signifiante, la mantisse (les autres codant l'exposant et
les champs du signe).
Comparer les résultats obtenus avec
un même programme (on aura intérêt à
choisir un langage de programmation normalisé), avec la même valeur initiale de
a (par exemple 1 radian) et avec la
même norme de codage de l'information (IEEE), de sorte que l'on puisse dire si
oui ou non, à partir des MEMES
conditions initiales, il est possible de parvenir à des résultats différents.
Réfléchir ensuite au fait que les
constructeurs de ces deux machines ont failli nous empêcher de pouvoir
effectuer ce test, car ils s'étaient mis d'accord pour mettre sur le marché des
machines équipées du MEME
micro-processeur, le Pentium (Bogué?).
Nous l'avons échappé belle. Un peu plus, et le chaos s'engouffrait dans la brèche.
[1] On utilise pour cela une symbolique normalisée, à la fois notation, langage de commande et de programmation vectorielle
(ISO8485, Genève, 1989, et AFNOR); à votre avis, laquelle ?