Étude du mouvement brownien à l’aide de Python. Marche aléatoire.

image

Introduction

Selon Wikipedia :

En 1827, Robert Brown (Botaniste Écossais) observe le pollen du Clarkia pulchella et constate, au microscope, la présence de très petites particules bougeant dans tous les sens. Il renouvelle cette observation chez d’autres plantes, croyant dans un premier temps en la manifestation d’un « fluide vital ». L’observation du même phénomène sur des particules anorganiques le fait changer d’avis. Il publie ses résultats en 1828 dans un opuscule au long titre « A brief account of microscopical observations on the particles contained in the pollen of plants ; and on the general existence of active molecules in organic and inorganic bodies », reconnaissant dans ce dernier, qu’il avait été précédé par d’autres savants dans la constatation de ces mouvements erratiques. L’explication de ceux-ci ne sera donné que bien plus tard par la théorie atomiste.
Robert Brown, né le 21 décembre 1773 à Montrose et mort le 10 juin 1858 à Londres, est un chirurgien, botaniste et explorateur écossais.
Robert Brown, né le 21 décembre 1773 à Montrose et mort le 10 juin 1858 à Londres, est un chirurgien, botaniste et explorateur écossais.

Le mouvement brownien (marche au hasard) revêt une importance particulière dans l’étude de la nature. Il permit à l’époque, une confirmation de l’existence des atomes, mais aussi l’évaluation du nombre d’Avogadro. Les recherches associées à ce mouvement sont encore utilisées aujourd’hui dans de nombreux domaines comme les sciences physiques et la finance (analyse des cours boursiers). On parle de processus stochastique. Ces travaux sont aussi associés à des scientifiques prestigieux comme Albert EINSTEIN et Jean PERRIN.

Selon Wikipedia :

En 1905, Albert Einstein donne une description quantitative du mouvement brownien et indique notamment que des mesures faites sur le mouvement permettent d’en déduire leur dimension moléculaire. Jean Perrin réalise ce programme et publie en 1909 une valeur du nombre d’Avogadro, ce qui lui vaut un prix Nobel en 1926. Il décrit également l’extrême irrégularité des trajectoires qui n’ont de tangente en aucun point. […] — Jean Perrin (physicien français né à Lille)

On se propose dans ce petit papier de modéliser le mouvement brownien à l’aide d’une approche élémentaire. On se servira du modèle de l’ivrogne (qui représentera une particule)

L’ivrogne comme point de départ, en cherchant la ligne d’arrivée
L’ivrogne comme point de départ, en cherchant la ligne d’arrivée
Mouvement brownien vu au microscope de microbilles de 1 de diamètre dans l’eau. Les particules ont un mouvement aléatoire.

Étude

Importons les bibliothèques nécessaires en Python :

# Mathématiques et calculs 
import random
from statistics import mean
import numpy as np

# Graphiques
import matplotlib
import matplotlib.pyplot as plt
from matplotlib import animation

# Configuration pour avoir un rendu convenable dans Jupyter
%matplotlib inline
from IPython.display import HTML, Image
matplotlib.rcParams['animation.html'] = 'html5' # Affichage des vidéos
matplotlib.rcParams['figure.dpi'] = 150 # Définition des images/vidéos

Dans l’étude du transport de grandeurs physiques par des molécules, le physicien peut, en première approximation adopter un modèle stochastique appelé marche au hasard. C’est le cas par exemple dans l’interprétation de la viscosité pouvant être considérée comme le transport d’une quantité de mouvement. Comme écrit plus haut, le modèle utilisé est celui de l’ivrogne, celui-ci effectue aléatoirement soit un pas dans un sens, soit un pas dans un autre mais toujours de longueur constante. On nomme cette longueur libre parcours moyen et nous la notons .

NBR_PAS = 100
trajectoire = []
for i in range(NBR_PAS):
    trajectoire.append(random.choice([-1, 1]))
plt.plot(trajectoire,".:",linewidth=0.6,markersize=3, color = "black",markeredgecolor="red")
plt.title("Représentation du mouvement de l'ivrogne")
plt.xlabel('Numéro du pas', fontsize=12)
plt.ylabel('Longueur (m)', fontsize=12)
plt.yticks([-1,1])
plt.figtext(0.70, 0.030, 'www.sciences-physiques.net', fontsize = 6, color = 'black', alpha = 0.9, fontweight = 'normal');
Représentation graphique des pas d’un ivrogne, ceux-ci sont considérés aléatoires
Représentation graphique des pas d’un ivrogne, ceux-ci sont considérés aléatoires

