################################
#PARAMETRES POUR UTILISATION NORMALE
###################################
fen_abs=6.5
fen_ord=4.5
taille_cara=10
larg_trait=1
taille_mark=4

########################
#PARAMETRES POUR LIVRE DUNOD
##############################
fen_abs=18  #18 
fen_ord=12  #12
taille_cara=30   #30
larg_trait=4      #4
taille_mark=15    #15







import numpy as np              #bibliothèque numpy renommée np
import numpy.random as rd       #module numpy.random renommé rd
import matplotlib.pyplot as plt #module matplotlib.pyplot renommé plt


#l*=1     #libre parcours moyen
#v*=1     #vitesse quadratique moyenne
#t*=l*/v* #temps de vol ou durée entre deux sauts

def saut(x):
    return x+rd.choice([-1, 1])

def abscisse(n):
    #renvoie l'abscisse d'une particule au saut numéro n
    x=0
    for i in range(n): #i varie entre 0 inclus et n exclu
        x=saut(x)
    return x

def graphe1(n):
    t=np.arange(0, n+1)     #valeurs comprises entre 0 inclus et n+1 exclu
    X=np.zeros(n+1)         #n+1 valeurs nulles
    for i in range(1, n+1): #i varie entre 0 inclus et n+1 exclu
        X[i]=saut(X[i-1])
    plt.figure(figsize=(8, 8)) #nouvelle fenêtre graphique
    plt.plot(t, X)
    plt.title("Evolution de l'abscisse d'une particule")
    plt.xlabel("numéro du saut ou instant t")
    plt.ylabel("abscisse x")
    plt.grid()              #affichage de la grille
    plt.show()              #affiche la figure à l'écran

n=100       #nombre de sauts
graphe1(n)

def graphe2(N, n):
    plt.figure(figsize=(8, 8)) #nouvelle fenêtre graphique
    t=np.arange(0, n+1)     #valeurs comprises entre 0 inclus et n+1 exclu
    for i in range(N):      #i varie entre 0 inclus et N exclu
        X=np.zeros(n+1)     #n+1 valeurs nulles
        for j in range(1, n+1): 
            X[j]=saut(X[j-1])
        plt.plot(t, X)  
    plt.xlabel("numéro du saut ou instant t")
    plt.ylabel("abscisse x")  
    plt.title("Evolution de l'abscisse de "+str(N)+" particules ")    
    plt.grid()              #affichage de la grille
    plt.show()              #affiche la figure à l'écran
   
N=5    #nombre de particules
n=100  #nombre de sauts 
graphe2(N, n)

def repartition(N, n):
    R=np.zeros(2*n+1)   #2n+1 valeurs nulles
    for i in range(N):  #i varie entre 0 inclus et N exclu
        #pour chaque particule, on calcule l'abscisse au saut numéro n
        x=abscisse(n)
        #abscisse -n stockée à l'indice 0 dans le tableau R
        #abscisse 0 stockée à l'indice n dans le tableau R
        #abscisse +n stockée à l'indice 2n dans le tableau R
        R[x+n]=R[x+n]+1
    return R

N=2000 #nombre de particules
n=100  #nombre de sauts
R=repartition(N, n)


def graphe3(N, n):
    R=repartition(N, n)
    X=np.arange(-n, n+1)
    Y=2*N/np.sqrt(2*np.pi*n)*np.exp(-X**2/(2*n))
    plt.figure(figsize=(8, 8)) #nouvelle fenêtre graphique    
    plt.plot(X, R)
    plt.plot(X, Y, linewidth=4)
    plt.xlabel("Abscisse")
    plt.ylabel("Nombre de particules")
    plt.grid()                 #affichage de la grille
    plt.show()                 #affiche la figure à l'écran

graphe3(N, n)


N=2000 #nombre de particules
n=50   #nombre de sauts
def distquad(N, n):
    Y=np.zeros(n+1)        #tableau avec n+1 valeurs nulles
    for j in range(n+1):   #j varie entre 0 inclus et n+1 exclu
        som=0              
        for i in range(N): #i varie entre 0 inclus et N exclu
            #on réalise l'expérience pour N particules
            x=abscisse(j)  #abscisse d'une particule au saut numéro j
            som=som+x**2
        Y[j]=som/N         #moyenne des x**2 au saut numéro j 
    return Y
       

#######################################
#calcul de a en utilisant les tableaux
#######################################           
t=np.arange(0, n+1) #valeurs comprises entre 0 inclus et n+1 exclu
Y=distquad(N, n)
a=np.sum(t*Y)/np.sum(t**2) #calcul de a en utilisant les calculs sur les tableaux
print("Coefficient directeur =", a)
tfit = np.linspace(0, n, 2)#tableau de deux points
yfit=a*tfit         #tableau de deux points

plt.figure()        #nouvelle fenêtre graphique
plt.xlabel('instant t')
plt.ylabel('$L^2$')
plt.title('$L^2$ en fonction du temps')
plt.plot(tfit, yfit, color='r',linewidth=4)
plt.plot(t, Y, 'o', color='blue')
plt.grid()          #affiche la grille
plt.show()          #affiche la figure à l'écran



