Modification de la formualtion intégrale (programmes 6 et 7)

Programme 6 Dans le cas de la diffusion pure, estimer la fraction des particules entrant par un côté qui sortent du carré dans un petit segment du coté opposé. On observera que l'on rencontre des difficultés de convergences lorsque le segment est de petite taille (imprécision de l'estimation malgré un nombre élevé de trajectoires simulées).

Exemple de solution (programmé en fortran) :

c---------------------------------------------------------------------
c Calcul de la fraction sortant par le côté d'en face entre y1 et y2 
c---------------------------------------------------------------------
      PROGRAM prog5
      IMPLICIT NONE
      INTEGER iseed
      COMMON/comsee/iseed
      DOUBLE PRECISION pi
      PARAMETER(pi=3.141592654)
c---------------------------------------------------------------------
      INTEGER itir,ntir
      DOUBLE PRECISION w,som_w,som_w2,moy_w,moy_w2,sig_w,sig_moy_w
      DOUBLE PRECISION cote,lambda,y1,y2
      DOUBLE PRECISION x,y,theta,L,sortie_y1y2
      DOUBLE PRECISION r,xold,yold,Lold,d,dsecx,dsecy
      DOUBLE PRECISION moy_L,sig_moy_L
      DOUBLE PRECISION frac_y1y2,sig_frac_y1y2
c---------------------------------------------------------------------
      OPEN(10,FILE='sorties.out')
      PRINT *,'germe du generateur aleatoire : '
      READ *,iseed
c---------------------------------------------------------------------

      cote=0.3
      lambda=0.01
      y1=0.1495
      y2=0.1505
      ntir=100000

      som_w=0.
      som_w2=0.
      DO itir=1,ntir

         L=0.

         x=0.
         CALL rand_uniforme(r)
         y=r*cote
         CALL rand_uniforme(r)
         theta=asin(2.*r-1.)

 1       CONTINUE
         
         xold=x
         yold=y
         Lold=L
         
         CALL rand_uniforme(r)
         d=-lambda*log(1-r)
         x=x+d*cos(theta)
         y=y+d*sin(theta)
         L=L+d

         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)
            L=Lold+d
            IF ((cos(theta).GE.0.).AND.(dsecx.LE.dsecy)
     &           .AND.(y.GE.y1).AND.(y.LE.y2)) THEN
               sortie_y1y2=1.
            ELSE
               sortie_y1y2=0.
            ENDIF
         ENDIF

         WRITE(10,*) itir,sortie_y1y2

         w=sortie_y1y2
         som_w=som_w+w
         som_w2=som_w2+w**2
      ENDDO
      moy_w=som_w/ntir
      moy_w2=som_w2/ntir
      sig_w=sqrt(moy_w2-moy_w**2)
      sig_moy_w=sig_w/sqrt(dble(ntir))

      frac_y1y2=moy_w
      sig_frac_y1y2=sig_moy_w
      PRINT *,frac_y1y2,sig_frac_y1y2
      
c---------------------------------------------------------------------
      CLOSE(10)
      STOP
      END
c---------------------------------------------------------------------

Exemple d'extension en géométrie tridimensionnelle (sous EDStar) : en cours.

Programme 7 Reprendre l'exemple précédent en utilisant un algorithme réciproque (de façon à résoudre le problème de convergence).

Exemple de solution (programmé en fortran) :

c---------------------------------------------------------------------
c Calcul de la fraction sortant par le côté d'en face entre y1 et y2
c par un algorithme réciproque
c---------------------------------------------------------------------
      PROGRAM prog6
      IMPLICIT NONE
      INTEGER iseed
      COMMON/comsee/iseed
      DOUBLE PRECISION pi
      PARAMETER(pi=3.141592654)
c---------------------------------------------------------------------
      INTEGER itir,ntir
      DOUBLE PRECISION w,som_w,som_w2,moy_w,moy_w2,sig_w,sig_moy_w
      DOUBLE PRECISION cote,lambda,y1,y2
      DOUBLE PRECISION x,y,theta,L,sortie_y1y2
      DOUBLE PRECISION r,xold,yold,Lold,d,dsecx,dsecy
      DOUBLE PRECISION moy_L,sig_moy_L
      DOUBLE PRECISION frac_y1y2,sig_frac_y1y2
c---------------------------------------------------------------------
      OPEN(10,FILE='sorties.out')
      PRINT *,'germe du generateur aleatoire : '
      READ *,iseed
c---------------------------------------------------------------------

      cote=0.3
      lambda=0.01
      y1=0.1495
      y2=0.1505
      ntir=100000

      som_w=0.
      som_w2=0.
      DO itir=1,ntir

         L=0.

         x=cote
         CALL rand_uniforme(r)
         y=y1+r*(y2-y1)
         CALL rand_uniforme(r)
         theta=asin(2.*r-1.)+pi

 1       CONTINUE
         
         xold=x
         yold=y
         Lold=L
         
         CALL rand_uniforme(r)
         d=-lambda*log(1-r)
         x=x+d*cos(theta)
         y=y+d*sin(theta)
         L=L+d

         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)
            L=Lold+d
            IF ((cos(theta).LE.0.).AND.(dsecx.LE.dsecy)) THEN
               sortie_y1y2=1.
            ELSE
               sortie_y1y2=0.
            ENDIF
         ENDIF

         WRITE(10,*) itir,sortie_y1y2

         w=(y2-y1)/cote*sortie_y1y2
         som_w=som_w+w
         som_w2=som_w2+w**2
      ENDDO
      moy_w=som_w/ntir
      moy_w2=som_w2/ntir
      sig_w=sqrt(moy_w2-moy_w**2)
      sig_moy_w=sig_w/sqrt(dble(ntir))

      frac_y1y2=moy_w
      sig_frac_y1y2=sig_moy_w
      PRINT *,frac_y1y2,sig_frac_y1y2
      
c---------------------------------------------------------------------
      CLOSE(10)
      STOP
      END
c---------------------------------------------------------------------

Exemple d'extension en géométrie tridimensionnelle (sous EDStar) : en cours.



Richard Fournier 2012-06-18