Как использовать параметр epsabs в scipy.integrate.quad в Python? - PullRequest
0 голосов
/ 21 декабря 2018

Я пытаюсь сделать мой интеграл более точным, указав параметр 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 Ответ

0 голосов
/ 21 декабря 2018

В соответствии с руководством scipy четырехугольная функция имеет аргумент 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 получили требуемую точность.

...