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

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

    # voxman90
    1 год назад

    А это точно квадрат?)

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

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

Вход