teaching:exos:simulations_random_walks_codes

Simulations numériques de marches aléatoires : programmes en Python

Pour une bonne compréhension, ces programmes doivent être étudiés successivement. Il est important d'exécuter le code Python et même de tester des petites modifications.
01_random.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
"""
cf. documentation cf http://docs.python.org/library/random.html 
random number generation - génération de nombres aléatoires
functions of interest : choice, randint, seed
"""
 
from random import * 
 
facepiece = ['pile','face']
valeurpiece = [0.01,0.02,0.05,0.1,0.2,0.5,1.,2.]
 
for i in range(1):
    # choice : random choice of an element from a list
    print(choice(facepiece), choice(valeurpiece))
    # randint : return a random integer number between 2 values (including limits)
    print(randint(0,10))       # imprime un nombre aléatoire entre 0 et 10
    print(choice(range(0,11,1)))  # same function, using choice and range to create the list
 
 
# seed(ANY_DATA) : seeding of the random number generator with any (constant) data
# in order to generate reproducible random sequences.
# seed() - without data - uses internal clock value to "randomly" initiate the generator !
 
for j in range(3):
    #seed('ma chaîne personnielle')  # reproducible initialization
    seed()   # to randomly initiate the generator
    for i in range(10):
        print(randint(1000,9999))
    print(" ")
02_random_histogram.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
 
from random import *    # cf. documentation cf http://docs.python.org/library/random.html 
import numpy as np
import matplotlib.pyplot as plt     # http://matplotlib.sourceforge.net/api/pyplot_api.html#module-matplotlib.pyplot
import matplotlib.mlab as mlab    # http://matplotlib.sourceforge.net/api/mlab_api.html#module-matplotlib.mlab
 
#seed('ma chaîne personnelle')  # reproducible initialization
seed()
 
rval = []
for j in range(100000):
    rval.append(randint(0,99))   # append to the list a random (integer) number between 0 and 99
 
# print rval  # uncomment just to see the list of random numbers
 
# analysis - histogram  -  see http://matplotlib.sourceforge.net/examples/api/histogram_demo.html
# http://fr.wikipedia.org/wiki/Histogramme
xh = np.array(rval)  # see http://www.scipy.org/Cookbook/BuildingArrays  transforme une liste en un tableau numérique de Numpy
# print(xh)
 
fig = plt.figure()
ax = fig.add_subplot(111)
 
n, bins, patches = ax.hist(xh, 50, facecolor='green', alpha=0.75)
print(n)  # les nombres d'occurences par classe
print(bins)  # les classes, de largeur identique
 
# modifier le nombre de nombres générés, les nombres de classes-bins, 
 
plt.show()
03_tkinter_simple_move.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
 
from tkinter import *
import time
 
window = Tk()
sizex = 400
sizey = 200
canvas = Canvas(window, width = sizex, height = sizey)
canvas.pack()
x = 100		# initial left-most edge of first ball
y = 30		# initial top-most edge of first ball
r = 20                  # ball diameter 
depx = 2            # displacement at each move in x direction
depy = 1            # displacement at each move in y direction
 
ball=canvas.create_oval(x,y,x+r,y+r,fill="blue")
 
#moves
no_moves = 140
for j in range(no_moves):
    canvas.move(ball, depx, depy)
    canvas.after(20)         # time delay in milliseconds
    canvas.update()
 
time.sleep(5) # on attend quelques secondes
window.destroy()
04_tkinter_many_moves.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
 
from tkinter import *
import time
from random import * 
 
window = Tk()
sizex = 400
sizey = 600
canvas = Canvas(window, width = sizex, height = sizey)
canvas.pack()
x = 100		# initial left-most edge of first ball
y = 30		# initial top-most edge of first ball
r = 16                  # ball diameter 
depx = 2            # displacement at each move in x direction
depy = 0            # displacement at each move in y direction
 
# create balls:
no_particles = 20
dy = (sizey-2.*y)/(no_particles+1)       # y initial separation between balls
print(dy)
ball_list = []
for i in range(no_particles):
    ball = canvas.create_oval(x,y,x+r,y+r,fill="blue")
    y = y+dy
    ball_list.append(ball)
 
#moves
no_moves = 100
for j in range(no_moves):
    for ball in ball_list:
        canvas.move(ball, depx, choice([-2, 2]) )
#        canvas.move(ball, depx, depy)
    canvas.after(10)
    canvas.update()
 
time.sleep(5) # on attend quelques secondes
window.destroy()
05_tkinter_random_walk_few_steps_1D.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
 
from tkinter import *
from random import choice     # http://docs.python.org/library/random.html
import numpy as np
import matplotlib.pyplot as plt     # http://matplotlib.sourceforge.net/api/pyplot_api.html#module-matplotlib.pyplot
import matplotlib.mlab as mlab    # http://matplotlib.sourceforge.net/api/mlab_api.html#module-matplotlib.mlab
 
