Outils pour utilisateurs

Outils du site


teaching:progappchim:random_walk_2d-simple

Marche aléatoire 2D simple

Dans les modèles les plus simples, on considère un polymère comme un ensemble de segments faisant entre eux un angle quelconque (freely jointed chain). Ce problème est aussi dénommé “marche aléatoire” (random walk) en mathématique ou physique. Il peut aussi rendre compte d'autres phénomènes tel que celui de la diffusion. Après simulation, vous comprendrez pourquoi on appelle “pelote statistique” la configuration d'un polymère en solution.

Le module turtle peut être utilisé pour simuler à 2 dimensions le “parcours” d'une chaîne de N segments de longueur l. L'angle doit être généré par une fonction aléatoire (“random” en anglais).

Le problème pourra aussi être traité en utilisant l'interface Tkinter et les canevas. Voici un programme de base :

#!/usr/bin/env python 
# -*- coding: utf-8 -*-

# Random walk - simulation d'une chaîne de polymère.
# Les auto-recouvrements sont possibles

from Tkinter import *
from random import randrange
from time import sleep

def simu_chain():
    can1.delete(ALL)
    long=8
    # les 4 directions sont données dans le sens trigonométrique
    direction=[[long,0],[0,long],[-long,0],[0,-long]] 
    xo,yo=250,250
    i,N=0,100
    d_interdit=d=-1  #initialisation
    while i < N:
        #print i
        while d == d_interdit:  #
            d=randrange(4)  #génère un nombre aléatoire entre 0 et 3
        xn,yn=xo+direction[d][0],yo+direction[d][1]
        can1.create_line(xo,yo,xn,yn,width=1,fill='black')
        sleep(0.050)  # attends 50 ms entre chaque segment
        can1.update_idletasks() # pour redessiner à chaque fois le canevas
        xo,yo,i=xn,yn,i+1
        d_interdit=(d+2)%4   # la direction interdite = direction opposée (% = modulo)
        d=d_interdit

# programme principal

fen1=Tk()
can1=Canvas(fen1,bg='white',height=500, width=500)
can1.grid(row=0)  # le Canvas occupera le dessus
bou1=Button(fen1,text='Quitter',command=fen1.quit)
bou1.grid(row=1,sticky=W) #ce bouton sera en dessous à gauche (West)
bou2=Button(fen1,text='Générer une chaîne',command=simu_chain)
bou2.grid(row=1,sticky=E) #ce bouton sera en dessous à droite (East)

fen1.mainloop()

fen1.destroy()

Améliorations à envisager :

  • calcul de grandeurs caractéristiques de la chaîne générée
  • statistique sur plusieurs générations
  • parcours sur réseau régulier (carré, hexagonal…)
  • self-évitement (= self avoiding random walk ou SARW)
  • simulation à 3D (géométrie du réseau, représentation)

Références

consulter éventuellement “marche aléatoire” via un moteur de recherche ou une encyclopédie libre.

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/progappchim/random_walk_2d-simple.txt · Dernière modification: 2012/11/30 13:20 par villersd