Pour résoudre le problème, on se place, comme souvent en physique dans un cas arbitrairement simplifié (faisons taire dès à présent les mauvaises langues, il ne s’agit pas d’approximer l’ivrogne par une sphère). Mais plus sobrement (si j’ose dire) de considérer une marche aléatoire unidimensionnelle, décrite par un unique axe . Il sera a posteriori, plus facile de généraliser le résultat à un mouvement tridimensionnel, plus réaliste.

Mathématiquement nous utiliserons nos connaissances sur les probabilités. Chaque déplacement de l’ivrogne est une épreuve et l’expérience consiste en une succession de épreuves. Chaque épreuve pouvant conduire à deux événements :

  • Événement : La particule se déplace vers les positifs ;
  • Événement : La particule se déplace vers les négatifs.

Mais quelle est alors la probabilité pour qu’un ivrogne effectue en tout et pour tout un déplacement de mètres selon les ? (c’est-à-dire vers la droite, côté positif de l’axe)

NBR_PAS = 1000
NBR_IVROGNE = 10
trajectoires_ivrognes=[]
X_MAX = 0
X_MIN = 0

# Pour chaque ivrogne
for b in range(NBR_IVROGNE):
    pas = []
    trajectoire = []
    # Pour chaque pas on construit la trajectoire
    for i in range(NBR_PAS):
        pas.append(random.choice([-1, 1]))
        trajectoire.append(sum(pas))
    # On enregistre la trajectoire
    trajectoires_ivrognes.append(trajectoire)
    # Pour tracer le graphique il nous faut le max et le min
    MAX_TRAJ = max(trajectoire)
    MIN_TRAJ = min(trajectoire)
    if MAX_TRAJ > X_MAX:
        X_MAX = MAX_TRAJ
    if MIN_TRAJ < X_MIN:
        X_MIN = MIN_TRAJ

# Création d'une liste par compréhension pour l'axe des abscisses
num_pas = [i for i in range(NBR_PAS)]

# Création du graphique
fig, ax = plt.subplots()
ax = plt.axis([0,NBR_PAS,X_MIN-2,X_MAX+2]);

# Création des objets courbes
courbe = []
for c in range(NBR_IVROGNE):
    courbe.append(plt.plot([0], [0], '-',linewidth=0.6,label="Ivrogne n°" + str(c))) 
    
# Embellissement
plt.title("Trajectoire des ivrognes")
plt.xlabel('Pas', fontsize=12)
plt.ylabel("Position (m)", fontsize=12) 
plt.legend(prop={'size':6},loc='lower left')
plt.figtext(0.70, 0.030, 'www.sciences-physiques.net', fontsize = 6, color = 'black', alpha = 0.9, fontweight = 'normal');
# Fonction qui sera appelée un NBR_PAS fois
def animate(i):
    for b in range(NBR_IVROGNE):
        courbe[b][0].set_data(num_pas[0:i], trajectoires_ivrognes[b][0:i])
              
# Création d'une animation, en créant un graphique image par image
myAnimation = animation.FuncAnimation(fig, animate, frames=NBR_PAS,interval=20,repeat=False);
myAnimation
Trajectoires de différents ivrognes (ou particules)

Dans un premier temps, relions , le nombre de pas vers la droite (positifs) avec (le nombre total de déplacements) et la position finale. On trouve la relation suivante vu que la somme des pas est la somme des pas vers la droite à laquelle on ajoute ceux vers la gauche : Remarque : nous pourrions suivre le même raisonnement en paramétrant par une variable les déplacements vers la gauche (au lieu des pas vers la droite), les résultats finaux seraient identiques. En effet la particule n'a pas de raison particulière de privilégier un déplacement vers la gauche ou vers la droite (les directions sont équiprobables ). Ce qu'impose des considérations sur les symétries.

On peut ensuite se demander quelle est la probabilité d'obtenir évènements parmi épreuves ? C'est-à-dire qu'elle est la probabilité d'aller fois vers la droite quand l'ivrogne effectue déplacements en tout. On se sert de la loi binomiale vue en mathématiques au lycée.

Remarque : représente la probabilité d'effectuer un déplacement vers la droite à la puissance .

Résolution

On peut utiliser l'approximation de Stirling et exprimer les factoriels puis normaliser. J'utiliserai plutôt ici les conclusions du Théorème central limite, je trouve cette méthode plus élégante.

