Интегрирование методом Монте-Карло
Интегрирование методом Монте-Карло (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))))
А это точно квадрат?)