scipy.integrate.

qmc_quad#

scipy.integrate.qmc_quad(функция, a, b, *, n_estimates=8, n_points=1024, qrng=None, log=False)[источник]#

Вычисление интеграла в N-мерном пространстве с использованием квадратуры квази-Монте-Карло.

Параметры:
функцияcallable

Подынтегральная функция. Должна принимать один аргумент x, массив, который указывает точку(и), в которой(ых) следует оценить скалярный интегранд, и возвращает значение(я) интегранда. Для эффективности функция должна быть векторизована для принятия массива формы (d, n_points), где d — это количество переменных (т.е. размерность области определения функции), а n_points это количество точек квадратуры, и возвращает массив формы (n_points,), подынтегральная функция в каждой точке квадратуры.

a, barray-like

Одномерные массивы, задающие нижний и верхний пределы интегрирования для каждого из d переменные.

n_estimates, n_pointsint, необязательный

n_estimates (по умолчанию: 8) статистически независимых выборок QMC, каждая из n_points (по умолчанию: 1024) точек, будет сгенерировано с помощью qrng. Общее количество точек, в которых подынтегральная функция функция будет вычислено в n_points * n_estimates. Подробности см. в примечаниях.

qrngQMCEngine, опционально

Экземпляр QMCEngine, из которого нужно сэмплировать QMC точки. QMCEngine должен быть инициализирован для определенного числа измерений d соответствует количеству переменных x1, ..., xd передано в функция. Предоставленный QMCEngine используется для получения первой оценки интеграла. Если n_estimates больше единицы, дополнительные QMCEngines создаются из первого (с включенным скремблированием, если это опция). Если QMCEngine не предоставлен, используется стандартный scipy.stats.qmc.Halton будет инициализирован с количеством измерений, определённым из длины a.

logboolean, по умолчанию: False

Когда установлено значение True, функция возвращает логарифм подынтегрального выражения, а объект результата содержит логарифм интеграла.

Возвращает:
результатobject

Объект результата с атрибутами:

интегралfloat

Оценка интеграла.

standard_error :

Оценка ошибки. См. Примечания для интерпретации.

Примечания

Значения подынтегральной функции в каждой из n_points точки выборки QMC используются для получения оценки интеграла. Эта оценка извлекается из популяции возможных оценок интеграла, значение которой мы получаем зависит от конкретных точек, в которых интеграл был вычислен. Мы выполняем этот процесс n_estimates раз, каждый раз вычисляя подынтегральную функцию в различных скремблированных точках QMC, фактически извлекая независимые одинаково распределённые случайные выборки из популяции оценок интеграла. Выборочное среднее \(m\) этих оценок интеграла является несмещенной оценкой истинного значения интеграла, а стандартная ошибка среднего \(s\) этих оценок может быть использовано для построения доверительных интервалов с использованием t-распределения с n_estimates - 1 степеней свободы. Возможно, контринтуитивно, увеличение n_points при сохранении общего количества точек оценки функции n_points * n_estimates Фиксированное значение обычно уменьшает фактическую ошибку, тогда как увеличение n_estimates имеет тенденцию уменьшать оценку ошибки.

Примеры

Квадратура QMC особенно полезна для вычисления интегралов в многомерных пространствах. Пример подынтегральной функции — функция плотности вероятности многомерного нормального распределения.

>>> import numpy as np
>>> from scipy import stats
>>> dim = 8
>>> mean = np.zeros(dim)
>>> cov = np.eye(dim)
>>> def func(x):
...     # `multivariate_normal` expects the _last_ axis to correspond with
...     # the dimensionality of the space, so `x` must be transposed
...     return stats.multivariate_normal.pdf(x.T, mean, cov)

Для вычисления интеграла по единичному гиперкубу:

>>> from scipy.integrate import qmc_quad
>>> a = np.zeros(dim)
>>> b = np.ones(dim)
>>> rng = np.random.default_rng()
>>> qrng = stats.qmc.Halton(d=dim, seed=rng)
>>> n_estimates = 8
>>> res = qmc_quad(func, a, b, n_estimates=n_estimates, qrng=qrng)
>>> res.integral, res.standard_error
(0.00018429555666024108, 1.0389431116001344e-07)

Двусторонний 99% доверительный интервал для интеграла может быть оценён как:

>>> t = stats.t(df=n_estimates-1, loc=res.integral,
...             scale=res.standard_error)
>>> t.interval(0.99)
(0.0001839319802536469, 0.00018465913306683527)

Действительно, значение, сообщаемое scipy.stats.multivariate_normal находится в этом диапазоне.

>>> stats.multivariate_normal.cdf(b, mean, cov, lower_limit=a)
0.00018430867675187443