Накопительная функция распределения с гамма-функцией в Python

Я имею дело с функцией яркости Шехтера, которая выглядит следующим образом:

phi(L)dL = norm. Factor * (L/Lstar)^(a) * exp (L/Lstar) d(L/Lstar)

Скажем, L/Lstar это л.

Аналитическое решение его кумулятивной функции распределения дается гамма-функцией: N = коэффициент нормы * Гамма (a+1, l).

Это неполная гамма-функция, поскольку пределы интегрирования составляют от L до бесконечности.

Теперь я пытаюсь построить cdf в Python. Я использовал:

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.

Что я делаю неправильно? По-видимому, версия неполной гамма-функции Сципи "регуляризована", что означает, что она делится на полную гамма-функцию. Так что, если я умножу gammainc(a+1, u[I])* gamma(a+1), он все равно не будет работать.

Оси имеют логарифмическое масштабирование.

Какие-либо предложения?

Итог: мне нужно сделать гистограмму cdf функции светимости Шехтера путем случайной выборки.

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.

Другие вопросы по тегам