我正在处理看起来像这样的 Schechter Luminosity 函数:
phi(L)dL = norm. Factor * (L/Lstar)^(a) * exp (L/Lstar) d(L/Lstar)
说,L/Lstar 是 l。
其累积分布函数的解析解由 gamma 函数给出:N = norm factor* Gamma(a+1, l)。
这是不完整的 gamma 函数,因为积分的极限是 L 到无穷大。
现在,我正在尝试在 Python 中绘制 cdf。我用了:
import scipy.special as ss
si= [ss.gammainc(a+1, l[i]) for i in a] #cdf
(其中 l[I] 是我由随机数组成的数组)
结果图总计为 1,看起来像一个 cdf。但现在我想随机化它。因此,我设置了 cdf = 随机数(由 Python 统一生成),而不是 cdf = 1。现在,如果我想绘制一个计数与 L 的直方图,通过随机采样,我需要反转 gamma 函数。
我的问题是:如何在 Python 中反转 Gamma 函数?
这就是我现在所拥有的:
u= [random.uniform(0,1) for i in a]
l= [ss.gammaincinv(a+1, u[i]) for i in a]
plt.plot(l, u, '.')
plt.show()
plt.hist(l, bins=50,rwidth= 1.5,histtype='step', lw= 0.7, normed= True, range=(-0.5, 1))
plt.show()
编译器不会抱怨,但直方图的形状是错误的。我认为 cdf 的随机采样直方图应该恢复 PDF 的形状。
我究竟做错了什么?显然,scipy 的不完全伽马函数版本是“正则化”的,这意味着它被完整的伽马函数划分。因此,如果我将 gammainc(a+1, u[I])* gamma(a+1) 相乘,它仍然不起作用。
轴是对数缩放的。
有什么建议么?
底线:我需要通过随机采样制作 Schechter 光度函数的 cdf 直方图。