【发布时间】:2023-07-15 00:07:01
【问题描述】:
我想使用截断的 Maxwell-Boltzmann 分布生成随机数。我知道 scipy 有内置的 Maxwell 随机变量,但它没有截断版本(我也知道截断的正态分布,这与这里无关)。我尝试使用 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 的逆没有解析形式,我需要对我绘制的每个数字进行二等分。如果有一种方便的方法可以让我从截断的 Maxwell-Boltzmann 分布中以相当快的速度生成随机数,那就太好了。
【问题讨论】:
-
参数的典型范围是多少?
-
我正在使用 v_0 = 220 km/s 和 v_esc = 550 km/s
-
这些是您用于 v_0 和 v_esc 的唯一值吗?
-
是的(至少对于我正在进行的当前模拟而言)!
标签: python random scipy montecarlo