Etude du mouvement brownien. Marche aléatoire.
🍷

Etude du mouvement brownien. Marche aléatoire.

image

Introduction

Selon Wikipedia [4] :

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 (1773-1858), est un chirurgien, botaniste et explorateur écossais.
Robert Brown (1773-1858), est un chirurgien, botaniste et explorateur écossais.

Le mouvement brownien (aussi appelé 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 des sciences physiques mais aussi dans la finance (analyse des cours boursiers). On parle de processus stochastique. Ces travaux sont associés à des scientifiques prestigieux comme Albert EINSTEIN et Jean PERRIN.

Toujours selon Wikipedia [4] :

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)
L'exemple de l'ivrogne pour comprendre le mouvement stochastique
L'exemple de l'ivrogne pour comprendre le mouvement stochastique

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

Mouvement brownien vu au microscope de microbilles de 1 de diamètre dans l’eau. Les particules ont un mouvement aléatoire. [3]

É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 d'une longueur constante. On nomme cette longueur : libre parcours moyen et nous la notons .

🚩 Attention : les bouts de code ci-dessous ne sont pas optimisés. Ils datent d'une époque ou j'avais une expertise bien limitée en python.

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 aléatoires d’un ivrogne.
Représentation graphique des pas aléatoires d’un ivrogne.

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 des notions de probabilité. 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 ?

Le code suivant permet de tracer 10 trajectoires de 1000 pas :

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 sur l'axe des x.

On trouve la relation suivante sachant 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, dans notre modèle, l'ivrogne n'a pas de raison particulière de privilégier un déplacement vers la gauche par rapport à un pas vers la droite (les directions sont équiprobables ).

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 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 centrée sur la moyenne et un écart type . Ce qui s'écrit formellement :

Or l'espace est isotrope donc (nous sommes alors dans le cas d'une épreuve de Bernoulli). Ce qui implique d'ailleurs que la moyenne .

Le code suivant permet de représenter la distribution des positions finales de l'ivrogne :

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 décrit bien une gaussienne

Revenons à l'ivrogne (qui symbolise la particule), nous cherchons à connaître la distance parcourue après une durée déterminée . On se rappelle 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 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 :

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.