====== Propagation d'incertitude ======
{{ :bts:python:propagation_incertitudes.td.pdf |Version imprimable}}
Dans ce TD on veut mettre en évidence des phénomènes de propagation d'incertitude.
Commençons par importer toutes les bibliothèques et fonctions utiles :
from random import random, seed, gauss
import numpy as np
seed(45)
===== Une seule variable =====
On se place dans le cas où $y = f(x)$ et où $x$ est connu avec une incertitude. On veut évaluer l'incertitude sur $y$.
À titre d'exemple, on prend $y = 3\,x^2$. On sait que $x = 5 \pm 0,1$.
On supposera que $X$ est aléatoire et suit une lui uniforme sur $[5-0,1\,;\,5+0,1]$. $Y$ est donc aléatoire également et on souhaite visualiser la distribution de $Y$.
Quand on écrit $X$, on est dans le domaine des probabilités. On parle alors des valeurs que pourrait prendre $x$ avant même d'avoir fait la moindre expérience. Les probabilités sont là pour faire des prédiction sur ce qui pourrait arriver.
Si on écrit $x$, on parle alors de résultats qui se sont effectivement produits et que l'on constate. On peut alors faire des statistiques.
L'espérance $E(X)$ et l'écart-type $\sigma(X)$ servent à prédire les valeurs que l'on devrait obtenir si on calcule la moyenne $\overline{x}$ t l'écart-type $\sigma_x$ (en version statistique)
Dans ce TD, nous allons faire l'expérience avec Python de sorte que nous obtiendrons des résultats statistiques. Nous vérifierons ensuite si ces résultats correspondent aux prédictions que les probabilités nous auraient permis de faire.
==== Simulation de $x$ ====
N = 10000
def tirage(reference, incertitude):
'''
reference: valeur de référence. Exemple 5
incertitude: marge d'erreur. Exemple 0.1
'''
return reference + (2*random()-1)*incertutude
x_values = [tirage(5, 0.1) for i in range(N)]
Ce code permet de simuler ''N'' tirage de la grandeur $x$. Vous pouvez l'exécuter et calculer en console les paramètres statistiques de ''%%x_values%%'' :
>>> np.mean(x_values)
>>> np.std(x_values)
>>> 0.2/np.sqrt(12)
==== Calcul des $y$ ====
def f(x):
return 3*x**2
y_values = [f(x) for x in x_values]
On obtient ainsi les ''N'' valeurs de $y$ correspondant aux $x$ précédents. Là encore on peut relever les paramètres statistiques.
>>> np.mean(y_values)
>>> np.std(y_values)
>>> np.std(y_values) / np.std(x_values)
Le dernier calcul correspond à $\frac{\sigma_y}{\sigma_x}$. Comparez ce résultat à $\left|f'(\overline{X})\right|$.
==== Représentation graphique ====
On souhaite afficher la distribution de $Y$. Il faut donc faire un comptage.
Rien de plus simple :
import matplotlib.pyplot as plt
plt.figure()
plt.hist(y_values, bins=20, density = True, edgecolor='black')
plt.show()
Vous constatez que $Y$ a une densité à peu près uniforme, tout comme $X$. Cela ne serait plus vrai si l'incertitude de $x$ devenait plus importante (ce que vous pouvez vérifier !)
==== Cas Gaussien ====
Recommencez avec
x_values = [gauss(5,0.05) for i in range(N)]
On a toujours $x = 5 \pm 0,1$ mais cette fois il ne faut pas comprendre l'incertitude comme un intervalle $[4,9\,;\,5,1]$ dont $x$ ne pourrait pas sortir. Ce n'est plus maintenant qu'un intervalle de fluctuation à 95 %.
Faites la simulation, calculez $\overline{y}$ et $\sigma_y$. Constatez que $y$ a bien une répartition gaussienne.
On peut donc écrire $y = nominal \pm incertitude$. Puisque $y$ est gaussien, on peut dire $nominal = \overline{y}$ et $incertitude = 2 \sigma_y$.
===== Deux variables =====
Modifiez le programme pour le cas suivant : $y = f(x_1, x_2) = 3\,x_1^2 + 2 \,x_2$ avec $x_1 = 5 \pm 0,1$ et $x_2 = 7 \pm 0,2$.
En particulier, calculez $\frac{\partial f}{\partial x_1}$ et $\frac{\partial f}{\partial x_2}$ puis vérifiez que :
$$\sigma_y = \sqrt{\left(\frac{\partial f}{\partial x_1}\,\sigma_{x_1}\right)^2 + \left(\frac{\partial f}{\partial x_2}\,\sigma_{x_2}\right)^2}$$
Visualisez la distribution de $Y$.
Vous pouvez voir que la densité de $Y$ apparaît comme un rectangle un peu cassé sur les bords. On est encore loin d'une gaussienne ce que l'on peut expliquer : $\frac{\partial f}{\partial x_1}\sigma_{x_1}$ est beaucoup plus grand que $\frac{\partial f}{\partial x_2}\sigma_{x_2}$ et donc la dispersion de $Y$ est surtout le fait de $X_1$. C'est presque comme si on n'avait qu'une variable.
Modifions la fonction pour : $f(x_1, x_2) = 3\,x_1^2 + 15\,x_2$. Maintenant, les deux variables ont le même poids dans la dispersion de $Y$. Refaites l'expérience et visualisez $Y$.
===== Variables gaussiennes =====
On avait $\sigma_{x_1} \approx 0,06$ et $\sigma_{x_2} \approx 0,12$. Essayons maintenant de prendre $X_1$ et $X_2$ gaussiens :
Xs1 = [gauss(5,0.06) for i in range(N)]
Xs2 = [gauss(7,0.12) for i in range(N)]
Visualisez la distribution de $Y$.