Контекст
Я пытаюсь использовать scipy.stats.rv_continuous для создания случайной величины с «резким» pdf: f (x) = 2 * x, если x равен в [0,1], иначе f (x) = 0. Выдает ошибку, которая, как я понимаю, связана с интегралом этого pdf, оцененного с использованием scipy.integrate.quad
, не равным 1 (связан с моим вопросом, подробно описанным в this нить ).
С тех пор я понял, что для исправления интеграла можно просто указать аргумент points
для функции scipy.integrate.quad
:
баллов (последовательность чисел с плавающей точкой, целые числа), необязательно
Последовательность точек разрыва в ограниченном интервале интегрирования, где могут возникать локальные трудности подынтегрального выражения (например, особенности, разрывы). Последовательность не должна быть отсортирована. Обратите внимание, что этот параметр нельзя использовать вместе с весом.
Однако я не нашел способа указать этот тип точек останова для класса rv_continuous. Следовательно ошибка остается. Есть идеи как это исправить? Фрагмент кода и сообщение об ошибке перечислены ниже.
Код для воспроизведения ошибки
# 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')
rvs = rv.rvs(size=1)
Вывод / Ошибка
RuntimeError: Failed to converge after 100 iterations.
Код для интегрального исправления
from scipy.integrate import quad
print(quad(rv._pdf, -10.0, 10.0))
print(quad(rv._pdf, -10.0, 10.0, points = [1]))
# this following line throws an error though
# since it doesn't support infinity inputs combined with break points.
print(quad(rv._pdf, -np.inf, np.inf, points = [1]))
# Output:
(0.0, 0.0)
(1.0000000000149878, 2.3295111147512406e-09)
ValueError: Infinity inputs cannot be used with break points.