Friday, May 28, 2010

Ex3.5 of SICP(monte-calo simulation)

Use monte-carlo simulation to estimate integrals of an unit cycle
inside a rectangle area.



(define (random-in-range low high)
  (let ((range (- high low)))
    (+ low (random range))))

(define (estimate-integral trials predicate lf ur)
  (* (* (- (car ur) (car lf)) (- (cadr ur) (cadr lf)))
     (monte-carlo trials cesaro-test predicate lf ur)))

(define (cesaro-test predicate lf ur)
  (let* (
 (x1 (car lf))
 (y1 (cadr lf))
 (x2 (car ur))
 (y2 (cadr ur))
 (x (random-in-range x1 x2))
 (y (random-in-range y1 y2))
 (px (car predicate))
 (py (cadr predicate)))
    (<= (+ (* (- x px) (- x px))
   (* (- y py) (- y py)))
1)))

(define (monte-carlo trials experiment predicate lf ur)
  (define (iter trials-remaining trials-passed)
    (cond ((= trials-remaining 0)
           (/ trials-passed trials))
          ((experiment predicate lf ur)
           (iter (- trials-remaining 1) (+ trials-passed 1)))
          (else
           (iter (- trials-remaining 1) trials-passed))))
  (iter trials 0))
;;;for gauche since there is no built-in random function
(define (random x)
  (modulo (sys-random) x))

No comments:

Post a Comment