Я хотел бы генерировать случайные числа, используя усеченное распределение Максвелла-Больцмана. Я знаю, что 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 не имеет аналитической формы, и мне нужно будет делать деление пополам для каждого числа, которое я рисую. Было бы здорово, если бы был удобный для меня способ генерировать случайные числа из усеченного распределения Максвелла-Больцмана с приличной скоростью.