为什么从我的自定义分布中抽取的随机样本不遵循 pdf?

Why are the random samples drawn from my custom distribution not following the pdf?

我使用 scipy 的 rv_continuous 方法创建了自定义分发。我正在尝试创建由 β 衰变产生的电子的能量分布。鉴于其 pdf:

我摘自:http://hyperphysics.phy-astr.gsu.edu/hbase/Nuclear/beta2.html#c1

我定义我的分布:

import numpy as np
from scipy.stats import rv_continuous 
import matplotlib.pyplot as plt 

class beta_decay(rv_continuous):
    def _pdf(self, x):
        return (22.48949986*np.sqrt(x**2 + 2*x*0.511)*((0.6-x)**2)*(x+0.511))

# create distribution from 0 --> Q value = 0.6 
beta = beta_decay(a=0, b= 0.6)

# plot pdf 
x = np.linspace(0,0.6)
plt.plot(x, beta.pdf(x))
plt.show()

# random sample the distribution and plot histogram 
random = beta.rvs(size =100)
plt.hist(random)
plt.show()

其中 x = KE, Q = 0.6, C = 22.48...(通过在 0 --> Q 和设置等于 1 之间对上面的表达式进行积分得到归一化),我忽略了费米函数 F( Z',KEe) 上式.

当我绘制 pdf 图表时,它看起来是正确的:

但是,当我尝试使用 .rvs() 从中抽取随机样本时,它们所取的值在 RHS 方向达到了巨大的峰值,而不是像我预期的那样低于 pdf 的峰值:

最终,我的代码需要对分布进行采样以获得 β 衰变释放的电子的 KE。为什么我的直方图如此错误?

我认为您的 PDF 定义有误,未规范化。在我对其进行归一化并制作适当的直方图后,它似乎工作正常

代码(Win10 x64,Anaconda Python 3.7)

#%%
import numpy as np
import matplotlib.pyplot as plt
import scipy.integrate as integrate

from scipy.stats import rv_continuous

def bd(x):
    return (22.48949986*np.sqrt(x**2 + 2*x*0.511)*((0.6-x)**2)*(x+0.511))

a = 0.0
b = 0.6

norm = integrate.quad(bd, a, b) # normalization integral
print(norm)

class beta_decay(rv_continuous):
    def _pdf(self, x):
        return bd(x)/norm[0]

# create Q distribution in the [0...0.6] interval
beta = beta_decay(a = a, b = b)

# plot pdf
x = np.linspace(a, b)
plt.plot(x, beta.pdf(x))
plt.show()

# sample from pdf
r = beta.rvs(size = 10000)
plt.hist(r, range=(a, b), density=True)
plt.show()

和地块

采样