scipy.integrate.

nsum#

scipy.integrate.nsum(f, a, b, *, шаг=1, args=(), log=False, maxterms=1048576, допуски=None)[источник]#

Вычислить сходящийся конечный или бесконечный ряд.

Для конечных a и b, это вычисляет:

f(a + np.arange(n)*step).sum()

где n = int((b - a) / step) + 1, где f является гладкой, положительной и унимодальной. Количество членов в сумме может быть очень большим или бесконечным, в этом случае частичная сумма вычисляется напрямую, а остаток аппроксимируется с помощью интегрирования.

Параметры:
fcallable

Функция, вычисляющая суммируемые члены. Сигнатура должна быть:

f(x: ndarray, *args) -> ndarray

где каждый элемент x является конечным вещественным числом и args является кортежем, который может содержать произвольное количество массивов, совместимых с x.

f должна быть поэлементной функцией: каждый элемент f(x)[i] должно равняться f(x[i]) для всех индексов i. Он не должен изменять массив x или массивы в args, и он должен возвращать NaN там, где аргумент NaN.

f должен представлять гладкую, положительную, унимодальную функцию от x определено в все вещественные числа между a и b.

a, bfloat array_like

Вещественные нижние и верхние пределы суммируемых членов. Должны быть транслируемы. Каждый элемент a должно быть меньше соответствующего элемента в b.

шагfloat array_like

Конечный, положительный, вещественный шаг между суммируемыми членами. Должен быть совместим с a и b. Обратите внимание, что количество членов, включенных в сумму, будет floor((b - a) / step) + 1; скорректировать b соответственно, чтобы обеспечить что f(b) включено, если предполагалось.

argsкортеж из array_like, необязательно

Дополнительные позиционные аргументы для передачи в f. Должны быть массивы совместимые по трансляции с a, b, и шаг. Если вызываемая функция для суммирования требует аргументов, которые не транслируются с a, b, и шаг, обернуть этот вызываемый объект с f такой, что f принимает только x и совместимы с трансляцией *args. См. Примеры.

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

Установка в True указывает, что f возвращает логарифм членов и что atol и rtol выражаются как логарифмы абсолютной и относительной ошибок. В этом случае объект результата будет содержать логарифм суммы и ошибки. Это полезно для слагаемых, для которых численное исчезновение порядка или переполнение привело бы к неточностям.

maxtermsint, по умолчанию: 2**20

Максимальное количество членов для оценки при прямом суммировании. Дополнительные вычисления функции могут быть выполнены для проверки входных данных и оценки интеграла.

atol, rtolfloat, опционально

Абсолютный допуск завершения (по умолчанию: 0) и относительный допуск завершения (по умолчанию: eps**0.5, где eps является точностью результирующего типа данных), соответственно. Должны быть неотрицательными и конечными, если log равно False и должно быть выражено как логарифм неотрицательного и конечного числа, если log равно True.

Возвращает:
res_RichResult

Объект, похожий на экземпляр scipy.optimize.OptimizeResult со следующими атрибутами. (Описания написаны так, как будто значения будут скалярами; однако, если f возвращает массив, выходные данные будут массивами той же формы.)

successbool

True когда алгоритм успешно завершился (статус 0); False в противном случае.

statusцелочисленный массив

Целое число, представляющее статус завершения алгоритма.

  • 0 : Алгоритм сошелся к заданным допускам.

  • -1 : Элемент(ы) a, b, или шаг недействительны

  • -2 : Численное интегрирование достигло предела итераций; сумма может быть расходящейся.

  • -3 : Встречено неконечное значение.

  • -4 : ENH: stats: Реализованы _ppf и _logpdf для crystalball, и сделано... maxterms или ослабление допуски. В качестве альтернативы, вызываемый объект может быть не унимодальным, или пределы суммирования могут быть слишком далеки от максимума функции. Рассмотрите увеличение maxterms или разбивая сумму на части.

sumмассив float

Оценка суммы.

ошибкамассив float

