Интегрирование методом Монте-Карло

Интегрирование методом Монте-Карло (Monte Carlo integration) — способ приближенного вычисления определенных интегралов при помощи моделирования методом Монте-Карло. Рассмотрим задачу вычисления площади фигуры, описываемой предикатом P(x, y) , который истинен для точек (x, y) , принадлежащих фигуре, и ложен для точек вне фигуры. Например, область, содержащаяся в круге с радиусом 3 и центром в точке (5, 7) , описывается предикатом, проверяющим (x - 5)² + (y - 7)² ≤ 3² . Чтобы оценить площадь фигуры, описываемой таким предикатом, для начала выберем прямоугольник, который содержит нашу фигуру. Например, прямоугольник с углами (2, 4) и (8, 10) , расположенными по диагонали, содержит вышеописанный круг. Нужный нам интеграл — площадь той части прямоугольника, которая лежит внутри фигуры. Мы можем оценить интеграл, случайным образом выбирая точки (x,y) , лежащие внутри прямоугольника, и проверяя для каждой точки P(x, y) , чтобы определить, лежит ли точка внутри фигуры. Если мы проверим много точек, доля тех, которые окажутся внутри области, даст нам приближенное значение отношения площадей фигуры и прямоугольника. Таким образом, домножив это значение на площадь прямоугольника, мы получим приближенное значение интеграла.

Реализуйте интегрирование методом Монте-Карло в виде процедуры estimate-integral , которая в качестве аргументов принимает предикат P , верхнюю и нижнюю границы прямоугольника x1, x2, y1 и y2 , а также число проверок, которые мы должны осуществить, чтобы оценить отношение площадей. Ваша процедура должна использовать ту же самую процедуру monte-carlo , которая выше использовалась для оценки значения π . Оцените estimate-integral при помощи π измерив площадь единичного круга.

Вам может пригодиться процедура, которая выдает число, случайно выбранное внутри данного отрезка. Нижеприведенная процедура random-in-range решает эту задачу, используя процедуру random , введенную в разделе 1.2.6 , которая возвращает неотрицательное число меньше своего аргумента.

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

Комментарии отсутствуют.

Необходима авторизация

Вы должны авторизоваться для создания комментария.

Вход
(define (monte-carlo trials experiment)
  (define (iter trials-remaining trials-passed)
    (cond ((= trials-remaining 0)
           (/ trials-passed trials))
          ((experiment)
           (iter (- trials-remaining 1) (+ trials-passed 1)))
          (else
           (iter (- trials-remaining 1) trials-passed))))
  (iter trials 0))


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


(define (square x) (* x x))

(define (square-predicate? x y)
  (< (+ (square x)
        (square y))
  1.0))

(define (test-pi trials)
  (exact->inexact
  (estimate-integral square-predicate? -1.0 1.0 -1.0 1.0 trials)))


(check-equal? (floor (* 10 (test-pi 1000))) 31.0)
(check-equal? (floor (* 10 (test-pi 10000))) 31.0)