Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente Prochaine révisionLes deux révisions suivantes | ||
teaching:exos:simulations_random_walks_codes [2013/11/14 08:19] – villersd | teaching:exos:simulations_random_walks_codes [2018/11/05 11:40] – [Représenter le déplacement d'un objet] villersd | ||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
====== Simulations numériques de marches aléatoires : programmes en Python ====== | ====== Simulations numériques de marches aléatoires : programmes en Python ====== | ||
- | Pour une bonne compréhension, | + | <note tip>Pour une bonne compréhension, |
+ | </ | ||
===== Génération de nombres aléatoires ===== | ===== Génération de nombres aléatoires ===== | ||
- | <sxh python; title : 01_random.py> | + | <code python 01_random.py> |
- | #!/usr/bin/env python | + | # |
# -*- coding: utf-8 -*- | # -*- coding: utf-8 -*- | ||
+ | """ | ||
+ | cf. documentation cf http:// | ||
+ | random number generation - génération de nombres aléatoires | ||
+ | functions of interest : choice, randint, seed | ||
+ | """ | ||
from random import * | from random import * | ||
- | # cf. documentation cf http:// | ||
- | # random number generation - génération de nombres aléatoires | ||
- | # functions of interest : choice, randint, seed | ||
- | facepiece=[' | + | facepiece = [' |
- | valeurpiece=[0.01, | + | valeurpiece = [0.01, |
- | #for i in range(1): | + | for i in range(1): |
# choice : random choice of an element from a list | # choice : random choice of an element from a list | ||
- | | + | print(choice(facepiece), |
# randint : return a random integer number between 2 values (including limits) | # randint : return a random integer number between 2 values (including limits) | ||
- | | + | print(randint(0, |
- | | + | print(choice(range(0, |
+ | | ||
# seed(ANY_DATA) : seeding of the random number generator with any (constant) data | # seed(ANY_DATA) : seeding of the random number generator with any (constant) data | ||
Ligne 32: | Ligne 35: | ||
seed() | seed() | ||
for i in range(10): | for i in range(10): | ||
- | print randint(1000, | + | print(randint(1000, |
- | print " " | + | print(" ") |
- | </sxh> | + | </code> |
===== Histogrammes de nombres aléatoires | ===== Histogrammes de nombres aléatoires | ||
- | <sxh python; title : 02_random_histogram.py> | + | <code python 02_random_histogram.py> |
# | # | ||
# -*- coding: utf-8 -*- | # -*- coding: utf-8 -*- | ||
Ligne 50: | Ligne 53: | ||
seed() | seed() | ||
- | rval=[] | + | rval = [] |
- | for j in range(10000): | + | for j in range(100000): |
rval.append(randint(0, | rval.append(randint(0, | ||
Ligne 58: | Ligne 61: | ||
# analysis - histogram | # analysis - histogram | ||
# http:// | # http:// | ||
- | xh=np.array(rval) | + | xh = np.array(rval) |
- | # print xh | + | # print(xh) |
fig = plt.figure() | fig = plt.figure() | ||
ax = fig.add_subplot(111) | ax = fig.add_subplot(111) | ||
- | n, bins, patches = ax.hist(xh, | + | n, bins, patches = ax.hist(xh, |
- | print n # les nombres d' | + | print(n) # les nombres d' |
- | print bins # les classes, de largeur identique | + | print(bins) # les classes, de largeur identique |
# modifier le nombre de nombres générés, les nombres de classes-bins, | # modifier le nombre de nombres générés, les nombres de classes-bins, | ||
plt.show() | plt.show() | ||
- | </sxh> | + | |
+ | </code> | ||
===== Représenter le déplacement d'un objet ===== | ===== Représenter le déplacement d'un objet ===== | ||
- | <sxh python; title : 03_tkinter_simple_move.py> | + | <code python 03_tkinter_simple_move.py> |
# | # | ||
# -*- coding: utf-8 -*- | # -*- coding: utf-8 -*- | ||
- | from Tkinter | + | from tkinter |
import time | import time | ||
window = Tk() | window = Tk() | ||
- | sizex=400 | + | sizex = 400 |
- | sizey=100 | + | sizey = 200 |
canvas = Canvas(window, | canvas = Canvas(window, | ||
canvas.pack() | canvas.pack() | ||
x = 100 # initial left-most edge of first ball | x = 100 # initial left-most edge of first ball | ||
y = 30 # initial top-most edge of first ball | y = 30 # initial top-most edge of first ball | ||
- | r=20 # ball diameter | + | r = 20 # ball diameter |
- | depx=2 | + | depx = 2 # displacement at each move in x direction |
- | depy=0 # displacement at each move in y direction | + | depy = 1 # displacement at each move in y direction |
ball=canvas.create_oval(x, | ball=canvas.create_oval(x, | ||
#moves | #moves | ||
- | no_moves=10 | + | no_moves = 140 |
for j in range(no_moves): | for j in range(no_moves): | ||
canvas.move(ball, | canvas.move(ball, | ||
- | canvas.after(10) # time delay in milliseconds | + | canvas.after(20) # time delay in milliseconds |
canvas.update() | canvas.update() | ||
time.sleep(5) # on attend quelques secondes | time.sleep(5) # on attend quelques secondes | ||
window.destroy() | window.destroy() | ||
- | + | </code> | |
- | </sxh> | + | |
===== Représenter le déplacement de nombreux points ===== | ===== Représenter le déplacement de nombreux points ===== | ||
Ligne 148: | Ligne 151: | ||
</ | </ | ||
- | ===== Marche aléatoire d' | + | ===== Marche aléatoire d' |
<sxh python; title : 05_tkinter_random_walk_few_steps_1D.py> | <sxh python; title : 05_tkinter_random_walk_few_steps_1D.py> | ||
- | # | + | #!/usr/bin/env python |
# -*- coding: utf-8 -*- | # -*- coding: utf-8 -*- | ||
Ligne 210: | Ligne 213: | ||
</ | </ | ||
+ | ===== Marche aléatoire d'un grand nombre de pas ===== | ||
+ | |||
+ | <sxh python; title : 06_tkinter_random_walk_many_steps_1D.py> | ||
+ | # | ||
+ | # -*- coding: utf-8 -*- | ||
+ | |||
+ | from Tkinter import * | ||
+ | from random import choice | ||
+ | import numpy as np | ||
+ | import matplotlib.pyplot as plt # http:// | ||
+ | import matplotlib.mlab as mlab # http:// | ||
+ | |||
+ | window = Tk() | ||
+ | sizex=400 | ||
+ | sizey=400 | ||
+ | canvas = Canvas(window, | ||
+ | canvas.pack() | ||
+ | x = 200 # initial left-most edge of first ball | ||
+ | y = 1 # initial top-most edge of first ball | ||
+ | r=4 # ball diameter | ||
+ | depx=1 | ||
+ | depy=0 | ||
+ | |||
+ | # create balls: | ||
+ | no_particles= 2000 | ||
+ | dy = (sizey-2.)/ | ||
+ | print dy | ||
+ | ball_list=[] | ||
+ | for i in range(no_particles): | ||
+ | ball=canvas.create_oval(x, | ||
+ | y = y+dy | ||
+ | ball_list.append(ball) | ||
+ | |||
+ | #moves | ||
+ | no_moves=1000 | ||
+ | for j in range(no_moves): | ||
+ | for ball in ball_list: | ||
+ | canvas.move(ball, | ||
+ | canvas.after(1) | ||
+ | canvas.update() | ||
+ | |||
+ | #analysis - histogram | ||
+ | # see http:// | ||
+ | xpos=[] | ||
+ | for ball in ball_list: | ||
+ | posi=canvas.coords(ball) | ||
+ | xpos.append((posi[0]-x)/ | ||
+ | xh=np.array(xpos) | ||
+ | # compute the mean mu and sigma from xh (and/or theoretical value from random walk result) | ||
+ | mu=np.mean(xh) | ||
+ | sigma=np.std(xh) | ||
+ | fig = plt.figure() | ||
+ | ax = fig.add_subplot(111) | ||
+ | # print xh | ||
+ | n, bins, patches = ax.hist(xh, 10, facecolor=' | ||
+ | print n,bins, patches | ||
+ | # hist uses np.histogram to create ' | ||
+ | |||
+ | ax.set_xlabel(' | ||
+ | ax.set_ylabel(' | ||
+ | |||
+ | ax.grid(True) | ||
+ | |||
+ | plt.show() | ||
+ | |||
+ | # | ||
+ | </ | ||
+ | |||
+ | ==== Avec analyse de la distribution : ==== | ||
+ | <sxh python; title : 07_tkinter_random_walk_many_steps_1D-analysis.py> | ||
+ | # | ||
+ | # -*- coding: utf-8 -*- | ||
+ | |||
+ | from Tkinter import * | ||
+ | from random import choice | ||
+ | import numpy as np | ||
+ | import matplotlib.pyplot as plt # http:// | ||
+ | import matplotlib.mlab as mlab # http:// | ||
+ | |||
+ | window = Tk() | ||
+ | sizex=400 | ||
+ | sizey=400 | ||
+ | canvas = Canvas(window, | ||
+ | canvas.pack() | ||
+ | x = 200 # initial left-most edge of first ball | ||
+ | y = 1 # initial top-most edge of first ball | ||
+ | r=4 # ball diameter | ||
+ | depx=1 | ||
+ | depy=0 | ||
+ | |||
+ | # create balls: | ||
+ | no_particles= 1000 | ||
+ | dy = (sizey-2.)/ | ||
+ | #print dy | ||
+ | ball_list=[] | ||
+ | for i in range(no_particles): | ||
+ | ball=canvas.create_oval(x, | ||
+ | y = y+dy | ||
+ | ball_list.append(ball) | ||
+ | |||
+ | #moves | ||
+ | no_moves=900 | ||
+ | for j in range(no_moves): | ||
+ | for ball in ball_list: | ||
+ | canvas.move(ball, | ||
+ | canvas.after(1) | ||
+ | canvas.update() | ||
+ | |||
+ | #analysis - histogram | ||
+ | # see http:// | ||
+ | xpos=[] | ||
+ | for ball in ball_list: | ||
+ | posi=canvas.coords(ball) | ||
+ | xpos.append(posi[0]-x) | ||
+ | xh=np.array(xpos) | ||
+ | # compute the mean mu and sigma from xh (and/or theoretical value from random walk result) | ||
+ | mu=np.mean(xh) | ||
+ | sigma=np.std(xh) | ||
+ | fig = plt.figure() | ||
+ | ax = fig.add_subplot(111) | ||
+ | # print xh | ||
+ | n, bins, patches = ax.hist(xh, 20, facecolor=' | ||
+ | print mu, sigma | ||
+ | print n,bins, patches | ||
+ | # hist uses np.histogram to create ' | ||
+ | # np.histogram returns the bin edges, so there will be ii probability | ||
+ | # density values in n, ii+1 bin edges in bins and ii patches. | ||
+ | # everything lined up, we'll compute the bin centers | ||
+ | bincenters = 0.5*(bins[1: | ||
+ | # add a 'best fit' line for the normal PDF | ||
+ | yh = (bins[1]-bins[0])*no_particles*mlab.normpdf( bincenters, mu, sigma) | ||
+ | l = ax.plot(bincenters, | ||
+ | #print n | ||
+ | ax.set_xlabel(' | ||
+ | ax.set_ylabel(' | ||
+ | |||
+ | ax.grid(True) | ||
+ | |||
+ | plt.show() | ||
+ | |||
+ | # | ||
+ | </ |