Décroissance radioactive et lancer de cubes, avec Python

Pour présenter quelques caractéristiques de la décroissance radioactive d’un échantillon, je prends comme exemple une succession de lancers de cubes, une expérience assez classique pour un cours de radioactivité.

Le principe de l’expérience

L’échantillon est un ensemble de cubes dont une seule face est peinte. Si un cube tombe avec sa face peinte sur le haut, il est considéré comme un noyau radioactif désintégré, et éliminé de l’échantillon. Chaque lancer est pris comme une unité de temps (une seconde, par exemple). À chaque lancer, on compte le nombre de cubes restants, ce qui produit une liste de valeurs : Nombre de lancers – Nombre de cubes restants.

Mise en œuvre pratique

L’objectif est de montrer aux étudiants que, malgré le caractère aléatoire des lancers – une régularité apparaît pour un nombre suffisant de comptages. Je distribue 10 cubes par étudiant, plus quelques-uns pour moi de façon à compléter à 200 cubes au départ.

À chaque lancer, nous faisons le total des cubes restants.

Après 10 lancers, je trace le graphique du nombre de cubes en fonction du nombre de lancers.

La régression à l’aide d’une fonction exponentielle donne deux paramètres ayant une signification physique :

Le facteur multiplicatif se rapproche du nombre initial de noyaux (N0)

le facteur à l’intérieur de l’argument de l’exponentielle se rapproche de 1/6 : la probabilité qu’un noyau se désintègre à chaque lancer.

Avec 200 cubes, les données sont à peine assez nombreuses pour retrouver les valeurs attendues. Il est alors intéressant de compiler les mesures du jours avec celles effectuées les années précédentes.

Pour ce faire, je place les données dans un fichier .csv :

#Nombre de cubes restants après ‘t’ lancers		
t	2019	2018
0	200	200
1	157	177
2	137	151
3	115	134
4	104	110
5	85	98
6	71	81
7	59	67
8	50	56
9	42	49
10	37	35

Chaque colonne correspond à une série de lancers réalisée la même année.

Un fichier en format .csv peut être créé très simplement, avec un logiciel de texte (par exemple Gedit sur Linux/Ubuntu, ou encore Bloc-Notes sur Windows). C’est un format sans aucune mise en forme. Il est également possible d’enregistrer un fichier de tableur (comme LibreOffice Calc) en format .csv. Il vous sera alors nécessaire de vérifier quel caractère sert de séparateur (tabulation, virgule, point-virgule…), pour le préciser ensuite dans le code Python.

Avec un programme en Python, je lis les données de ce fichier, en sélectionnant une série. Pour cela, j’utilise le module Pandas (lecture de données dans un fichier .csv).

import numpy as np#fonction exponentielle
import pandas as pd#lecture fichier csv
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit#pour la régression
from sklearn.metrics import r2_score#pour calculer le coeff R2

#importation des données du fichier CSV :
table=pd.read_csv("LancersCubes.csv", delimiter='\t', skiprows=1)

t=table["t"]
NN=table.iloc[:, 1:]#sélectionne toutes les colonnes de N (sans t)
"""
pour le nb de noyaux N, choisir une ligne parmi les suivantes :
"""
#N=table["2019"]#pour une seule série de lancers
N=NN.mean(axis=1)#moyenne des années, par ligne

En utilisant la commande mean(axis=1), j’accède à la moyenne des colonnes par ligne, ce qui permet de compiler les résultats de plusieurs années, et donc d’augmenter le nombre de lancers.

Plus les comptages sont nombreux, plus le coefficient de corrélation R2 se rapproche de 1.

La suite du code :

#modélisation :----------------------------------------------------
def func(x, a, b):
    return a*np.exp(-b*x)

popt, pcov = curve_fit(func, t, N)#calcul de la meilleure courbe
Nmodelise=func(t, *popt)
#popt contient les coeff a, b et c en liste
R2=r2_score(N, Nmodelise)#coeff. de corrélation
#--------------------------------------------------------------------

#Paramètres du graphique :
fig, ax=plt.subplots()
plt.title("Radioactivité et lancers de cubes")
plt.xlabel("nombre de lancers (ou temps t)")
plt.ylabel("cubes restants N (ou nombre de noyaux)")
plt.xlim(min(t), max(t))
couleurmodele='royalblue'
#Tracés :-----------------------------------------
plt.plot(t, N, 'ko', label="valeurs expérimentales")
plt.plot(t, Nmodelise, label="modélisation", c=couleurmodele)
plt.text(0.05, 0.05, r"N=%s$\times \exp^{-%s*t}$"%(round(popt[0], 2), round(popt[1], 3)), c=couleurmodele, transform=ax.transAxes)
plt.text(0.5, 0.05, r"$R^2=%.6f$"%(R2),c=couleurmodele,  transform=ax.transAxes)
#le mot-cle transform=ax.transAxes prend comme repère de coordonnées le cadre du graphe.
plt.legend()
fig.savefig("LancersCubes2.png", dpi=200)
plt.show()

Le module scipy sert à la régression avec une expression exponentielle décroissante. L’outil r2_score calcule le coefficient de corrélation R2, afin d’apprécier la conséquence d’un plus grand nombre d’expériences sur la pertinence du modèle en exponentielle.


Le fichier Python complet (compressé) :


Voir aussi cet autre article, qui propose des tirages aléatoires avec Python pour simuler un ensemble de dés à 6 faces.

Soyez le premier à commenter

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.