|
|
import numpy as np
|
|
|
import matplotlib.pyplot as plt
|
|
|
from scipy.special import factorial,binom
|
|
|
|
|
|
|
|
|
rng = np.random.default_rng()
|
|
|
|
|
|
|
|
|
print(factorial(5))
|
|
|
print(binom(7,3))
|
|
|
|
|
|
|
|
|
# k = np.array(range(10))
|
|
|
# plt.figure("La fonction x^2 sur les entiers de 1 à10")
|
|
|
# plt.plot(k, k**2, 'r')
|
|
|
# plt.show()
|
|
|
|
|
|
|
|
|
|
|
|
# Exercice 1 (Simulation d’une planche).
|
|
|
|
|
|
#? 1. On considère une bille dans la planche, à un certain étage n donné. Notons k la po-
|
|
|
#? sition actuelle de la bille (k = 0 si elle est complètement à gauche, k = n si elle est
|
|
|
#? complètement à droite). Quelles positions la bille peut-elle atteindre à l’étage suivant ?
|
|
|
|
|
|
#* la position suivante de la bille sera k - 1 ou k + 1
|
|
|
|
|
|
#? 2. On définit la variable aléatoire Y telle que
|
|
|
#? position suivante = position actuelle + Y
|
|
|
#? Quelle loi de probabilité suit la variable Y ? Trouvez comment générer en Python des
|
|
|
#? échantillons de cette loi de probabilité.
|
|
|
|
|
|
#* loi de bernoulli, n fois
|
|
|
|
|
|
# Paramètre de la loi de Bernoulli (probabilité de succès)
|
|
|
p = 0.3
|
|
|
|
|
|
# Générer un échantillon de la loi de Bernoulli
|
|
|
def bernoulli(p):
|
|
|
if np.random.randint(0,2) <= p :
|
|
|
y = 0
|
|
|
else :
|
|
|
y = 1
|
|
|
return y
|
|
|
|
|
|
|
|
|
|
|
|
print(bernoulli(0.5))
|
|
|
|
|
|
|
|
|
#? 3. Déduisez-en un moyen simple de simuler la planche de Galton. Écrivez une fonction
|
|
|
#? qui simule le passage d’une bille à travers une planche de Galton, et renvoie la position
|
|
|
#? d’arrivée de la bille. Cette fonction prend en entrée deux paramètres définissant la nature
|
|
|
#? de la planche (sa hauteur N et son paramètre gauche/droite p), et doit renvoyer un
|
|
|
#? nombre entier aléatoire entre 0 et N (position d’arrivée de la bille).
|
|
|
|
|
|
def simul_planche(N, p):
|
|
|
position = 0 # La position initiale est 0 (au sommet de la planche)
|
|
|
|
|
|
for _ in range(N):
|
|
|
position += bernoulli(p)
|
|
|
|
|
|
# Assurez-vous que la position reste dans les limites de la planche
|
|
|
position = max(0, min(N, position))
|
|
|
|
|
|
return position
|
|
|
|
|
|
# Exemple d'utilisation de la fonction
|
|
|
N = 10 # Hauteur de la planche
|
|
|
p = 0.5 # Probabilité de rebondir à gauche ==> quand équilibré
|
|
|
position_finale = simul_planche(N, p)
|
|
|
print("Position d'arrivée de la bille :", position_finale)
|
|
|
|
|
|
|
|
|
#? 4. Simulez un grand nombre de billes (par exemple 10000) passant à travers une planche de
|
|
|
#? Galton de paramètres N = 12 et p = 0.5. Stockez les 10000 positions d’arrivée obtenues.
|
|
|
|
|
|
# Nombre de billes à simuler
|
|
|
nombre_de_billes = 10000
|
|
|
|
|
|
# Liste pour stocker les positions d'arrivée
|
|
|
positions_arrivee = []
|
|
|
|
|
|
# Simulation des billes
|
|
|
for _ in range(nombre_de_billes):
|
|
|
positions_arrivee.append(simul_planche(N, p)) #.append, ajoute dans la liste
|
|
|
|
|
|
|
|
|
#? Maintenant, positions_arrivee contient les positions d'arrivée de 10 000 billes
|
|
|
#? Vous pouvez les utiliser pour effectuer des analyses ou des calculs statistiques
|
|
|
|
|
|
positions_arrivee = np.array(positions_arrivee)
|
|
|
moyenne = np.mean(positions_arrivee)
|
|
|
variance = np.var(positions_arrivee)
|
|
|
|
|
|
print("Moyenne :", moyenne)
|
|
|
print("Variance :", variance)
|
|
|
|
|
|
|
|
|
#? 5. Tracez l’histogramme des 10000 positions d’arrivée précédentes. Vous pouvez utiliser la
|
|
|
#? fonction hist de la librairie matplotlib, ou encore la fonction histplot de la
|
|
|
#? librairie seaborn.
|
|
|
#? Question en passant : avec une planche de Galton réelle, et de vraies billes, comment
|
|
|
#? pourrait-on obtenir concrètement cet histogramme ?
|
|
|
|
|
|
# Tracer l'histogramme
|
|
|
plt.hist(positions_arrivee, bins=range(N+2), align='left', alpha=0.75, rwidth=0.8)
|
|
|
plt.xticks(range(N+1))
|
|
|
plt.xlabel('Position d\'arrivée')
|
|
|
plt.ylabel('Fréquence')
|
|
|
plt.title(f'Histogramme des positions d\'arrivée pour {nombre_de_billes} billes')
|
|
|
plt.grid(axis='y', alpha=0.75)
|
|
|
plt.show()
|
|
|
|
|
|
|
|
|
#? 6. Reproduisez l’expérience avec différentes autres valeurs possibles pour le paramètre p.
|
|
|
#? Quelles sont les conséquences au niveau de l’histogramme ?
|
|
|
|
|
|
N = 10 # Hauteur de la planche
|
|
|
p = 0.75 # Probabilité de rebondir à gauche ==> quand équilibré
|
|
|
position_finale = simul_planche(N, p)
|
|
|
print("Position d'arrivée de la bille :", position_finale)
|
|
|
|
|
|
positions_arrivee = []
|
|
|
|
|
|
# Simulation des billes
|
|
|
for _ in range(nombre_de_billes):
|
|
|
positions_arrivee.append(simul_planche(N, p)) #.append, ajoute dans la liste
|
|
|
|
|
|
positions_arrivee = np.array(positions_arrivee)
|
|
|
moyenne = np.mean(positions_arrivee)
|
|
|
variance = np.var(positions_arrivee)
|
|
|
|
|
|
print("Moyenne :", moyenne)
|
|
|
print("Variance :", variance)
|
|
|
|
|
|
|
|
|
# Tracer l'histogramme
|
|
|
plt.hist(positions_arrivee, bins=range(N+2), align='left', alpha=0.75, rwidth=0.8)
|
|
|
plt.xticks(range(N+1))
|
|
|
plt.xlabel('Position d\'arrivée')
|
|
|
plt.ylabel('Fréquence')
|
|
|
plt.title(f'Histogramme des positions d\'arrivée pour {nombre_de_billes} billes')
|
|
|
plt.grid(axis='y', alpha=0.75)
|
|
|
plt.show()
|
|
|
|
|
|
# Exercice 2
|
|
|
from numpy.ma.core import choose
|
|
|
# Exercice 2
|
|
|
# 1) étant doné que l'expérience est répété plusieur fois c'est une lois binomiale
|
|
|
# 2) P(X =k) = (n|k).p^k.(1-p)^n-k
|
|
|
|
|
|
galton3=nr.binomial(12, 0.3, 1000)
|
|
|
plt.hist(galton2,bins=12,range=(0,12),density=True)
|
|
|
plt.show()
|
|
|
def loi(N, p):
|
|
|
galton3LOI = []
|
|
|
for i in range(N+1):
|
|
|
#galton3LOI.append(binom.pmf(i, N, p))
|
|
|
|
|
|
galton3LOI.append((binom(N,i))*(p**i)*(1-p)**(N-i))
|
|
|
|
|
|
plt.plot(range(N+1), galton3LOI, 'r')
|
|
|
plt.show()
|
|
|
|
|
|
loi(12,0.5)
|
|
|
|
|
|
|
|
|
from scipy.stats import norm
|
|
|
|
|
|
# Paramètres
|
|
|
N = 1000
|
|
|
p = 0.5
|
|
|
|
|
|
positions = np.random.binomial(N, p, size=10000)
|
|
|
|
|
|
# Afficher l'histogramme
|
|
|
plt.hist(positions, bins=range(N+2), density=True, alpha=0.6, color='b', label='Histogramme de Galton')
|
|
|
|
|
|
# Superposer la distribution normale
|
|
|
mu = N * p
|
|
|
sigma = np.sqrt(N * p * (1 - p))
|
|
|
x = np.arange(0, N+1)
|
|
|
y = norm.pdf(x, mu, sigma)
|
|
|
plt.plot(x, y, 'r', label='Distribution normale')
|
|
|
plt.show()
|