cumulative_simpson#
- scipy.integrate.cumulative_simpson(y, *, x=None, dx=1.0, ось=-1, начальный=None)[источник]#
Кумулятивно интегрировать y(x) с использованием составного правила Симпсона 1/3. Интеграл отсчётов в каждой точке вычисляется, предполагая квадратичную зависимость между каждой точкой и двумя соседними точками.
- Параметры:
- yarray_like
Значения для интегрирования. Требуется хотя бы одна точка вдоль ось. Если предоставлены две или менее точек вдоль ось, интегрирование по Симпсону невозможно, и результат вычисляется с помощью
cumulative_trapezoid.- xarray_like, необязательный
Координата для интегрирования. Должна иметь ту же форму, что и y или должен быть 1D с той же длиной, что и y вдоль ось. x также должен быть строго возрастающим вдоль ось. Если x равно None (по умолчанию), интегрирование выполняется с использованием интервалов dx между последовательными элементами в y.
- dxскаляр или array_like, опционально
Расстояние между элементами yИспользуется только если x равно None. Может быть либо числом с плавающей точкой, либо массивом той же формы, что и y, но длиной один вдоль ось. По умолчанию 1.0.
- осьint, необязательный
Задает ось для интегрирования. По умолчанию -1 (последняя ось).
- начальныйскаляр или array_like, опционально
Если задано, вставьте это значение в начало возвращаемого результата и добавьте его к остальной части результата. По умолчанию None, что означает отсутствие значения в
x[0]возвращается и res имеет на один элемент меньше, чем y вдоль оси интегрирования. Может быть либо числом с плавающей точкой, либо массивом с той же формой, что и y, но длиной один вдоль ось.
- Возвращает:
- resndarray
Результат кумулятивного интегрирования y вдоль ось. Если начальный если None, форма такова, что ось интегрирования имеет на одно значение меньше, чем y. Если начальный задано, форма равна той же, что и y.
Смотрите также
numpy.cumsumcumulative_trapezoidкумулятивное интегрирование с использованием составного правила трапеций
simpsonинтегратор для дискретных данных с использованием составного правила Симпсона
Примечания
Добавлено в версии 1.12.0.
Составной метод Симпсона 1/3 может использоваться для приближённого вычисления определённого интеграла от дискретизированной входной функции \(y(x)\) [1]Метод предполагает квадратичную зависимость на интервале, содержащем любые три последовательные точки выборки.
Рассмотрим три последовательные точки: \((x_1, y_1), (x_2, y_2), (x_3, y_3)\).
Предполагая квадратичную зависимость по трём точкам, интеграл по подынтервалу между \(x_1\) и \(x_2\) задаётся формулой (8) из [2]:
\[\begin{split}\int_{x_1}^{x_2} y(x) dx\ &= \frac{x_2-x_1}{6}\left[\ \left\{3-\frac{x_2-x_1}{x_3-x_1}\right\} y_1 + \ \left\{3 + \frac{(x_2-x_1)^2}{(x_3-x_2)(x_3-x_1)} + \ \frac{x_2-x_1}{x_3-x_1}\right\} y_2\\ - \frac{(x_2-x_1)^2}{(x_3-x_2)(x_3-x_1)} y_3\right]\end{split}\]Интеграл между \(x_2\) и \(x_3\) задается путем замены вхождений \(x_1\) и \(x_3\). Интеграл оценивается отдельно для каждого подынтервала, а затем суммируется кумулятивно для получения окончательного результата.
Для равноотстоящих выборок результат является точным, если функция является полиномом третьей степени или ниже [1] и количество подынтервалов чётное. В противном случае интеграл точен для полиномов степени два или ниже.
Ссылки
[2]Cartwright, Kenneth V. Simpson’s Rule Cumulative Integration with MS Excel and Irregularly-spaced Data. Journal of Mathematical Sciences and Mathematics Education. 12 (2): 1-9
Примеры
>>> from scipy import integrate >>> import numpy as np >>> import matplotlib.pyplot as plt >>> x = np.linspace(-2, 2, num=20) >>> y = x**2 >>> y_int = integrate.cumulative_simpson(y, x=x, initial=0) >>> fig, ax = plt.subplots() >>> ax.plot(x, y_int, 'ro', x, x**3/3 - (x[0])**3/3, 'b-') >>> ax.grid() >>> plt.show()
Вывод
cumulative_simpsonаналогично итеративному вызовуsimpsonс последовательно увеличивающимися верхними пределами интегрирования, но не идентичными.>>> def cumulative_simpson_reference(y, x): ... return np.asarray([integrate.simpson(y[:i], x=x[:i]) ... for i in range(2, len(y) + 1)]) >>> >>> rng = np.random.default_rng() >>> x, y = rng.random(size=(2, 10)) >>> x.sort() >>> >>> res = integrate.cumulative_simpson(y, x=x) >>> ref = cumulative_simpson_reference(y, x) >>> equal = np.abs(res - ref) < 1e-15 >>> equal # not equal when `simpson` has even number of subintervals array([False, True, False, True, False, True, False, True, True])
Это ожидаемо: потому что
cumulative_simpsonимеет доступ к большему количеству информации, чемsimpson, обычно может давать более точные оценки исходного интеграла по подынтервалам.