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 было вычислено.
Смотрите также
Примечания
Метод, реализованный для бесконечного суммирования, связан с интегральным критерием сходимости бесконечного ряда: предполагая шаг размер 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))