Pour ce faire, définissons une variable aléatoire nommée déplacement élémentaire que l'on note ayant deux valeurs possibles , positif (resp négatif) pour un déplacement vers la droite (resp gauche).

Définissons ensuite la variable aléatoire , la somme des petits déplacements élémentaires. La variable aléatoire pour une trajectoire donnée peut naturellement s'écrire :

Calculons la moyenne et la variance de la variable aléatoire élémentaire :

Le théorème central limite permet d'affirmer que si alors la variable aléatoire tend vers gaussienne avec une moyenne et un écart type . Ce qui s'écrit formellement :

Or l'espace est isotrope donc (ce que l'on appelle épreuve de Bernoulli). Ce qui implique d'ailleurs que la moyenne .

fig = plt.figure();
NBR_PAS = 100
NBR_IVROGNE = 100000
# Liste contenant les positions d'arrivée des ivrognes
position_arrivee = []

# Pour chaque ivrogne
for b in range(NBR_IVROGNE):
    position = 0
    # Pour chaque pas on ajoute/enlève 1 à la position
    for i in range(NBR_PAS):
        position = position + random.choice([-1, 1])
    # On enregistre le tout dans la liste
    position_arrivee.append(position)

# Recherche des maximums pour tracer    
MAX = max(position_arrivee)
MIN = min(position_arrivee)

# Traçage de la figure
fig, ax = plt.subplots()
ax = plt.axis([-40, 40, 0, 1])
plt.autoscale(enable=True, axis='y')
plt.xlabel('Position (m)', fontsize=12)
plt.ylabel("Nombre d'ivrogne(s)", fontsize=12) 
plt.figtext(0.70, 0.030, 'www.sciences-physiques.net', fontsize = 6, color = 'black', alpha = 0.9, fontweight = 'normal');
plt.hist(position_arrivee[0:1], MAX - MIN+1,  facecolor='blue', alpha=0.5,edgecolor = 'black')

def animate_hist(i):
    plt.hist(position_arrivee[0:i], MAX - MIN+1,  facecolor='blue', alpha=0.5,edgecolor = 'black')
    plt.title("Distribution des positions finales :  "+ str(i))

# liste permettant de savoir pour quelles valeurs appeler la fonction animate_hist
liste = [i for i in range(1,11)] + [i*10 for i in range(2,11)] + [i*100 for i in range(2,11)] + [i*1000 for i in range(2,11)] + [i*10000 for i in range(2,11)]
# create animation using the animate() function
myAnimation = animation.FuncAnimation(fig, animate_hist, frames=liste,interval=200,repeat=False);
myAnimation
La distribution des ivrognes selon la position moyenne atteinte décrit bien une gaussienne

Revenons à l'ivrogne (qui je vous le rappelle symbolise la particule), nous cherchons à connaître la distance parcourue après une durée déterminée . Rappelons nous de la position finale. Les relations entre ces grandeurs sont :

En introduisant , la durée nécessaire pour parcourir le libre parcours moyen à la vitesse moyenne . On peut donc réécrire l'équation en fonction des variables intéressantes. La probabilité d'avancer de devient donc :

Calculons la distance quadratique moyenne parcourue :

La distribution s'élargit proportionnellement à la racine carrée de la durée . Formulé autrement on peut dire que la région visitée par la particule (l'ivrogne) croît comme la racine carrée de la durée de l'expérience.

C'est bien ce que l'expérience montre. Le modèle théorique est compatible.
C'est bien ce que l'expérience montre. Le modèle théorique est compatible.

Compléments mathématiques pour le calcul de l’intégrale

La première intégrale à calculer est :

En prenant au carré l'intégrale

On s'empresse de passer en coordonnée polaire :

Que l'on sait calculer facilement après un changement de variable () :

On prend la racine carrée :

Attardons-nous maintenant sur la deuxième intégrale :

On remarque que l'intégrale est l'opposée de la dérivée de par rapport à , c'est à dire :

Fichier PDF - Marche aléatoire1820.4KB

Références

[1] Claude ASLANGUL. Des mathématiques pour les sciences. DE BOECK, 2011.

[2] José philippe PEREZ. Thermodynamique – Fondements et Applications. DUNOD, 3ème edition, 2001.

[3] science questions.org. Qu’est-ce que le mouvement brownien ? , 2019.

[4] Wikipedia. Mouvement brownien, 2020.