Неполный алгоритм гамма-функции
Существует очень краткий алгоритм для вычисления нижней неполной гамма-функции:
https://people.sc.fsu.edu/~jburkardt/f_src/asa147/asa147.html
Мы закодировали это в C++. В этом алгоритме есть одна вещь, которую я не понимаю. В одном месте вычислить следующее выражение:
он заменяется на:
Очевидно, это то же самое, но почему это делается так? Вычисление exp из lgamma более эффективно, чем вычисление функции tgamma (оба lgamma
а также tgamma
доступны в C++)?
2 ответа
Является ли вычисление exp из lgamma более эффективным, чем вычисление функции tgamma (в C++ доступны и lgamma, и tgamma)?
вычисление lgamma более эффективно, потому что это в основном поведение n*log(n). Поэтому обычно у вас есть хороший идентификатор аппроксимации, который вы пытаетесь вычислить с помощью функции lgamma(x)/x.
также имейте в виду, что lgamma
часто используется, потому что это часть выражения, которое может быть вычислено в то время как tgamma
, который растет так же быстро, как факториал, нет. Так что вычислить целое выражение безопасно f(x)
как exp (log (f (x))), и если f (x) имеет произведение tgamma
тогда log (f (x)) придется суммировать / вычитать lgamma
,
Хороший способ избежать переполнения, в основном
Вы найдете правильные реализации Gamma для C++ здесь: http://www.boost.org/doc/libs/1_64_0/libs/math/doc/html/math_toolkit/sf_gamma