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 | ||
teaching:exos:simulations_random_walks_codes [2013/11/13 16:57] – L villersd | teaching:exos:simulations_random_walks_codes [2018/11/05 12:09] (Version actuelle) – [Avec analyse de la distribution :] 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 |
- | # | + | |
# | # | ||
+ | # -*- 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 ===== | ||
- | <sxh python; title : 04_tkinter_many_moves.py> | + | <code python 04_tkinter_many_moves.py> |
# | # | ||
# -*- coding: utf-8 -*- | # -*- coding: utf-8 -*- | ||
- | from Tkinter | + | from tkinter |
import time | import time | ||
+ | from random import * | ||
window = Tk() | window = Tk() | ||
- | sizex=400 | + | sizex = 400 |
- | sizey=600 | + | sizey = 600 |
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 = 16 # ball diameter |
- | depx=2 | + | depx = 2 # displacement at each move in x direction |
- | depy=0 | + | depy = 0 # displacement at each move in y direction |
# create balls: | # create balls: | ||
- | no_particles= 20 | + | no_particles = 20 |
- | dy = (sizey-2.)/ | + | dy = (sizey-2.*y)/ |
- | print dy | + | print(dy) |
- | ball_list=[] | + | ball_list = [] |
for i in range(no_particles): | for i in range(no_particles): | ||
- | ball=canvas.create_oval(x, | + | ball = canvas.create_oval(x, |
y = y+dy | y = y+dy | ||
ball_list.append(ball) | ball_list.append(ball) | ||
#moves | #moves | ||
- | no_moves=100 | + | no_moves = 100 |
for j in range(no_moves): | for j in range(no_moves): | ||
for ball in ball_list: | for ball in ball_list: | ||
- | canvas.move(ball, | + | |
+ | # | ||
canvas.after(10) | canvas.after(10) | ||
canvas.update() | canvas.update() | ||
Ligne 146: | Ligne 151: | ||
time.sleep(5) # on attend quelques secondes | time.sleep(5) # on attend quelques secondes | ||
window.destroy() | window.destroy() | ||
- | </sxh> | + | </code> |
+ | ===== Marche aléatoire d'un petit nombre de pas ===== | ||
+ | |||
+ | <code python 05_tkinter_random_walk_few_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 = 200 | ||
+ | sizey = 600 | ||
+ | canvas = Canvas(window, | ||
+ | canvas.pack() | ||
+ | x = 100 # initial left-most edge of first ball | ||
+ | y = 1 # initial top-most edge of first ball | ||
+ | r = 4 # ball diameter | ||
+ | depx = 10 # displacement at each move in x direction | ||
+ | depy = 0 | ||
+ | |||
+ | # create balls: | ||
+ | no_particles = 6400 | ||
+ | dy = (sizey-2.*y)/ | ||
+ | print(dy) | ||
+ | ball_list = [] | ||
+ | for i in range(no_particles): | ||
+ | ball = canvas.create_oval(x, | ||
+ | y = y+dy | ||
+ | ball_list.append(ball) | ||
+ | |||
+ | # | ||
+ | no_moves = 6 # number of moves | ||
+ | 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(((no_moves+1.)/ | ||
+ | # le facteur (no_moves+1.)/ | ||
+ | xh = np.array(xpos) | ||
+ | # | ||
+ | |||
+ | fig = plt.figure() | ||
+ | ax = fig.add_subplot(111) | ||
+ | n, bins, patches = ax.hist(xh, (no_moves)+1, | ||
+ | print(n, | ||
+ | |||
+ | plt.show() | ||
+ | |||
+ | # | ||
+ | |||
+ | </ | ||
+ | |||
+ | ===== Marche aléatoire d'un grand nombre de pas ===== | ||
+ | |||
+ | <code python 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 # displacement at each move in x direction | ||
+ | depy = 0 | ||
+ | |||
+ | # create balls: | ||
+ | no_particles = 1600 | ||
+ | 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 = 200 | ||
+ | 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, | ||
+ | # hist uses np.histogram to create ' | ||
+ | |||
+ | ax.set_xlabel(' | ||
+ | ax.set_ylabel(' | ||
+ | |||
+ | ax.grid(True) | ||
+ | |||
+ | plt.show() | ||
+ | |||
+ | # | ||
+ | |||
+ | </ | ||
+ | |||
+ | ==== Avec analyse de la distribution : ==== | ||
+ | <code python 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 # displacement at each move in x direction | ||
+ | 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 = 400 | ||
+ | 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, | ||
+ | # 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() | ||
+ | # | ||
+ | </ |