Marche alĂ©atoire đ·#
Le mouvement brownien, aussi appelĂ© marche alĂ©atoire, revĂȘt une importance particuliĂšre dans lâĂ©tude de la nature. Il a permis Ă lâĂ©poque de confirmer lâexistence des atomes, ainsi que dâĂ©valuer le nombre dâAvogadro. Les recherches associĂ©es Ă ce mouvement sont encore utilisĂ©es aujourdâhui dans de nombreux domaines des sciences physiques, mais aussi en finance (notamment pour lâanalyse des cours boursiers). On parle alors de processus stochastique. Ces travaux sont associĂ©s Ă des scientifiques prestigieux tels quâAlbert Einstein et Jean Perrin. 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).[3]
Robert Brown#
Robert Brown (1773-1858) Ă©tait un botaniste Ă©cossais cĂ©lĂšbre pour sa dĂ©couverte du mouvement Brownien en 1827. Ce phĂ©nomĂšne se rĂ©fĂšre Ă lâagitation alĂ©atoire des particules microscopiques en suspension dans un fluide, quâil observa en examinant des grains de pollen dans lâeau. Brown croyait initialement que ce mouvement Ă©tait une caractĂ©ristique des particules vivantes, mais il sâest vite rendu compte quâil se produisait mĂȘme avec des particules inanimĂ©es. Le mouvement Brownien a Ă©tĂ© fondamental dans le dĂ©veloppement de la physique statistique, particuliĂšrement dans les travaux dâAlbert Einstein au dĂ©but du 20e siĂšcle, qui a expliquĂ© ce mouvement par les collisions entre les particules et les molĂ©cules de fluide.[1]
Jean Perrin#
Jean Perrin (1870-1942) Ă©tait un physicien français Lillois qui a jouĂ© un rĂŽle crucial dans la validation expĂ©rimentale du mouvement brownien. En 1908, il a confirmĂ© les travaux thĂ©oriques dâAlbert Einstein sur ce phĂ©nomĂšne en Ă©tudiant la rĂ©partition des particules en suspension dans un liquide. Perrin a dĂ©montrĂ© que ce mouvement alĂ©atoire des particules Ă©tait causĂ© par les collisions avec les molĂ©cules du liquide, fournissant ainsi une preuve directe de lâexistence des atomes et des molĂ©cules. Ses travaux ont Ă©tĂ© essentiels pour Ă©tablir la thĂ©orie atomique, et en 1926, il a reçu le prix Nobel de physique pour ses contributions Ă la physique molĂ©culaire et atomique.[2]
Présentation du problÚme#
Prudence
Lâobjectif est de prĂ©senter un code simple et comprĂ©hensible. Il ne sâagit pas dâoptimiser excessivement le code Python đ, ni de tirer parti des multiples cĆurs des processeurs modernes, et encore moins dâutiliser des bibliothĂšques comme CUDA, qui permettent le calcul massivement parallĂšle sur un GPU. Une optimisation sommaire est proposĂ©e en annexe.
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 alĂ©atoire. Câest le cas, par exemple, pour lâinterprĂ©tation de la viscositĂ©, qui peut ĂȘtre considĂ©rĂ©e comme le transport dâune quantitĂ© de mouvement. Comme mentionnĂ© plus haut, le modĂšle utilisĂ© est celui de lâivrogne, oĂč celui-ci effectue alĂ©atoirement un pas dâune longueur fixe, notĂ©e \(l\), dans un sens ou dans lâautre.
Code 1
- reprĂ©sentation simple du mouvement de lâivrogne#
# Importation des bibliothÚques nécessaires
import random # Pour générer des valeurs aléatoires
import matplotlib # Pour configurer les paramĂštres globaux de matplotlib
import matplotlib.pyplot as plt # Pour créer des graphiques
# Configuration globale de la résolution des graphiques
matplotlib.rcParams['figure.dpi'] = 150 # Définit la résolution des images/vidéos pour une meilleure qualité visuelle
# ParamĂštres
NBR_PAS = 100 # Nombre de pas que fera l'ivrogne dans sa marche aléatoire
trajectoire = [] # Liste pour stocker les positions Ă chaque pas
# Génération de la trajectoire avec marche aléatoire (modÚle de l'ivrogne)
position = 0 # Initialisation de la position Ă 0
for i in range(NBR_PAS):
pas = random.choice([-1, 1]) # L'ivrogne fait un pas de +1m ou -1m (choix aléatoire)
trajectoire.append(pas) # Ajoute le pas Ă la liste
# Affichage du graphique
plt.plot(trajectoire, ".:", linewidth=0.7, markersize=5, color="black", markeredgecolor="red") # Tracé de la courbe
plt.title("Représentation du mouvement de l'ivrogne",fontsize=15) # Titre du graphique
plt.xlabel('NumĂ©ro du pas', fontsize=14) # Ătiquette pour l'axe des x (le numĂ©ro du pas)
plt.ylabel('Position (m)', fontsize=14) # Ătiquette pour l'axe des y (la position en mĂštres)
plt.yticks(range(min(trajectoire), max(trajectoire) + 1)) # Ajuste les graduations sur l'axe y pour montrer toutes les positions possibles
plt.figtext(0.70, 0.015, 'RĂ©mi MEVAERE - sciences-physiques.net', fontsize=6, color='black', alpha=0.9, fontweight='normal') # Ajout d'une mention en bas Ă droite
# Afficher ou sauvegarder l'image
plt.show() # Affiche le graphique Ă l'Ă©cran
Code 2
: Simulation de la trajectoire de 20 ivrognes parcourant 1000 pas#
# Mathématiques et calculs
import random
# Graphiques
import matplotlib
import matplotlib.pyplot as plt
from matplotlib import animation
# Configuration des paramĂštres de Matplotlib pour les graphiques
matplotlib.rcParams['animation.html'] = 'html5' # Configuration pour affichage des animations
matplotlib.rcParams['figure.dpi'] = 150 # Définition de la résolution des images
# Constantes
NBR_PAS = 1000 # Nombre de pas par ivrogne
NBR_IVROGNE = 20 # Nombre d'ivrognes simulés
trajectoires_ivrognes = [] # Liste pour stocker les trajectoires de chaque ivrogne
X_MAX = 0 # Variable pour suivre la position maximale
X_MIN = 0 # Variable pour suivre la position minimale
# Simulation des trajectoires des ivrognes
for b in range(NBR_IVROGNE):
pas = [] # Liste pour stocker les pas individuels
trajectoire = [] # Liste pour stocker la trajectoire cumulée
# Simulation des pas pour un ivrogne for i in range(NBR_PAS):
pas.append(random.choice([-1, 1])) # Choix aléatoire d'un pas (-1 ou 1)
trajectoire.append(sum(pas)) # Mise Ă jour de la trajectoire
# Enregistrer la trajectoire de cet ivrogne trajectoires_ivrognes.append(trajectoire)
# Mettre à jour les bornes pour l'axe des ordonnées
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 des numéros de pas pour l'axe des abscisses
num_pas = [i for i in range(NBR_PAS)]
# Création de la figure et de l'axe pour le graphique
fig, ax = plt.subplots()
ax = plt.axis([0, NBR_PAS, X_MIN-2, X_MAX+2]) # DĂ©finition des limites de l'axe
# Création des objets "courbe" pour chaque ivrogne
courbe = []
for c in range(NBR_IVROGNE):
courbe.append(plt.plot([0], [0], '-', linewidth=1, solid_joinstyle='round', label="Ivrogne n°" + str(c))) # Initialiser les courbes
# Embellissement du graphique
plt.title("Trajectoire des ivrognes", fontsize=15)
plt.xlabel('Numéro du pas', fontsize=14)
plt.ylabel("Position (m)", fontsize=14)
plt.figtext(0.70, 0.015, 'RĂ©mi MEVAERE - sciences-physiques.net', fontsize=6, color='black', alpha=0.9, fontweight='normal') # Ajout d'une mention en bas Ă droite
# Fonction d'animation appelée pour chaque frame
def animate(i):
# Mettre à jour les données pour chaque ivrogne
for b in range(NBR_IVROGNE):
courbe[b][0].set_data(num_pas[0:i], trajectoires_ivrognes[b][0:i]) # Mettre à jour les points tracés
# 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)
# Sauvegarde de l'animation dans un fichier .mp4 (optionnel)
myAnimation.save("trajectoire_ivrognes.mp4", writer="ffmpeg")
# Affichage du graphique animé
plt.show()
Problématique#
Quelle est la probabilitĂ© que lâivrogne effectue, au total, un dĂ©placement de \(\mathbf{x}\) mĂštres dans la direction des \(\mathbf{x > 0}\) ?
RĂ©solution#
Ăpreuve de Bernoulli#
Nous nous plaçons, comme il est frĂ©quent en physique, dans un cas simplifiĂ©. Nous considĂ©rons une marche alĂ©atoire unidimensionnelle, dĂ©crite le long dâun unique axe \(\mathbf{x}\). Il sera, par la suite, plus aisĂ© de gĂ©nĂ©raliser ce rĂ©sultat Ă un mouvement tridimensionnel, plus reprĂ©sentatif de la rĂ©alitĂ© physique. Lâimage en en-tĂȘte dâailleurs reprĂ©sente un modĂšle plus complexe de mouvement stochastique Ă deux dimensions.
Sur le plan mathĂ©matique, nous nous appuierons sur des concepts de probabilitĂ©. Chaque dĂ©placement de lâivrogne correspond Ă une Ă©preuve, et lâexpĂ©rience consiste en une succession de \(\mathbf{N}\) Ă©preuves. Chaque Ă©preuve peut conduire Ă lâun des deux Ă©vĂ©nements Ă©quiprobables suivants :
ĂvĂ©nement +
: la particule se dĂ©place dans la direction des \(\mathbf{x}\) positifs ;ĂvĂ©nement -
: la particule se déplace dans la direction des \(\mathbf{x}\) négatifs.
Relions \(\mathbf{n}\), le nombre de pas vers la droite (positifs), avec \(\mathbf{N}\) (le nombre total de dĂ©placements) et \(\mathbf{m}\) la position finale sur lâaxe des \(x\). La position finale \(m\) est donnĂ©e par la diffĂ©rence entre le nombre de pas vers la droite \(n\) et le nombre de pas vers la gauche \((N - n)\) :
Remarque đ§
Nous pourrions suivre le mĂȘme raisonnement en paramĂ©trant les dĂ©placements vers la gauche plutĂŽt que ceux 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, \(p_{\pm} = 0{,}5\)).
On peut ensuite se demander quelle est la probabilitĂ© dâobtenir \(\mathbf{n}\) dĂ©placements vers la droite parmi \(\mathbf{N}\) Ă©preuves. Câest-Ă -dire, quelle est la probabilitĂ© que lâivrogne aille \(\mathbf{n}\) fois vers la droite lorsquâil effectue \(\mathbf{N}\) dĂ©placements au total. La loi binomiale vue en mathĂ©matiques au lycĂ©e rĂ©pond Ă cette question :
Notation đïž
\(p_{+}^{\, n}\) reprĂ©sente la probabilitĂ© dâeffectuer un dĂ©placement vers la droite, Ă©levĂ©e Ă la puissance \(n\).
Avec le théorÚme central limite#
Pour calculer la probabilitĂ© que lâivrogne se retrouve en position \(m\) aprĂšs \(N\) pas, on utilisera le thĂ©orĂšme central limite (trĂšs utile lorsque \(N\) est grand).
Pourquoi utiliser le théorÚme central limite ?
Le thĂ©orĂšme central limite est fondamental en probabilitĂ© et en statistique, il nous permet dâapprocher la distribution binomiale par une loi normale (gaussienne), ce qui simplifie les calculs. Il affirme que la somme de variables alĂ©atoires indĂ©pendantes et identiquement distribuĂ©es tend vers une distribution normale lorsque le nombre de variables augmente.
Pertinence :
Chaque dĂ©placement Ă©lĂ©mentaire de lâivrogne est une variable alĂ©atoire indĂ©pendante ;
Les dĂ©placements sont identiquement distribuĂ©s (chaque pas a la mĂȘme probabilitĂ© dâĂȘtre Ă gauche ou Ă droite) ;
IntĂ©rĂȘt :
Simplicité de calcul : Au lieu de manipuler des distributions binomiales complexes pour de grandes valeurs de \(N\), on utilise une gaussienne, beaucoup plus facile à gérer analytiquement ;
PrĂ©vision des comportements : Il permet de prĂ©dire la probabilitĂ© de trouver lâivrogne Ă une certaine distance de son point de dĂ©part aprĂšs un grand nombre de pas.
UniversalitĂ© : Ce thĂ©orĂšme est applicable Ă de nombreux systĂšmes physiques oĂč des variables alĂ©atoires indĂ©pendantes sâadditionnent, comme en physique statistique, en thermodynamique ou en finance.
Variable aléatoire : déplacement élémentaire#
Définissons une variable aléatoire nommée déplacement élémentaire notée \(\delta X_i\), ayant deux valeurs possibles \(\delta X_i = \pm 1\) :
\(\delta X_i = +l\) si lâivrogne se dĂ©place vers la droite.
\(\delta X_i = -l\) si lâivrogne se dĂ©place vers la gauche.
La variable alĂ©atoire \(X_N\), somme des petits dĂ©placements Ă©lĂ©mentaires reprĂ©sente la position finale \(m\) de lâivrogne aprĂšs \(N\) pas :
Espérance#
Le résultat étant trivial vu que les deux évÚnements sont équiprobables.
Variance#
Ecart-type#
Application du ThéorÚme#
Le théorÚme central limite stipule que pour \(N \gg 1\), la variable aléatoire \(X_N\) suit approximativement une loi normale centrée sur \(N \cdot \langle \delta X_i \rangle\) (ici 0) et de variance \(N \cdot \sigma_{\delta X}^2\) (ici \(N\)) :
En remplaçant \(\langle \delta X_i \rangle = 0\) et \(\sigma_{\delta X}^2 = 1\), on obtient :
Ătant donnĂ© que le dĂ©placement net \(m\) est Ă©gal Ă \(X_N\), la probabilitĂ© de trouver lâivrogne en position \(x\) aprĂšs \(N\) pas est donnĂ©e par :
Code 3
- VĂ©rification de la distribution normale#
Note
Pour la simulation on se facilite la tùche en utilisant un déplacement \(l=\pm 1\)
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
from matplotlib import animation
# Constantes
NBR_PAS = 100 # Nombre de pas pour chaque ivrogne
NBR_IVROGNES = 900000 # Nombre total d'ivrognes simulés
# Configuration des paramĂštres de Matplotlib pour les graphiques
matplotlib.rcParams['animation.html'] = 'html5' # Configuration pour affichage des animations
matplotlib.rcParams['figure.dpi'] = 150 # Définition de la résolution des images
# Simulation des positions finales des ivrognes
deplacements = np.random.choice([-1, 1], size=(NBR_IVROGNES, NBR_PAS))
positions_finales = np.sum(deplacements, axis=1)
# DĂ©termination des positions minimale et maximale pour ajuster les limites du graphique
MIN, MAX = positions_finales.min(), positions_finales.max()
# Préparation de la figure pour l'animation
fig, ax = plt.subplots()
ax.set_xlim(MIN - 5, MAX + 5)
plt.xlabel('Position finale', fontsize=12)
plt.ylabel("Probabilité", fontsize=12)
plt.title('Distribution des positions finales des ivrognes')
plt.figtext(0.70, 0.015, 'sciences-physiques.net', fontsize=6, color='black', alpha=0.9,
fontweight='normal')
# Initialisation de l'histogramme
nombre_bandes = MAX - MIN + 1
# Calcul de la courbe gaussienne théorique
x_gauss = np.linspace(MIN, MAX, 1000)
P_gauss = (1 / np.sqrt(2 * np.pi * NBR_PAS)) * np.exp(-x_gauss ** 2 / (2 * NBR_PAS))
# Fonction d'animation pour mettre Ă jour l'histogramme
def animer_histogramme(i):
plt.cla() # Efface le contenu précédent de la figure
donnees_histogramme = positions_finales[0:i] # SĂ©lectionne les positions jusqu'Ă l'ivrogne i
# Tracer l'histogramme normalisé (probabilités) comptes, bandes, patches = plt.hist(donnees_histogramme, bins=nombre_bandes, range=(MIN - 0.5, MAX + 0.5),
density=True, facecolor='blue', alpha=0.5, edgecolor='black')
# Calcul de la largeur des bandes
largeur_bande = bandes[1] - bandes[0]
# Tracer la courbe théorique gaussienne ajustée à la largeur des bandes
plt.plot(x_gauss, P_gauss * largeur_bande * 2, color='red', lw=2, label='Gaussienne théorique')
# Mise Ă jour des paramĂštres de la figure
plt.title(f"Distribution des positions finales : {i} ivrogne(s)", fontsize=15)
plt.xlabel('Position finale', fontsize=14)
plt.ylabel("Probabilité", fontsize=14)
plt.xlim(MIN - 5, MAX + 5)
plt.ylim(0, max(comptes.max(), (P_gauss * largeur_bande).max()) * 1.1) # Ajustement dynamique des ordonnées
# Création de la liste des frames pour l'animation
liste_frames = (
list(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, NBR_IVROGNES // 10000 + 1)]
)
# Ajustement des marges pour laisser de l'espace autour des axes
plt.subplots_adjust(left=0.15, right=0.95, top=0.9, bottom=0.1)
# Création de l'animation en utilisant la fonction animer_histogramme
mon_animation = animation.FuncAnimation(fig, animer_histogramme, frames=liste_frames, interval=200, repeat=False)
# Optionnel : sauvegarde de l'animation dans un fichier vidéo
mon_animation.save("distribution_ivrognes.mp4", writer="ffmpeg")
# Affichage de l'animation
plt.show()
Probabilité de parcourir une distance \(x\)#
Revenons Ă lâivrogne. Nous cherchons Ă connaĂźtre la distance \(\mathbf{x}\) parcourue aprĂšs une durĂ©e dĂ©terminĂ©e \(\mathbf{\Delta t}\). On se rappelle que \(\mathbf{m}\) est la position finale en nombre de pas (la diffĂ©rence entre le nombre de pas vers la droite et vers la gauche). Les relations entre ces grandeurs sont (\(l\) est la longueur dâun pas) :
De plus, la durĂ©e totale est donnĂ©e par (\(N\) est le nombre total de pas, \(\tau\) est la durĂ©e dâun pas) :
En utilisant ces relations, on peut exprimer la probabilitĂ© de trouver lâivrogne Ă une distance \(x\) aprĂšs un temps \(\Delta t\). Ă partir de la distribution obtenue prĂ©cĂ©demment pour \(P(m)\), en remplaçant \(m\) par \(\dfrac{x}{l}\), on obtient :
Sachant que \(N = \dfrac{\Delta t}{\tau}\), on peut aussi Ă©crire :
Distance quadratique moyenne parcourue#
Nous souhaitons calculer la valeur moyenne de \(x^2\), notée \(\langle x^2 \rangle\), qui est donnée par :
Mais Ă©tant donnĂ© que \(P(x)\) est une distribution gaussienne centrĂ©e en \(0\), nous savons que (\(\sigma^2\) est la variance de la distribution), lâidentification est aisĂ©e :
Ainsi, la distance quadratique moyenne parcourue est (\(l>0\), \(\Delta t>0\), \(\tau >0\)) :
Interprétation physique#
La distribution sâĂ©largit proportionnellement Ă la racine carrĂ©e de la durĂ©e \(\Delta t\). Autrement dit, 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. Ce comportement est caractĂ©ristique dâun processus de diffusion, oĂč la dispersion des particules augmente avec le temps de maniĂšre proportionnelle Ă \(\sqrt{\Delta t}\).
Code 4
- Accord avec la théorie#
Optimization đ©
Sur mon ordinateur, ce code absolument pas optimisé prend une durée trÚs longue (plus de 16 minutes). Les versions Vectorisée et CUDA disponibles en Annexes sont beaucoup plus rapides (40 secondes et 3 secondes).
import random
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
# Configuration des paramĂštres de Matplotlib pour les graphiques
matplotlib.rcParams['figure.dpi'] = 150 # RĂ©solution des images
# Constantes
NBR_IVROGNES = 2000 # Nombre d'ivrognes simulés
liste_NBR_PAS = (
list(range(10, 110, 20)) +
list(range(200, 1100, 200)) +
list(range(2000, 11000, 2000)) +
list(range(20000, 110000, 20000)) +
list(range(200000, 1000000, 200000))
)
distances_quadratiques_moyennes = [] # Liste pour stocker les distances quadratiques moyennes
distances_theoriques = [] # Liste pour stocker les distances théoriques
# Simulation pour chaque nombre de pas
for NBR_PAS in liste_NBR_PAS:
positions_finales = [] # Liste pour stocker les positions finales des ivrognes
# Simulation des ivrognes for _ in range(NBR_IVROGNES):
position = 0 # Position initiale
# Simulation des pas pour un ivrogne for _ in range(NBR_PAS):
pas = random.choice([-1, 1]) # Choix aléatoire d'un pas (-1 ou 1)
position += pas # Mise Ă jour de la position
positions_finales.append(position)
# Calcul de la distance quadratique moyenne pour ce nombre de pas
distances_quadratiques = [pos**2 for pos in positions_finales]
distance_quadratique_moyenne = sum(distances_quadratiques) / NBR_IVROGNES
distances_quadratiques_moyennes.append(distance_quadratique_moyenne)
# Calcul de la distance théorique
distance_theorique = NBR_PAS # Pour une marche aléatoire simple en 1D
distances_theoriques.append(distance_theorique)
# Conversion en tableaux numpy pour faciliter le tracé
liste_NBR_PAS_np = np.array(liste_NBR_PAS)
distances_quadratiques_moyennes_np = np.array(distances_quadratiques_moyennes)
distances_theoriques_np = np.array(distances_theoriques)
# Création du graphique
plt.figure(figsize=(8, 5))
plt.plot(liste_NBR_PAS_np, distances_theoriques_np, '--', label='Théorie')
plt.plot(liste_NBR_PAS_np, distances_quadratiques_moyennes_np, 'o', label='Simulation', markeredgewidth=2, markersize=2)
plt.xscale('log')
plt.yscale('log')
plt.xlabel('Nombre de pas (Ă©chelle logarithmique)', fontsize=14)
plt.ylabel('Distance quadratique moyenne $\\langle x^2 \\rangle$', fontsize=14)
plt.title('$\\langle x^2 \\rangle$ = f(nombre de pas) (Python Simple)', fontsize=15)
plt.legend()
plt.grid(True, which="both", ls="--")
plt.figtext(0.70, 0.015, 'www.sciences-physiques.net', fontsize=6, color='black', alpha=0.9, fontweight='normal')
plt.show()
Conclusion#
La distance quadratique moyenne parcourue par lâivrogne est proportionnelle Ă \(\sqrt{\Delta t}\), ce qui signifie que la zone explorĂ©e sâĂ©tend de plus en plus lentement avec le temps. Ce rĂ©sultat est fondamental pour comprendre les phĂ©nomĂšnes de diffusion et de transport dans divers domaines scientifiques. Il illustre comment une succession de dĂ©placements alĂ©atoires conduit Ă une dispersion des positions qui suit une loi gaussienne. Le fait que la largeur de la distribution augmente comme \(\sqrt{\Delta t}\) est une caractĂ©ristique clĂ© des processus diffusifs, tels que la diffusion des particules en physique ou la propagation des erreurs en statistiques.
Annexes#
Mathématiques#
Intégrale \(I\)#
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 (\(u=r^2\)) :
La racine carrĂ©e donne le rĂ©sultat de lâintĂ©grale :
Intégrale \(J\)#
Or lâintĂ©grale \(J\) est lâopposĂ©e de la dĂ©rivĂ©e de \(I\) par rapport Ă \(\alpha\), câest Ă dire :
Compléments sur la Gaussienne#
Une distribution gaussienne classique a la forme :
lâespĂ©rance \(\langle x \rangle = \mu\) et la variance \(\sigma^2\) sont donnĂ©es par :
Dans le cas de cet article, la gaussienne est centrée en 0 (\(\mu = 0\)), donc :
Formule de Stirling#
Lâapproximation de Stirling est une formule qui donne une estimation de la factorielle dâun grand nombre \(N\). Elle est extrĂȘmement utile en mathĂ©matiques et en physique, notamment en probabilitĂ©s et en statistiques. Lâapproximation est donnĂ©e par :
La factorielle dâun entier naturel \(N\) est dĂ©fini comme le produit de tous les entiers de \(1\) Ă \(N\) :
Pour des valeurs de \(N\) grandes, calculer \(N!\) directement devient rapidement impraticable en raison de la taille énorme des nombres impliqués.
Logarithme du factorielle Pour faciliter les manipulations mathĂ©matiques, il est souvent utile de travailler avec le logarithme de la factorielle plutĂŽt que la factorielle elle-mĂȘme. En prenant le logarithme naturel de \(N!\), nous obtenons :
Cette somme peut ĂȘtre difficile Ă calculer directement, mais pour de grandes valeurs de \(N\), nous pouvons lâapprocher en utilisant une intĂ©grale. LâidĂ©e est dâapproximer la somme discrĂšte par une intĂ©grale continue. En effet, pour une fonction suffisamment rĂ©guliĂšre, la somme des valeurs de la fonction en des points discrets peut ĂȘtre approchĂ©e par lâintĂ©grale de cette fonction. Ainsi, nous avons :
Comme \(\ln 1 = 0\), le terme \(1 \ln 1\) disparaĂźt, et nous obtenons :
Pour de grandes valeurs de \(N\), le terme constant \(+1\) est négligeable, donc :
Ajout du terme de correction avec la formule dâEuler-Maclaurin
La formule dâEuler-Maclaurin est donnĂ©e par :
\(B_{2n}\) sont les nombres de Bernoulli
\(R_m\) est le reste aprĂšs \(m\) termes.
Pour notre approximation, nous nĂ©gligeons les termes dâordre supĂ©rieur (de plus les dĂ©rivĂ©es impaires de \(\ln x\) diminuent rapidement et les nombres de Bernoulli alternent en signe et diminuent en magnitude, nous nĂ©gligeons donc ces termes pour \(N\) grand) et le reste \(R_m\) il ne reste que le terme moyen de correction Ă ajouter :
Revenons Ă \(N!\) en prenant lâexponentielle des deux cĂŽtĂ©s :
Méthode de Laplace pour approximation plus précise
Lâapproximation de Stirling complĂšte inclut un facteur \(\sqrt{2\pi N}\) pour amĂ©liorer la prĂ©cision, surtout pour des valeurs de \(N\) moins grandes. Pour justifier lâapparition de ce facteur, nous pouvons utiliser la mĂ©thode de Laplace.
La factorielle est liée à la fonction Gamma par :
Nous allons appliquer la méthode de Laplace à cette intégrale :
Trouver le maximum de \(f(x)\)
Le développement de Taylor de \(f(x)\) autour de \(x = N\) est :
LâintĂ©grale devient :
Remarque : Nous avons Ă©tendu les bornes dâintĂ©gration Ă \((-\infty, \infty)\) car la contribution significative provient dâune rĂ©gion Ă©troite autour de \(x = N\) pour \(N\) grand.
LâintĂ©grale est une intĂ©grale gaussienne connue :
En combinant les résultats, nous obtenons :
Comme \(I = N!\), nous obtenons lâapproximation de Stirling complĂšte :
Physique#
DĂ©monstration avec la formule de Stirling#
Pour calculer la probabilitĂ© que lâivrogne se retrouve en position \(m\) aprĂšs \(N\) pas, nous allons utiliser lâapproximation de Stirling pour simplifier le calcul du coefficient binomial lorsque \(N\) est grand.
Approximation de Stirling
Pour des grands nombres \(N\), lâapproximation de Stirling pour la factorielle est donnĂ©e par :
Calcul du logarithme de la probabilité
Substituons ces expressions dans \(\ln p(n, N)\) :
Ecriture avec les grandeurs du problĂšme
Nous pouvons Ă©crire \(n\) et \(N - n\) en fonction de \(N\) et \(m\) :
Développement limité pour \(m \ll N\)
Lorsque \(N\) est grand et \(m \ll N\), nous pouvons dĂ©velopper les logarithmes en utilisant lâapproximation de Taylor :
Voici le développement de Taylor de \(\ln(1 + x)\) au voisinage de 0 en Markdown :
Le développement de Taylor de \(\ln(1 + x)\) au voisinage de 0 est donné par :
Calculons chaque terme séparément de
Premier terme :
DeuxiĂšme terme :
TroisiĂšme terme :
Regroupement des termes :
Simplification des termes :
Les termes en \(N \ln N\) :
Les termes en \(m\) :
Les termes en \(m \ln N\) :
Les termes en \(m^2\) :
Les termes en \(m^3\) sont nĂ©gligeables pour \(m \ll N\) et peuvent ĂȘtre ignorĂ©s.
Ainsi
Probabilité
Ce résultat montre que la probabilité suit une distribution gaussienne centrée en \(m = 0\) avec une variance proportionnelle à \(N\), ce qui est conforme au théorÚme central limite pour une marche aléatoire.
Facteur de normalisation
Pour normaliser la fonction, nous utilisons lâintĂ©grale gaussienne :
Dans notre cas, \(\alpha = \dfrac{1}{2N}\), donc :
Le facteur de normalisation est donc \(\dfrac{1}{\sqrt{\pi N}}\). Ainsi, la densité de probabilité normalisée est :
La probabilitĂ© de trouver lâivrogne en position \(m\) aprĂšs \(N\) pas est donnĂ©e par :
IntĂ©rĂȘt de lâapproximation de Stirling ici
Lâutilisation de lâapproximation de Stirling est particuliĂšrement utile lorsque le nombre de pas \(N\) est grand. Elle permet de simplifier les calculs en remplaçant les factorielles par des expressions plus faciles Ă manipuler.
Dans le cas de lâivrogne :
SimplicitĂ© de calcul : Elle Ă©vite le calcul direct de factorielles de grands nombres, qui peut ĂȘtre complexe et impraticable.
Approche asymptotique : Elle fournit une approximation valable pour \(N \gg 1\), ce qui est souvent le cas dans les problĂšmes physiques et statistiques.
Lien avec la loi normale : Elle permet de montrer que la distribution binomiale tend vers une loi normale lorsque \(N\) est grand, ce qui est une manifestation du théorÚme central limite.
Code#
Version vectorisée#
# Importation des bibliothÚques nécessaires
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
# Configuration des paramĂštres de Matplotlib pour les graphiques
matplotlib.rcParams['figure.dpi'] = 150 # RĂ©solution des images
# Constantes
NBR_IVROGNES = 2000
liste_NBR_PAS = (
list(range(10, 110, 20)) +
list(range(200, 1100, 200)) +
list(range(2000, 11000, 2000)) +
list(range(20000, 110000, 20000)) +
list(range(200000, 1000000, 200000))
)
distances_quadratiques_moyennes = [] # Liste pour stocker les distances quadratiques moyennes
distances_theoriques = [] # Liste pour stocker les distances théoriques
# Simulation pour chaque nombre de pas
for NBR_PAS in liste_NBR_PAS:
# Génération de tous les pas aléatoires en une seule fois
pas = np.random.choice([-1, 1], size=(NBR_IVROGNES, NBR_PAS))
# Calcul des positions finales en sommant les pas
positions_finales = pas.sum(axis=1)
# Calcul de la distance quadratique moyenne pour ce nombre de pas
distances_quadratiques = positions_finales ** 2
distance_quadratique_moyenne = distances_quadratiques.mean()
distances_quadratiques_moyennes.append(distance_quadratique_moyenne)
# Calcul de la distance théorique
distance_theorique = NBR_PAS # Pour une marche aléatoire simple en 1D
distances_theoriques.append(distance_theorique)
# Conversion en tableaux numpy pour faciliter le tracé
liste_NBR_PAS_np = np.array(liste_NBR_PAS)
distances_quadratiques_moyennes_np = np.array(distances_quadratiques_moyennes)
distances_theoriques_np = np.array(distances_theoriques)
# Création du graphique
plt.figure(figsize=(8, 5))
plt.plot(liste_NBR_PAS_np, distances_theoriques_np, '--', label='Théorie')
plt.plot(liste_NBR_PAS_np, distances_quadratiques_moyennes_np, 'o', label='Simulation', markeredgewidth=2, markersize=2)
plt.xscale('log')
plt.yscale('log')
plt.xlabel('Nombre de pas (Ă©chelle logarithmique)')
plt.ylabel('Distance quadratique moyenne $\\langle x^2 \\rangle$')
plt.title('$\\langle x^2 \\rangle$ = f(nombre de pas) (Vectorisé)')
plt.legend()
plt.grid(True, which="both", ls="--")
plt.figtext(0.70, 0.015, 'www.sciences-physiques.net', fontsize=6, color='black', alpha=0.9, fontweight='normal')
plt.show()
Version utilisant pytorch et CUDA (de NVidia)#
# Importation des bibliothÚques nécessaires
import torch
import matplotlib
import matplotlib.pyplot as plt
# Configuration des paramĂštres de Matplotlib pour les graphiques
matplotlib.rcParams['figure.dpi'] = 150 # RĂ©solution des images
# DĂ©tection du dispositif (CPU ou GPU)
dispositif = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
print(f"Utilisation du dispositif : {dispositif}")
# Constantes
NBR_IVROGNES = 2000
liste_NBR_PAS = (
list(range(10, 110, 20)) +
list(range(200, 1100, 200)) +
list(range(2000, 11000, 2000)) +
list(range(20000, 110000, 20000)) +
list(range(200000, 1000000, 200000))
)
distances_quadratiques_moyennes = [] # Liste pour stocker les distances quadratiques moyennes
distances_theoriques = [] # Liste pour stocker les distances théoriques
# Simulation pour chaque nombre de pas
for NBR_PAS in liste_NBR_PAS:
# Génération de tous les pas aléatoires en une seule fois sur le dispositif choisi
pas = torch.randint(0, 2, (NBR_IVROGNES, NBR_PAS), device=dispositif, dtype=torch.int8) * 2 - 1
# Calcul des positions finales en sommant les pas
positions_finales = pas.sum(dim=1)
# Calcul de la distance quadratique moyenne pour ce nombre de pas
distances_quadratiques = positions_finales.float() ** 2
distance_quadratique_moyenne = distances_quadratiques.mean().item()
distances_quadratiques_moyennes.append(distance_quadratique_moyenne)
# Calcul de la distance théorique
distance_theorique = NBR_PAS # Pour une marche aléatoire simple en 1D
distances_theoriques.append(distance_theorique)
# Conversion en tensors pour faciliter le tracé
liste_NBR_PAS_tensor = torch.tensor(liste_NBR_PAS)
distances_quadratiques_moyennes_tensor = torch.tensor(distances_quadratiques_moyennes)
distances_theoriques_tensor = torch.tensor(distances_theoriques)
# Création du graphique
plt.figure(figsize=(8, 5))
plt.plot(liste_NBR_PAS_tensor.numpy(), distances_theoriques_tensor.numpy(), '--', label='Théorie')
plt.plot(liste_NBR_PAS_tensor.numpy(), distances_quadratiques_moyennes_tensor.numpy(), 'o', label='Simulation',
markeredgewidth=2, markersize=2)
plt.xscale('log')
plt.yscale('log')
plt.xlabel('Nombre de pas (Ă©chelle logarithmique)')
plt.ylabel('Distance quadratique moyenne $\\langle x^2 \\rangle$')
plt.title('$\\langle x^2 \\rangle$ = f(nombre de pas) (PyTorch)')
plt.legend()
plt.grid(True, which="both", ls="--")
plt.figtext(0.70, 0.015, 'www.sciences-physiques.net', fontsize=6, color='black', alpha=0.9, fontweight='normal')
plt.show()