Оценка абсолютной ошибки, предполагая, что все члены неотрицательны, функция вычисляется точно, а прямое суммирование точно до точности типа данных результата.

nfevцелочисленный массив

Количество точек, в которых f было вычислено.

Смотрите также

mpmath.nsum

Примечания

Метод, реализованный для бесконечного суммирования, связан с интегральным критерием сходимости бесконечного ряда: предполагая шаг размер 1 для простоты изложения, сумма монотонно убывающей функции ограничена

\[\int_u^\infty f(x) dx \leq \sum_{k=u}^\infty f(k) \leq \int_u^\infty f(x) dx + f(u)\]

Пусть \(a\) представлять a, \(n\) представлять maxterms, \(\epsilon_a\) представлять atol, и \(\epsilon_r\) представлять rtol. Реализация сначала вычисляет интеграл \(S_l=\int_a^\infty f(x) dx\) как нижнюю границу бесконечной суммы. Затем он ищет значение \(c > a\) такой, что \(f(c) < \epsilon_a + S_l \epsilon_r\), если он существует; в противном случае, пусть \(c = a + n\). Затем бесконечная сумма аппроксимируется как

\[\sum_{k=a}^{c-1} f(k) + \int_c^\infty f(x) dx + f(c)/2\]

и сообщенная ошибка \(f(c)/2\) плюс оценка ошибки численного интегрирования. Обратите внимание, что аппроксимации интеграла могут требовать вычисления функции в точках, кроме тех, которые появляются в сумме, поэтому f должна быть непрерывной и монотонно убывающей функцией, определённой для всех вещественных чисел в интервале интегрирования. Однако из-за природы аппроксимации интеграла форма функции между точками, которые появляются в сумме, мало влияет. Если нет естественного расширения функции на все вещественные числа, рассмотрите использование линейной интерполяции, которая легко вычисляется и сохраняет монотонность.

Описанный выше подход обобщен для неединичных шаг и конечны b который слишком велик для прямого вычисления суммы, т.е. b - a + 1 > maxterms. Он дополнительно обобщён для унимодальных функций путём прямого суммирования членов вокруг максимума. Эта стратегия может не сработать:

  • Если левый предел конечен и максимум далёк от него.

  • Если правый предел конечен и максимум далеко от него.

  • Если оба предела конечны и максимум далеко от начала координат.

В этих случаях точность может быть низкой, и nsum может возвращать код состояния 4.

Хотя вызываемый объект f должны быть неотрицательными и унимодальными, nsum может использоваться для вычисления более общих форм рядов. Например, для вычисления знакопеременного ряда передайте вызываемый объект, возвращающий разницу между парами соседних членов, и настройте шаг соответственно. См. Примеры.

Ссылки

[1]

Википедия. «Интегральный признак сходимости.» https://en.wikipedia.org/wiki/Integral_test_for_convergence

Примеры

Вычислить бесконечную сумму обратных величин квадратов целых чисел.

>>> import numpy as np
>>> from scipy.integrate import nsum
>>> res = nsum(lambda k: 1/k**2, 1, np.inf)
>>> ref = np.pi**2/6  # true value
>>> res.error  # estimated error
np.float64(7.448762306416137e-09)
>>> (res.sum - ref)/ref  # true error
np.float64(-1.839871898894426e-13)
>>> res.nfev  # number of points at which callable was evaluated
np.int32(8561)

Вычислить бесконечные суммы обратных величин целых чисел, возведённых в степени p, где p является массивом.

>>> from scipy import special
>>> p = np.arange(3, 10)
>>> res = nsum(lambda k, p: 1/k**p, 1, np.inf, maxterms=1e3, args=(p,))
>>> ref = special.zeta(p, 1)
>>> np.allclose(res.sum, ref)
True

Вычислите знакопеременный гармонический ряд.

>>> res = nsum(lambda x: 1/x - 1/(x+1), 1, np.inf, step=2)
>>> res.sum, res.sum - np.log(2)  # result, difference vs analytical sum
(np.float64(0.6931471805598691), np.float64(-7.616129948928574e-14))