Deutsch   English   Français   

14. Simulations

 

 

TU APPRENDS ICI...

 

à simuler des expériences simples, à analyser les données simulées avec Python et à les visualiser à l’aide de graphiques en coordonnées.

 

 

EXEMPLE

 

Example 1: Simulation d’un dé
À l’aide de nombres aléatoires, tu simules le lancer d’un dé. La fonction randint(1, 6)randint(1, 6) du module random fournit des nombres aléatoires correspondant aux faces du dé (1, 2, …, 6).
Dans ce programme, 1000 lancers sont générés et les fréquences d’apparition des différentes valeurs sont enregistrées dans une liste p et représentées sous forme d’histogramme.
p = [0] * 7 crée une liste contenant 7 zéros.

Expérimente avec différentes valeurs de n. Plus n est grand, plus la distribution des fréquences devrait être régulière.

 

Programme:      

#Gp14.py
from gpanel import *
from random import randint

n = 1000
print("Anzahl Wuerfe = " + str(n))
makeGPanel(-1, 8, -2*n/100, n/4 + n/100)
drawGrid(0, 7, 0, n/4, 7, 10)
p = [0] * 7
repeat n:
    a = randint(1, 6)
    if a == 1:
        p[1] += 1
    elif a == 2:
        p[2] += 1
    elif a == 3:
        p[3] += 1
    elif a == 4:
        p[4] += 1
    elif a == 5:
        p[5] += 1
    elif a == 6:
        p[6] += 1
setColor("blue")
for i in range(1, 7):
    fillRectangle(i-0.3 , 0, i + 0.3, p[i])
Copy to clipboard


Example 2
: Temps d’attente moyen dans un jeu de dé

Tu lances un dé et tu te demandes combien de lancers sont nécessaires en moyenne pour obtenir un certain nombre, par exemple un 6.
Si l’on suppose que chaque lancer prend le même temps, il s’agit d’un problème de temps d’attente moyen.

Au lieu d’utiliser une méthode mathématique, tu simules les lancers avec des nombres aléatoires 1, 2, 3, …, 6 et tu répètes l’expérience jusqu’à ce que le nombre 6 apparaisse.
Le nombre d’essais nécessaires est stocké dans la variable k.

Tu répètes cette expérience 10 000 fois et représentes les fréquences sous forme d’histogramme. En même temps, tu calcules la somme des valeurs de k afin de déterminer le temps d’attente moyen, affiché à la fin.

 

Pour mieux comprendre la simulation, commence par expérimenter avec de petites valeurs de n (par exemple n = 5, n = 10, n = 100).

Programme:      

# Gp14a.py
from gpanel import *
from random import randint
n = 10000

def sim():
    k = 1
    r = randint(1, 6)
    while r != 6:
        r = randint(1, 6)
        k += 1
    return k

makeGPanel(-5, 55, -200, 2200)
drawGrid(0, 50, 0, 2000)
print("Waiting on a 6")
setColor("blue")
h = [0] * 51
lineWidth(5)
count = 0
repeat n:
    k = sim()
    print k
    count += k
    if k <= 50:
        h[k] += 1
        line(k, 0, k, h[k])
mean = count / n
print("Mean waiting time = " + str(mean))
Copy to clipboard

Example 3: Calcul du nombre π avec la méthode de Monte-Carlo

Il s’agit d’un exemple classique de simulation informatique.
On lance un grand nombre n de points aléatoires dans un carré de côté 1. La proportion de points situés à l’intérieur du quart de cercle correspond approximativement à sa proportion de surface.

Si hits représente le nombre de points dans le quart de cercle, alors :

hits / n = surface du quart de cercle / surface du carré

Avec GPanel, tu peux résoudre le problème graphiquement et numériquement.
Pour générer les points aléatoires, tu utilises la fonction random(), qui fournit des nombres aléatoires entre 0 et 1.

Programme:      

# Gp14b.py
from gpanel import *
from random import random

makeGPanel(-0.3, 1.3, -0.3, 1.3)
rectangle(0, 0, 1, 1)
arc(1, 0, 90)
hits = 0
n = input("Number of rain drops")
i = 0
while i < n:
   x = random()
   y = random()
   if x*x + y*y < 1:
     hits = hits + 1
     setColor("red")
   else:
     setColor("green")  
   i = i + 1
   point(x, y)
pi = 4 * hits / n
print("Result: pi = " + str(pi))
Copy to clipboard
 

  n = 30 000

  Result: PI = 3.1425

 

Example 4: Simulation d’un lancer vertical
Avec l’accélération a, la nouvelle vitesse pendant un petit intervalle de temps dt est   vnouveau= v + a * dt et la nouvelle position :xnouveau = x + v * dt. Ici, l’accélération vaut a = -g.  Le nouvel état est calculé toutes les 0,05 secondes.

Programme:      

# Gp14c.py
from gpanel import *
import time

makeGPanel(-130, 130, -170, 70)
setColor("red")
enableRepaint(False)

g = 9.81
dt= 0.05

t = 0; y = 0
v = 25 

while t < 10: 
    v = v - g * dt 
    y = y + v * dt 
    t = t + dt
    drawGrid(-100, 100, -150, 50, "gray")
    pos(0, y)  
    fillCircle(5)
    repaint()  
    time.sleep(dt)
    clear()   
Copy to clipboard
 

 

 

À RETENIR...

 

Pour les simulations, tu utilises des nombres aléatoires. La fonction random() du module random fournit des nombres aléatoires avec 12 décimales, compris entre 0 et 1. La fonction randint(a, b) fournit des nombres entiers aléatoires entre a et b (bornes incluses.

 

 

À FAIRE PAR TOI-MÊME

 

1)


Dans un jeu, on lance simultanément 3 dés.
Le joueur A gagne si au moins un 6 apparaît.
Le joueur B gagne si aucun 6 n’apparaît.
Qui a la meilleure probabilité de gagner si le jeu est répété un grand nombre de fois ?

 

2)


On se demande combien de lancers sont nécessaires en moyenne pour obtenir au moins une fois toutes les faces 1, 2, 3, 4, 5, 6.
Résous ce problème avec une simulation.
 

3)


Simule le lancer de deux pièces et représente les fréquences des événements suivants avec un histogramme :
- deux fois pile
- une fois pile et une fois face
- deux fois face
 

4)


Dans l’exemple 4, on simule un lancer vertical.
De manière analogue, on peut aussi simuler un lancer oblique. Un corps est lancé avec un angle de 45° et une vitesse initiale de 32. Représente graphiquement sa trajectoire pendant 10 secondes. Pour utiliser les fonctions sin et cos, ajoute la ligne d’importation suivante :
from math import sin, cos, pi

Tu peux utiliser l’exemple 4 comme modèle et remplacer les formules physiques par celles du lancer oblique

g = 9.81
dt = 0.05
v = 32 
alpha = pi/4

t = 0; x = 0; y = 0
vx = v * math.cos(alpha) 
vy = v * math.sin(alpha)

while t < 10: 
    vy = vy - g * dt 
    x = x + vx * dt
    y = y + vy * dt
      

Remarque :
L’angle dans les fonctions sin() et cos() doit être donné en radians.
pi / 4 correspond à un angle de 45°.
Pour convertir des degrés en radians, tu peux utiliser la fonction radians(alpha), qu’il faut également importer.