Почему scipy.integrate.quad терпит неудачу в течение некоторого интервала этого интеграла? - PullRequest
0 голосов
/ 03 апреля 2020

Воспроизвести :

# Use scipy to create random number for f(x) = 2x when x in [0,1] and 0, otherwise
from scipy.stats import rv_continuous
class custom_rv(rv_continuous):
    "custom distribution"
    def _pdf(self, x):
        if x >= 0.0 and x <=1.0:
            return 2*x
        else:
            return 0.0
rv = custom_rv(name='2x')
from scipy.integrate import quad
print(quad(rv._pdf, -10.0, 10.0))
print(quad(rv._pdf, -5.0, 5.0))
print(quad(rv._pdf, -np.inf, np.inf))

Вывод :

(0.0, 0.0) # for [-10,10]
(1.0, 1.1102230246251565e-15) # for [-5,5]
(1.0, 2.5284034865791227e-09) # for [-inf, inf]

Контекст :

Я пытаюсь создать случайную переменную с пользовательским pdf: f (x) = 2 * x, если x находится в [0,1], в противном случае f (x) = 0.

Этот случайный Переменная не работала, и я попытался отладить, проверив интеграл pdf, используя quad.

Я обнаружил, что интеграл не согласован. Для некоторых интервалов, таких как (-inf, inf) и (-5,5), это равно 1. Однако для интервалов, таких как (-10,10), оно равно нулю, что является довольно неожиданным.

Есть идеи, что пошло не так?

1 Ответ

3 голосов
/ 03 апреля 2020

Посмотрите документацию по четырём функциям , если вы go до самого дна прочитаете:

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

Приведенный пример:

>>> y = lambda x: 1 if x<=0 else 0
>>> integrate.quad(y, -1, 1)
(1.0, 1.1102230246251565e-14)
>>> integrate.quad(y, -1, 100)
(1.0000000002199108, 1.0189464580163188e-08)
>>> integrate.quad(y, -1, 10000)
(0.0, 0.0)

Так что идея в том, что ваша функция недостаточно «гладкая», поэтому вы можете получить удивительные результаты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...