Как использовать параметр epsabs в scipy.integrate.quad в Python?

Я пытаюсь сделать мой интеграл более точным, указав параметр epsabs за scipy.integrate.quad, здесь говорят, что мы будем интегрировать функцию sin(x) / x^2 от 1e-16 до 1,0

from scipy.integrate import quad
import numpy

integrand = lambda x: numpy.sin(x) / x ** 2
integral = quad(integrand, 1e-16, 1.0)

Это дает вам

(36.760078801255595, 0.01091187908038005)

Однако если вы укажете абсолютную погрешность с помощью epsabs со следующим

from scipy.integrate import quad
import numpy

integrand = lambda x: numpy.sin(x) / x ** 2
integral = quad(integrand, 1e-16, 1.0, epsabs = 1e-4)

Результат точно такой же! Ошибка по-прежнему равна 0,0109! Я понимаю параметр epsabs неправильно? Что я должен сделать, чтобы увеличить точность интеграла?

1 ответ

Решение

Согласно скучному руководству limit аргумент для указания

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

По умолчанию значение limit 50. Вы код возврата предупреждающее сообщение

quadpack.py:364: IntegrationWarning: максимальное количество подразделений (50) было достигнуто. Если увеличение лимита не приводит к улучшению, рекомендуется проанализировать подынтегральное выражение, чтобы определить трудности. Если можно определить положение локальной сложности (особенность, разрыв), то, вероятно, выиграет от разбиения интервала и вызова интегратора на поддиапазонах. Возможно, следует использовать специальный интегратор.
warnings.warn (msg, IntegrationWarning)

Вы должны изменить limit аргумент, то есть:

from scipy.integrate import quad
import numpy

integrand = lambda x: numpy.sin(x) / x ** 2
print(quad(integrand, 1e-16, 1.0, epsabs = 1e-4, limit=100))

Выход:

(36.7600787611414, 3.635057215414274e-05)

В выводе нет предупреждающего сообщения. Количество подразделений до 100 и quad получил необходимую точность.

Другие вопросы по тегам