我正在处理Schechter Luminosity功能,如下所示:
phi(L)dL = norm. Factor * (L/Lstar)^(a) * exp (L/Lstar) d(L/Lstar)
说,L / Lstar是l。
其累积分布函数的解析解由伽马函数给出: N =范数因子* Gamma(a + 1,l)。
这是不完整的伽玛函数,因为积分的极限是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 = 1,我设置cdf =随机数(由Python统一生成)。 现在,如果我想绘制一个计数与L的直方图,随机采样,我需要反转伽玛函数。
我的问题是:如何在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的直方图。
答案 0 :(得分:1)
首先尝试:
函数是从域到范围的映射。所以你可以这样写:
def function(x):
# ...
Domain = list(range(0, 1000)) # [0,1000)
mapping = {}
inverse_mapping = {}
for x in Domain:
y = function(x)
mapping[x] = y
inverse_mapping[y] = x
def inverse_function(y):
return inverse_mapping[y] # not a continuous function. needs improvement
如果您有这样的想法,请告诉我。 我们可以改进cdf等单调函数。