Я хотел бы генерировать случайные числа, используя усеченное распределение Максвелла-Больцмана. Я знаю, что в scipy есть встроенные случайные величины Максвелла, но его усеченной версии не существует (я также знаю об усеченном нормальном распределении, которое здесь неактуально). Я попытался написать свои собственные случайные величины, используя rvs_continuous:
import scipy.stats as st
class maxwell_boltzmann_pdf(st.rv_continuous):
def _pdf(self,x):
n_0 = np.power(np.pi,3/2)*np.square(v_0)*(v_0*erf(v_esc/v_0)-(2/np.sqrt(np.pi))*v_esc*np.exp(-np.square(v_esc/v_0)))
return (1/n_0)*(4*np.pi*np.square(x))*np.exp(-np.square(x/v_0))*np.heaviside(v_esc-x,0)
maxwell_boltzmann_cv = maxwell_boltzmann_pdf(a=0, b=v_esc, name='maxwell_boltzmann_pdf')
Это именно то, что я хочу, но это слишком медленно для моей цели (я делаю симуляции Монте-Карло), даже если я рисую все случайные скорости вне всех петель. Я также думал об использовании метода выборки с обратным преобразованием, но обратная функция CDF не имеет аналитической формы c, и мне нужно будет делить пополам для каждого числа, которое я рисую. Было бы здорово, если бы у меня был удобный способ генерировать случайные числа из усеченного распределения Максвелла-Больцмана с приличной скоростью.