суббота, 8 января 2011 г.

Exercise-3-05


Упражнение 3.5.
Интегрирование методом Монте-Карло (Monte Carlo integration) — способ приближенного вычисления определенных интегралов при помощи моделирования методом Монте-Карло. Рассмотрим задачу вычисления площади фигуры, описываемой предикатом P(x, y), который истинен для точек (x, y), принадлежащих фигуре, и ложен для точек вне фигуры. Например, область, содержащаяся в круге с радиусом 3 и центром в точке (5, 7), описывается предикатом, проверяющим (x5)2 +(y 7)2 32. Чтобы оценить площадь фигуры, описываемой таким предикатом, для начала выберем прямоугольник, который содержит нашу фигуру. Например, прямоугольник с углами (2, 4) и (8, 10), расположенными по диагонали, содержит вышеописанный круг. Нужный нам интеграл — площадь той части прямоугольника, которая лежит внутри фигуры. Мы можем оценить интеграл, случайным образом выбирая точки (x, y), лежащие внутри прямоугольника, и проверяя
для каждой точки P(x, y), чтобы определить, лежит ли точка внутри фигуры. Если мы проверим много точек, доля тех, которые окажутся внутри области, даст нам приближенное значение отношения площадей фигуры и прямоугольника. Таким образом, домножив это значение на площадь прямоугольника, мы получим приближенное значение интеграла. Реализуйте интегрирование методом Монте-Карло в виде процедуры estimateintegral, которая в качестве аргументов принимает предикат 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 (estimate-integral predicate x-low y-low x-high y-high trials)
  (define (some-circle x y)
    (<= (+ (square (- x 5)) (square (- y 7))) 9))
  (let ((rectangle-area (* (- x-high x-low) (- y-high y-low))))
  (* rectangle-area (monte-carlo trials
               (λ () (predicate
                   (random-in-range x-low x-high)
                   (random-in-range y-low y-high)))))))
(estimate-integral some-circle 2 4 8 10 1000000)

И нахождение ПИ

(define (calc-pi trials)
  (define (unit-circle-predivate x y)
    (<= (+ (square x) (square y)) 1))
  (let ((unit-area 4.0))
  (* unit-area (monte-carlo trials
               (λ () (unit-circle-predivate
                   (random-in-range -1 1)
                   (random-in-range -1 1)))))))
(calc-pi 10000000)

Комментариев нет:

Отправить комментарий