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