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() | ||
| + | # | ||
| + | </ | ||