Python 为什么从我的自定义发行版中抽取的随机样本不遵循pdf格式?

Python 为什么从我的自定义发行版中抽取的随机样本不遵循pdf格式?,python,statistics,histogram,distribution,scipy.stats,Python,Statistics,Histogram,Distribution,Scipy.stats,我已经使用scipy的rv_continuous方法创建了一个自定义发行版。我试图创建一个由β衰变产生的电子的能量分布。鉴于其pdf格式: 这是我从: 我定义我的分发: 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 (

我已经使用scipy的rv_continuous方法创建了一个自定义发行版。我试图创建一个由β衰变产生的电子的能量分布。鉴于其pdf格式:

这是我从:

我定义我的分发:

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)

情节

取样


请以文本形式发布代码,而不是以截图形式发布。在我看来,您的PDF格式是错误的。仔细观察,图中曲线下的面积看起来比1小得多,你的
\u pdf
方法中的表达式将快速增长,超过x=0.6。“我忽略了上面等式中的费米函数F(Z',KEe”-你为什么这样做?@user2357112supportsMonica你好,现在以代码发布-抱歉!我将尝试添加费米函数-我的理解是它只是一个校正因子-在这一点上,我只想要一些有效的东西(即我能从中正确定义分布和样本),而不是物理精度。我只希望我的pdf定义在0->0.6之间,因为0.6是放射性衰变的最大可用能量。也许我的pdf标准化不正确。谢谢!这正是我想要的。你向我展示了一个与scipy整合的世界,我不知道它的存在:D.接受了你的答案。
#%%
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()