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. Подробности см. в примечаниях.- qrng
QMCEngine, опционально Экземпляр 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