我想生成具有麦克斯韦能量(例如f(烯))或任意分布的随机变量。 可能的密度函数如下:
def f(ene):
le=3
return 2(ene/pi/le**3)*np.exp(-ene/le)
我想生成10000个样本,如
f.rvs(scale,size)
生成列表的包括密度函数在f(ene)上匹配的10000个元素
实施例: http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.maxwell.html scipy提供maxwell分布: with method:rvs(loc = 0,scale = 1,size = 1)随机变量。
print maxwell.rvs(1,10000)
将生成具有maxwell分布的10000个样本。但是scipy只提供了一些功能。现在我还有另一个不在scipy中的功能。我怎么能这样做?
答案 0 :(得分:1)
好的,我们先从发布开始。
速度的概率密度函数
PDF(v) = sqrt(2/PI)*v^2*exp(-v^2/2a^2)/a^3
考虑到E = v ^ 2/2(假设质量等于1),可以将其从速度转换为能量
PDF(E) = sqrt(2/PI)*2*E*exp(-E/a^2)/a^3
看起来不错?不,这是错的。为什么?因为PDF时间间隔给你概率,我们没有转换间隔。速度的可能性是
PDF(v) * dv
,我们必须插入Jacobian
PDF(E)*dE = sqrt(2/PI)*2*E*exp(-E/a^2)/a^3 * |dv/dE| * dE
|dv/dE| = 1/|dE/dv| = 1/v = 1 / sqrt(2*E)
一起
PDF(E) = 2*sqrt(1/PI)*sqrt(E)*exp(-E/a^2)/a^3
其中a=sqrt(k*T)
您的发布内容遗失sqrt(E)
我将如何取样。我会使用这个事实,它实际上是三个独立的1D分布的产物
PDF(vx) = 1/sqrt(2*PI)*exp(-vx^2/2a^2)
PDF(vy) = 1/sqrt(2*PI)*exp(-vy^2/2a^2)
PDF(vz) = 1/sqrt(2*PI)*exp(-vz^2/2a^2)
这意味着它们都是高斯的。如此简单的算法:高斯样本vx
,均值等于0,西格玛等于a
,样本vy
独立于同一分布,样本vz
并将它们组合在一起
v = sqrt(vx^2 + vy^2 + vz^2)
或者如果您需要采样能量
E = ( vx^2 + vy^2 + vz^2 )/ 2
答案 1 :(得分:0)
这是我能想到的最好的,但我对你在这里尝试做的事情没有信心:
import numpy as np
def f(ene):
le = 3
return 2 * (ene / np.pi / le ** 3) * np.exp(-ene / le)
def rvs(scale, size):
samples = np.random.sample((size,))
return scale * f(samples)
我得到了这个结果。显然每次都会有所不同,因为这是随机的。
In: print(rvs(100, 10))
Out: [ 1.56035154 0.85509302 0.76543496 1.36966862 0.20596924 0.0395071
1.35029318 0.69437599 0.59772671 0.56721737]