window = Tk()
sizex = 200
sizey = 600
canvas = Canvas(window, width = sizex, height = sizey)
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)/(no_particles+1)        # y initial separation between balls
print(dy)
ball_list = []
for i in range(no_particles):
    ball = canvas.create_oval(x,y,x+r,y+r,fill="red")
    y = y+dy
    ball_list.append(ball)
 
#moves  
no_moves = 6  # number of moves
for j in range(no_moves):
    for ball in ball_list:
        canvas.move(ball, choice([-1,1])*depx, depy)
    canvas.after(1)
    canvas.update()
 
#analysis - histogram
# see http://matplotlib.sourceforge.net/examples/api/histogram_demo.html
xpos=[]
for ball in ball_list:
    posi = canvas.coords(ball)
    xpos.append(((no_moves+1.)/no_moves)*(posi[0]-x)/depx)
    # le facteur (no_moves+1.)/no_moves) permet de gérer la largeur des barres de l'histogramme
xh = np.array(xpos)  # see http://www.scipy.org/Cookbook/BuildingArrays
#print(xh) 
 
fig = plt.figure()
ax = fig.add_subplot(111)
n, bins, patches = ax.hist(xh, (no_moves)+1, facecolor='green', alpha=0.75)
print(n,bins, patches)
 
plt.show()
 
#window.mainloop()
06_tkinter_random_walk_many_steps_1D.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
 
from tkinter import *
from random import choice     # http://docs.python.org/library/random.html
import numpy as np
import matplotlib.pyplot as plt     # http://matplotlib.sourceforge.net/api/pyplot_api.html#module-matplotlib.pyplot
import matplotlib.mlab as mlab    # http://matplotlib.sourceforge.net/api/mlab_api.html#module-matplotlib.mlab
 
window = Tk()
sizex = 400
sizey = 400
canvas = Canvas(window, width = sizex, height = sizey)
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.)/(no_particles+1)         # y initial separation between balls
print(dy)
ball_list = []
for i in range(no_particles):
    ball = canvas.create_oval(x,y,x+r,y+r,fill="blue")
    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, choice([-1,1])*depx, depy)
    canvas.after(1)
    canvas.update()
 
#analysis - histogram
# see http://matplotlib.sourceforge.net/examples/api/histogram_demo.html
xpos = []
for ball in ball_list:
    posi = canvas.coords(ball)
    xpos.append((posi[0]-x)/depx)
xh = np.array(xpos)  # see http://www.scipy.org/Cookbook/BuildingArrays
#  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='green', alpha=0.75)
print(n,bins, patches)
# hist uses np.histogram to create 'n' and 'bins'. cf. http://docs.scipy.org/doc/numpy/reference/generated/numpy.histogram.html
 
ax.set_xlabel('X positions')
ax.set_ylabel('Occurences')
 
ax.grid(True)
 
plt.show()
 
#window.mainloop()
07_tkinter_random_walk_many_steps_1D-analysis.py
# -*- coding: utf-8 -*-
 
from tkinter import *
from random import choice     # http://docs.python.org/library/random.html
import numpy as np
import matplotlib.pyplot as plt     # http://matplotlib.sourceforge.net/api/pyplot_api.html#module-matplotlib.pyplot
import matplotlib.mlab as mlab    # http://matplotlib.sourceforge.net/api/mlab_api.html#module-matplotlib.mlab
 
window = Tk()
sizex = 400
sizey = 400
canvas = Canvas(window, width = sizex, height = sizey)
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.)/(no_particles+1)         # y initial separation between balls
#print dy
ball_list=[]
for i in range(no_particles):
    ball = canvas.create_oval(x,y,x+r,y+r,fill="blue")
    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, choice([-1,-1,-1,-1,1,1,1,1,1,1])*depx, depy) #drift
    canvas.after(1)
    canvas.update()
 
#analysis - histogram
# see http://matplotlib.sourceforge.net/examples/api/histogram_demo.html
xpos = []
for ball in ball_list:
    posi = canvas.coords(ball)
    xpos.append(posi[0]-x)
xh = np.array(xpos)  # see http://www.scipy.org/Cookbook/BuildingArrays
#  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='green', alpha=0.75)
print(mu, sigma)
print(n,bins, patches)
# hist uses np.histogram to create 'n' and 'bins'.
# 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.  To get
# everything lined up, we'll compute the bin centers
bincenters = 0.5*(bins[1:]+bins[:-1])
# add a 'best fit' line for the normal PDF
yh = (bins[1]-bins[0])*no_particles*mlab.normpdf( bincenters, mu, sigma)  # http://matplotlib.sourceforge.net/api/mlab_api.html#matplotlib.mlab.normpdf
l = ax.plot(bincenters, yh, 'r--', linewidth=1)
#print n
ax.set_xlabel('X positions')
ax.set_ylabel('Occurences')
 
ax.grid(True)
 
plt.show()
 
#window.mainloop()
Ce site web utilise des cookies pour analyser le trafic de visites. En restant sur ce site, vous acceptez le stockage de cookies sur votre ordinateur. En savoir plus
  • teaching/exos/simulations_random_walks_codes.txt
  • Dernière modification: 2018/11/05 12:09
  • de villersd