Incertitudes-types composées - Simulation

Programme de classe terminale, enseignement de spécialité, voie générale

Simuler, à l’aide d’un langage de programmation, un processus aléatoire illustrant la détermination de la valeur d’une grandeur avec incertitudes-types composées.

Principe

Estimer une incertitude-type à partir de plusieurs sources d'erreurs à l'aide d'une simulation Python utilisant un processus aléatoire (module random) sur un grand nombre d'expériences.

Comparer la valeur obtenue à l'incertitude-type donnée par la formule de composition des incertitudes.

Exemple : titrage

Soit le titrage d'un acide de concentration \(C_A\) et de volume \(V_A\) par une base de concentration \(C_B\) et de volume \(V_B\).

A l'équivalence :

\[V_B = V_E \hspace{1cm}\text{et}\hspace{1cm} \boxed{C_A = \dfrac{C_B \cdot V_E}{V_A}}\]
Données

Grandeur

Valeur

Source d'erreurs

Incertitude-type

\(C_B\)

0,70 mol/L

Préparation solution titrante

0,02 mol/L

\(V_A\)

10,00 mL

Pipette jaugée 10,0 mL (classe A)

0,02 mL

\(V_E\)

20,00 mL

Burette graduée de 25 mL

0,03 mL

Le programme suivant simule la variabilité de le concentration \(C_A\) pour un nombre important de titrages en tenant compte de l'incertitude-type de chaque grandeur présente dans l'expression de \(C_A\).

import numpy as np
from statistics import mean, stdev

def alea(x):
   """ Retourne une valeur avec une erreur aléatoire de la grandeur x
   """
   tirage = np.random.normal() # Tirage suivant une loi normale entre - infini et + infini
   return x[0]+x[1]*tirage     # Valeur avec erreur aléatoire

CB = [0.70, 0.02]   # valeur et incertitude-type de CB
VA = [10.00, 0.02]  # valeur et incertitude-type de VA
VE = [20.00, 0.03]  # valeur et incertitude-type DE VE

n = 100             # Nombre de titrage : 100, 1000, 10000, ...
CA = [alea(CB)*alea(VE)/alea(VA) for i in range(n)] # Calcul de CA pour les n titrages

moy = mean(CA)      # Valeur moyenne
s = stdev(CA)       # Ecart-type

print("moy = ", moy, "s =", s)
print("Moyenne CA =", round(moy,2), "mol/L")
print("Incertitude type sur CA =", round(s,2), "mol/L")
Résultats

>>> %Run script.py
moy =  1.4023357675343335 s = 0.03913323674046289
Moyenne CA = 1.4 mol/L
Incertitude type sur CA = 0.04 mol/L

>>> %Run script.py
moy =  1.3920096197242249 s = 0.03937987403174825
Moyenne CA = 1.39 mol/L
Incertitude type sur CA = 0.04 mol/L

Plus grand sera n, meilleure sera l'estimation de l'incertitude-type composée !

Comparaison

\[u(C_A) = C_A \times \sqrt{(\dfrac{u(C_B)}{C_B})^2 + (\dfrac{u(V_E)}{V_E})^2 + (\dfrac{u(V_A)}{V_A})^2}\]
\[u(C_A) = 1,4 \times \sqrt{(\dfrac{0,02}{0,70})^2 + (\dfrac{0,03}{20,00})^2 + (\dfrac{0,02}{10,00})^2} \approx 0,04~{\rm mol/L}\]