次のような Schechter Luminosity 関数を扱っています。
phi(L)dL = norm. Factor * (L/Lstar)^(a) * exp (L/Lstar) d(L/Lstar)
たとえば、L/Lstar は l です。
の累積分布関数の解析解は、ガンマ関数によって与えられます: N = ノルム係数*ガンマ(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 でガンマ関数を反転するにはどうすればよいですか?
これは私が今持っているものです:
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 のヒストグラムを作成する必要があります。