1 Ce chapitre s'inspire de~\cite{jedrzejewski2005introduction} et
2 de~\cite{bastien2003introduction}.
3 On y pointe quelques erreurs classiques en calcul numérique.
5 On peut classer les erreurs en plusieurs groupes:
7 \item les erreurs de calcul en machine: elles sont dues aux arrondis de
8 calcul pour les nombres flottants, par exemple.
9 \item les erreurs de méthode: elles sont dues à l'algorithme utilisé.
10 Par exemple, approximation d'une somme infinie par une somme finie,
11 d'une limite d'une suite par un terme de grand indice,
12 d'une intégrale par une somme finie.
13 \item les erreurs sur les données (imprécision des mesures physiques,
14 résultats d'un calcul approché). Ces données ne peuvent pas être modifiées,
15 mais on peut étudier l'influence de ces erreurs sur le résultat final.
22 % \section{Représentation}
23 % \begin{Def}[Nombres en base $\Beta$}
24 % Soit $\Beta$ un nombre entierstrictement supérieur à 1.
25 % pour tout entier $n$ supérieur ou égal à 1,
26 % il existe un unique entier $p$ et
27 % des entiers $d_i$ ($0 \le i \le p$) tous compris entre 0
28 % et $\Beta -1$ avec $d_p \neq 0$ tels que
29 % $$ n = \Sum_{i=0}^p d_i \Beta^1.$$
30 % Lemembre de droite est la représentation de $n$ en base
33 \section{Erreurs de calcul en machine sur les entiers}
36 On donne à la figure~\ref{script:facto:java} les codes java et python
37 permettant d'évaluer la fonction factorielle.
39 \lstset{language=Java}
42 \begin{minipage}{0.68\textwidth}
44 class TestFactorielle{
45 public static int factorielle(int n){
47 for (int i=2; i<=n ; i++){
51 public static void main(String args[]){
52 for (int j=1; j< 36; j++){
53 System.out.println(j+' '+
58 \begin{minipage}{0.30\textwidth}
59 \lstset{language=Python}
70 print j, factorielle(j)
74 \caption{Factorielle en Java, en Python}\label{script:facto:java}
94 \item le résultat donné pour 13! est différent de 13 fois le résultat de 12!
95 \item le résultat donné pour 16! est plus petit que celui donné pour 15!
96 \item le résultat donné pour 17! est négatif
97 \item tous les résultats donnés à partir de 34! sont nuls!
100 Par contre en Python 2.7 on a des résultats cohérents:
103 13! & =& 6227020800\\
105 17! &=& 355687428096000\\
107 34!&=& 295232799039604140847618609643520000000 \\
108 35! & =&10333147966386144929666651337523200000000
111 Les deux langages travaillent pourtant avec des entiers et ne sont donc pas
112 exposés aux erreurs d'arrondis.
114 Expliquons l'erreur d'interprétation du langage java.
115 Celui-ci code chaque entier avec 32 bits.
116 Le bit le plus à gauche est celui de signe. Il reste donc 31 bits.
117 Cela permet de couvrir tous les entiers de l'intervalle
118 $\llbracket -2147483648, 2147483647, \rrbracket$. Le tableau donné à la
119 figure~\ref{table:codage:entiers} donne la correspondance entre
120 certains entiers et le version binaire.
127 \begin{array}{|r|r|r|r|r|}
129 -2147483648&-2147483647&\ldots&-2&-1 \\
132 100\ldots000&100\ldots001&\ldots&111\ldots110&111\ldots111\\
135 0&1&2&\ldots&2147483647\\
137 000\ldots000&000\ldots001&000\ldots010&\ldots&011\ldots111\\
142 \caption{Correspondance décimaux-binaires}\label{table:codage:entiers}
146 Multiplier par un facteur revient à effectuer des opérations sur les bits.
147 Tant que le résultat est inférieur à la valeur maximale des entiers,
149 Par contre dès que le résultat est supérieur, l'interpréteur
150 fait n'importe quoi. C'est le cas à partir de 13!.
151 De plus lorsqu'on a dépassé les capacités, on peut ateindre 0 sans que cela ait
152 du sens (comme à partir de 34!)
154 Si le langage python réussit (au moins à partir de 2.7),
155 c'est parce qu'il stocke les entiers
156 sous 64 bits et les convertit en long si besoin, dont le nombre de bits
158 Python 3, dont le type int équivaut au long de la version 2.7 n'a pas un
159 nombre borné de bits pour les entiers. Il ne faillit pas dans ce calcul.
162 \section{Erreurs de calcul en machine sur les flottants}
164 Un ordinateur représente chaque nombre réel sur
165 un nombre fini de bits.
166 Ceci ne permet la représentation exacte que d'un petit sous-ensemble des réels.
167 La plupart des calculs sur les réels conduisent ainsi à des résultats approchés
168 qui résultent de la discrétisation de la représentation.
171 Le tableau~\ref{table:xpl:flottants} donne
172 des exemples de nombres réels et leur représentation
173 par des flottants en java et en python.
178 \begin{tabular}{|l|l|l|l|}
180 Nombre & Représentation & Valeur approchée & Erreur \\
182 $\frac{1}{7}$ & $0,\overline{142 857}\ldots$ & 0.14285714285714285 & $7.10^{-18}+\frac{10^{-19}}{7}$ \\
184 $\ln 2$ & 0.693147180559945309417232121458\ldots & 0.6931471805599453 & $\approx 10^{-17}$ \\
186 $\sqrt{2}$ & 1.414213562373095048801688724209\ldots & 1.4142135623730951 & $ > 10^{-17}$ \\
188 $\pi$ & 3.141592653589793238462643383279\ldots& 3.141592653589793& $ > 10^{-17}$ \\
192 }\caption{Interprétation erronée de nombres réels particuliers}\label{table:xpl:flottants}
195 On constate que les deux langages utilisent 64 bits dont 1 pour le signe,
196 53 pour le contenu et 11 pour l'exposant de la puissance de 10. Ils peuvent
197 donc mémoriser au plus 17 chiffres significatifs.
201 \section{Adaptation de la méthode pour contourner
205 Soit l'équation $x^2 +bx +c = 0$ avec $b$ et $c$ strictement positifs.
206 On suppose que le discriminant $\Delta$ est strictement positif et proche
207 numériquement de $b^2$.
209 \item Exprimer les deux racines $x_1$ et $x_2$ ($x_1 < x_2$).
210 \item Que dire du signe du numérateur de $x_2$ en théorie?
211 \item En pratique quelle va être sa valeur si l'interpréteur fait des
213 \item Cette erreur d'arrondi est-elle effectuée dans le calcul de $x_1$?
214 \item Montrer qu'on pourrait calculer la racine $x_2$ avec $x_2= \frac{c}{x_2}$.
215 \item Cette nouvelle méthode permet-elle de trouver le signe de $x_2$, et
216 est-elle plus précise?
221 Soit l'équation $x^2+1.5.10^{9}x +1 = 0$. Donner une réponse pratique
222 aux questions précédentes en effectuant les calculs en java.
227 \section{Erreurs sur les données}
229 Les données provenant de mesures physiques sont souvent entachées d'erreurs.
230 Par exemple, un traceur GPS ne peut avoir une précision inférieure à 8m
233 \begin{Def}[conditionnement]
234 Soit $A$ une matrice inversible. Le \emph{conditionnement} de $A$, noté
235 $\textit{cond}(A)$ est défini par
237 \textit{cond}(A) = ||A||~||A^{-1}||.
239 Une matrice $A$ est dite bien conditionnée si son conditionnement
240 $\textit{cond}(A)$ est proche de 1.
246 On considère les matrices
258 1,08 & 4,04 & 1 & 0 \\
259 0 & 0,98 & 3,89 & 1 \\
260 -0,01 & -0,01 & 1 & 3,98 \\
270 \right) \textrm{ et }
282 \item Que dire de $A$ et $A'$, $B$ et $B'$.
283 \item Résoudre à l'aide de numpy le système $AX_1=B$.
284 \item Résoudre à l'aide de numpy le système $AX_2=B'$.
285 \item Résoudre à l'aide de numpy le système $A'X_3=B$.
286 \item Que dire des différents vecteurs $X_1$, $X_2$ et $X_3$?
287 \item Calculer le conditionnement de $A$.
288 \item Reprendre les questions précédentes avec
300 10 & 7 & 8,1 & 7,2 \\
301 7,08 & 5,04 & 6 & 5 \\
302 8 & 5,98 & 9,98 & 9 \\
303 6,99 & 4,99 & 9 & 9,98 \\
313 \right) \textrm{ et }
323 \item Que peut-on en conclure?