# CAPACITE 1 : MARCHE AU HASARD A DEUX DIMENSIONS ################################################################################ # Cellule 1 : Importation des bibliothèques et initialisation des données # N particules sont placées à l'origine O à t = 0. # La diffusion est modélisée par une marche au hasard avec un libre parcours moyen l et une durée tau entre chaque pas. # A chaque nouveau pas, la particule k part dans une direction aléatoire d'angle theta par rapport à l'axe Ox et se déplace de l. # Toutes les valeurs de theta sur [0,2pi] sont équiprobables import numpy as np import matplotlib.pyplot as plt import random import time N = 1000 # Nombre de particules l = 0.75 # Libre parcours moyen tau = 1 # Durée entre deux collisions (durée d'un pas) P = 1000 # Nombre de pas X = np.zeros(N) # Tableau des N abscisses initiales nulles Y = np.zeros(N) # Tableau des N ordonnées initiales nulles r = np.zeros(N) # Tableau des N distances au centre r= sqrt(X²+Y²) initiales nulles # Après chaque pas, on calcule la distance quadratique moyenne au centre O : rqm = sqrt() (< > moyenne sur les N particules) # rqm va mesurer la distance caractéristique L de la diffusion des particules. # A l'instant t, la théorie de la marche au hasard à deux dimensions montre que rqm = sqrt(4Dt) où D est le coefficent de # diffusion donné par D = l²/4tau . # Donc : L² = rqm² = 4Dt = l²t/tau # On se propose de vérifier cette loi et d'en déduire D. Xmoy = np.zeros(P+1) # Initialisation du tableau des P+1 abscisses moyennes (1 valeur initiale et P valeurs après chaque pas) Ymoy = np.zeros(P+1) # Initialisation du tableau des P+1 ordonnées moyennes (1 valeur initiale et P valeurs après chaque pas) rqm = np.zeros(P+1) # Initialisation du tableau des P+1 distances quadratiques moyennes après chaque pas (1 valeur initiale et P valeurs après chaque pas) ################################################################################ # Cellule 2 : Animation de la diffusion des N particules dans le plan Oxy start = time.time() # Lancement d'un chronomètre pour mesurer le temps de calcul for i in range(1,P+1): # Pour chaque nouveau pas i (P valeurs de i allant de 1 à P) for k in range(N): # Pour chaque particule (N valeurs de k allant de 0 à N-1) theta = # Tirage aléatoire et équiprobable de theta entre 0 et 2pi A COMPLETER # Le déplacement de la particule k pendant le pas i est alors l.cos(theta) selon Ox et l.sin(theta) selon Oy X[k] = # Nouvelle abscisse de la particule A COMPLETER Y[k] = # Nouvelle ordonnée de la particule A COMPLETER r[k] = # Distance au centre r = sqrt(X²+Y²) A COMPLETER Xmoy[i] = # Moyenne des abscisses des N particules après le pas i A COMPLETER Ymoy[i] = # Moyenne des abscisses des N particules après le pas i A COMPLETER rqm[i] = # Distance quadratique moyenne au centre O des N particules après le pas i A COMPLETER plt.clf() # Effacement de l'image précédente plt.grid() plt.axis([-100,100,-100,100]) plt.xlabel('x') plt.ylabel('y') plt.plot(X,Y,'o',markersize=1) # Tracé du nuage de points après le pas i plt.pause(0.001) # Durée entre deux images plt.show() end = time.time() # Fin du chronomètre Tcalcul = end - start # Temps de calcul print('Le temps de calcul est :',Tcalcul) ################################################################################ # Cellule 3 : Histogrammes des abcisses et ordonnées des N particules après les P pas plt.subplot(1,2,1) plt.title("Histogramme de l'abscisse x") plt.xlabel('x') plt.hist(X,bins='rice') # Histogramme des abscisses après les P pas plt.subplot(1,2,2) plt.title("Histogramme de l'ordonnée y") plt.xlabel('y') plt.hist(Y,bins='rice') # Histogramme des ordonnées après les P pas plt.show() ################################################################################ # Cellule 4 : Moyennnes des abscisses et des ordonnées, distance quadratique moyenne au centre en fonction du temps, t = np.arange(0,(P+1)*tau,tau) # Tableau des temps [0,tau,2tau,3tau,....,Ptau] plt.subplot(1,3,1) plt.title("Moyenne des abscisses au cours du temps") plt.xlabel('temps') plt.ylabel('x moyen') plt.plot(t,Xmoy) plt.grid() plt.subplot(1,3,2) plt.title("Moyenne des ordonnées au cours du temps") plt.xlabel('temps') plt.ylabel('y moyen') plt.plot(t,Ymoy) plt.grid() plt.subplot(1,3,3) plt.title("Distance quadratique moyenne au cours du temps") plt.xlabel('temps') plt.ylabel('distance quadratique moyenne') plt.plot(t,rqm) plt.grid() plt.show() ################################################################################ # Cellule 5 : Vérification de la loi L² = 4Dt pour un phénomène de diffusion à deux dimensions L = rqm # Définition de la distance caractéristique L de diffusion, donc d'étalement du nuage de points plt.plot(t,L**2,'+r',markersize=1) p = # Regression linéaire de L² = f(t) A COMPLETER plt.plot(t,p[0]*t+p[1],'k--',linewidth=1,label='Modèle affine') # Tracé de la droite modèle L² = at + b plt.title('L² en fonction du temps') plt.xlabel('temps') plt.ylabel('L²') plt.legend() plt.grid() print('Le coefficient de diffusion est :',p[0]/4) D = l**2/4*tau # Valeur théorique du coefficient de diffusion print('La valeur théorique du coefficient de diffusion est :',D) plt.show() ################################################################################