Как использовать параметр 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
получил необходимую точность.