Monte Carlo integration for finding pi with a certain accuracy in FORTRAN

I take a course in numerical methods, and I was asked to implement the famous Monte Carlo algorithm to find pi, which you can find here .

I had no difficulty writing code with an arbitrary number of tests:

REAL(8) FUNCTION distance(xvalue, yvalue) RESULT(dist)
IMPLICIT NONE
REAL(8), INTENT(in) :: xvalue, yvalue
dist = SQRT(xvalue**2 + yvalue**2)
END FUNCTION distance 

PROGRAM ass2
  IMPLICIT NONE

  INTEGER, DIMENSION(1) :: SEED
  REAL(8) :: p, x, y

  REAL(8), EXTERNAL :: distance

  REAL(8) :: pi_last, pi
  INTEGER :: npc, npt, i

  npc = 0
  npt = 0
  pi = 1.0

  SEED(1) = 12345
  CALL RANDOM_SEED

  DO i=1, 1000000000

     CALL RANDOM_NUMBER(p)
     x = p
     CALL RANDOM_NUMBER(p)
     y = p

     npt = npt + 1

     IF (distance(x, y) < 1.0)  THEN
          npc = npc + 1
     END IF

     pi_last = pi
     pi = 4.0*(npc*1.0)/(npt*1.0)

  END DO

  PRINT*, 'Pi:', pi

END PROGRAM ass2

I noticed that it converges approximately like sqrt (N steps). Now I need to stop the algorithm with a certain precision, so I created an infinite DO loop with EXIT inside the IF statement:

    REAL(8) FUNCTION distance(xvalue, yvalue) RESULT(dist)
IMPLICIT NONE
REAL(8), INTENT(in) :: xvalue, yvalue
dist = SQRT(xvalue**2 + yvalue**2)
END FUNCTION distance 

PROGRAM ass2
  IMPLICIT NONE

  INTEGER, DIMENSION(1) :: SEED
  REAL(8) :: p, x, y

  REAL(8), EXTERNAL :: distance

  REAL(8) :: pi_last, pi
  INTEGER :: npc, npt, i

  npc = 0
  npt = 0
  pi = 1.0

  SEED(1) = 12345
  CALL RANDOM_SEED

  DO

     CALL RANDOM_NUMBER(p)
     x = p
     CALL RANDOM_NUMBER(p)
     y = p

     npt = npt + 1

     IF (distance(x, y) < 1.0)  THEN
          npc = npc + 1
     END IF

     pi_last = pi
     pi = 4.0*(npc*1.0)/(npt*1.0)

  IF ( ABS(pi - pi_last) < 0.000001 .AND. pi - pi_last /= 0)    THEN
    EXIT
  END IF

  END DO

  PRINT*, 'Pi:', pi

END PROGRAM ass2

, pi, , . : pi, , , DO. , , , . , :

, pi ?

EDIT: , , , 10 ^ (- 1), 10 ^ (- 3) 10 ^ (- 5). , , 10 ^ (- 2) 10 ^ (- 4) pi.

+4
2

- , . () Hoeffding ( , n , ).

+4

( , ) npc B (n, & pi;/4), n npt . n * & pi;/4, & pi; pi=4*npc/npt. 0 4 , , npc 0 npt. & pi; ( c npc, P ):

< d) = P (-d < 4 * c/n - & pi; < d) = P (n * (& pi; -d)/4 < n < n * (& pi; + d)/4) =

= P (c < n * (& pi; + d)/4) - P (c < n * (& pi; -d)/4) ~ =

~ = F N (n * (& pi; + d)/4) - F N (n * (& pi; -d)/4) = 2F (d * & radic; (n/(& pi; (4- & pi;)))) - 1

F N - N (n & pi;/4; n & pi;/4 (1- & pi;/4)), , F - . , d p, n s.t. p:

(p + 1)/2)/d) ^ 2))

n pi of & pi; . p = 99%,

n ~ = 17,89/d 2,

d = 0,0001 n = 1.789E9 !

: , () , . , (x,y) . & pi; , [0,1] x [0,1]. C- rand() 31 ( , VS stdlib). , n = 31 2 , (17.89/n) = 1.97E-9 99% .

+2

Source: https://habr.com/ru/post/1611177/


All Articles