C++ и Python

Монте-Карло интегрирование (5)

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

В этом задании Вам предстоит разработать инструмент для многомерного численного интегрирования методом Монте-Карло. Метод заключается в следующем: пусть задана действительная функиця n действительных аргументов f(x1, x2, ..., xn), или кратко f(X). Интеграл функции f по n-мерной прямоугольной области Omega может быть приближен выражением

# псевдокод для интеграла Монте Карло
I = V * sum(f(X_i)) / N

Здесь V обозначает объем области интегрирования

# псевдокод для вычисления объема прямоугольной области
V = (x1_max - x1_min) * ... * (xn_max - xn_min)

Суммирование выполняется по N случайным значениям вектора X_i, i=1, ..., N. Значения аргументов должны быть распределены равномерно по области интегрирования.

Таким способом, например, можно найти площадь круга, задав функцию f в следующем виде:

def circle(x, y):
    return (1 if x**2 + y**2 < 0.5 else 0)

Интеграл этой функции по прямоугольной области [-1, 1] x [-1, 1] стремится к числу pi при увеличении N.

Результатом работы Монте-Карло интегрирования является случайная величина. Важно иметь оценку точности близости полученной величины к истинному значению. Эта оценка может быть получена следующим образом:

# псевдокод для ошибки интеграла Монте Карло
dI ~ V * sigma_N / sqrt(N)

Здесь sigma_N обозначает среднеквадратичное отклонение набора величин f(X_1), ..., f(X_N).

Для решения этой задачи необходимо написать функцию

def mcintegral(f, limits, N)

Первый аргумент f - это функция, которую необходимо проинтегрировать, второй аргумент limits является кортежем пар ((x1_max, x1_min), (x2_max, x2_min), ..., (xn_max, xn_min)), который определяет прямоугольную области интегрирования. Параметр N задает количество точек, по которым необходимо выполнить интегрирование. Функция mcintegral должна возвращать кортеж (I, dI), содержаший оценку интеграла I и оценку ошибки интегрирования dI.

Указания

  • Считайте, что функция f может принимать аргументы типа np.ndarray.

Как тестировать локально

Установить необходимые пакеты (один раз):

pip install -r requirements.txt

Запустить тесты:

pytest -vs