У меня есть задача, для которой мне нужно сгенерировать случайные числа из пользовательского PDF-файла. Я видел, что rv_continous
предлагает такие функции, и в принципе, как только мы определим PDF-файл, мы можем использовать метод rvs для генерации случайных чисел.
Вот код, который я написал для этой задачи:
from scipy.stats import rv_continuous
from scipy.special import gamma, gammaincc
import numpy as np
import matplotlib.pyplot as plt
def ref_exp(time, tau):
return 1.0/tau *np.exp(-time/tau) #reference for the simple case tau = 1.0 , gam = 1.0
class custom_distr_gen(rv_continuous):
def _pdf(self, x, gam, tau):
return gammaincc(gam, (gam/tau)*x)/(gamma(gam)*tau)
psi = custom_distr_gen(name='first_run', a=0)
g = 1.0
ta = 1.0
random_numbers = psi.rvs(gam = g, tau = ta, size=1000)
plt.figure(1)
time = np.linspace(0, 10, 100)
plt.plot(time, ref_exp(time, ta))
plt.hist(random_numbers, bins = 25, density = True, alpha = 0.4)
plt.xlim(0, 10)
Я провел несколько тестов, и он работал, как ожидалось. Когда я устанавливаю g = 1.0
(параметр гаммы) и ta = 1.0
(параметр тау), получается отрицательное экспоненциальное распределение. Он хорошо работал и для других значений ta
.
Но когда я пробую более высокие значения параметра g
, у меня появляется RuntimeError (например, g = 3.0
):
"RuntimeError: Failed to converge after 100 iterations."
Вы когда-нибудь сталкивались с этой проблемой? Как вы ее решили?