通过python生成具有特定概率密度函数的随机变量

时间:2015-02-05 22:02:11

标签: python random scipy distribution

我想生成具有麦克斯韦能量(例如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中的功能。我怎么能这样做?

2 个答案:

答案 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]