Programme 1 Le premier programme à pour objectif de mettre en oeuvre quelques exemples de réalisations de variables aléatoires typiques de celles rencontrées dans la Physique du transport. On cherche à simuler et visualiser une marche aléatoire de diffusion multiple sur un plan à l'intérieur d'un carré de côté . Les particules partent uniformément et de façon isotrope depuis l'un des côtés, vers l'intérieur du carré. Les particules sont suivies jusqu'à leur premier retour à la frontière. Le libre parcours de diffusion est uniforme et la fonction de phase de diffusion simple est isotrope. On fera attention à la représentation de la distribution isotrope des particules entrantes.
Remarque: Les variables aléatoires rencontrées dans ce premier exemple sont décrites ci-après:
Exemple de solution (programmé en fortran) :
c--------------------------------------------------------------------- c Une trajectoire de multi-diffusion depuis le bord gauche d'un carre c--------------------------------------------------------------------- PROGRAM prog1 IMPLICIT NONE INTEGER iseed COMMON/comsee/iseed DOUBLE PRECISION pi PARAMETER(pi=3.141592654) c--------------------------------------------------------------------- DOUBLE PRECISION cote,lambda DOUBLE PRECISION x,y,theta DOUBLE PRECISION r,xold,yold,d,dsecx,dsecy c--------------------------------------------------------------------- OPEN(10,FILE='sorties.out') PRINT *,'germe du generateur aleatoire : ' READ *,iseed c--------------------------------------------------------------------- cote=0.3 lambda=0.1 x=0. CALL rand_uniforme(r) y=r*cote CALL rand_uniforme(r) theta=asin(2.*r-1.) 1 CONTINUE xold=x yold=y WRITE(10,*) x,y CALL rand_uniforme(r) d=-lambda*log(1-r) x=x+d*cos(theta) y=y+d*sin(theta) IF ((x.GE.0).AND.(x.LE.cote).AND.(y.GE.0).AND.(y.LE.cote)) THEN CALL rand_uniforme(r) theta=r*2*pi GOTO 1 ELSE IF (cos(theta).GE.0.) THEN dsecx=(cote-xold)/cos(theta) ELSE dsecx=(0.-xold)/cos(theta) ENDIF IF (sin(theta).GE.0.) THEN dsecy=(cote-yold)/sin(theta) ELSE dsecy=(0.-yold)/sin(theta) ENDIF IF (dsecx.LE.dsecy) THEN d=dsecx ELSE d=dsecy ENDIF x=xold+d*cos(theta) y=yold+d*sin(theta) WRITE(10,*) x,y ENDIF c--------------------------------------------------------------------- CLOSE(10) STOP END c---------------------------------------------------------------------
Richard Fournier 2012-06-18