![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
DigammaBoost , Math Toolkit 2.5.0 , Gamma Functions
|
Microsoft Visual C++ версии 12.0 |
GNU C++ версия 5.1.0 |
GNU C++ версия 5.1.0 |
Солнечная компиляторная версия 0x5130 |
|
---|---|---|---|---|
Функция дигамма: Большие значения |
Max = 0,98ε (Mean = 0,369ε) |
Max = 0ε (Mean = 0ε) |
Max = 1,39ε (Mean = 0,413ε) |
Max = 1,39ε (Mean = 0,413ε) |
Функция дигамма: рядом с положительной корней |
Max = 0,997ε (Mean = 0,527ε) |
Max = 0,891ε (Mean = 0,0995ε) |
Max = 1,37ε (Mean = 0,477ε) |
Max = 1,31ε (Mean = 0,451ε) |
Функция дигамма: Рядом с ноль |
Max = 0,953ε (Mean = 0,337ε) |
Max = 0ε (Mean = 0ε) |
Max = 0,984ε (Mean = 0,361ε) |
Max = 0,984ε (Mean = 0,361ε) |
Функция дигамма: отрицательные значения |
Max = 214ε (Mean = 16.1ε) |
Max = 0ε (Mean = 0ε) |
Max = 180ε (Mean = 13ε) |
Max = 180ε (Mean = 13ε) |
Функция дигамма: значения около 0 |
Max = 0ε (Mean = 0ε) |
Max = 0ε (Mean = 0ε) |
Max = 1ε (Mean = 0,592ε) |
Max = 1ε (Mean = 0,592ε) |
Функция дигамма: целых аргументов |
Max = 0,992ε (Mean = 0,452ε) |
Max = 0,992ε (Mean = 0,215ε) |
Max = 0,888ε (Mean = 0,403ε) |
Max = 0,888ε (Mean = 0,403ε) |
Функция дигамма: Полное число аргументов |
Max = 0,78ε (Mean = 0,314ε) |
Max = 0ε (Mean = 0ε) |
Max = 0,906ε (Mean = 0,409ε) |
Max = 0,906ε (Mean = 0,409ε) |
Как показано выше, показатели ошибок для позитивных аргументов, как правило, очень низкие. Для отрицательных аргументов существует бесконечное количество иррациональных корней: относительные ошибки, очень близкие к ним, могут быть произвольно большими, хотя абсолютная ошибка останется очень низкой.
Существует два набора тестов: спотовые значения вычисляются с помощью онлайн-калькулятора на functions.wolfram.com, в то время как случайные тестовые значения генерируются с использованием высокоточной контрольной реализации (дифференциальная Lanczos approximation см. ниже).
Реализация подразделяется на следующие области:
Для отрицательных аргументов формула отражения:
digamma(1-x) = digamma(x) + pi/tan(pi*x);
используется для того, чтобы сделать x положительным.
Для аргументов в диапазоне [0,1] отношение повторения:
digamma(x) = digamma(x+1) - 1/x
используется для переноса оценки на [1,2].
Для аргументов в диапазоне [1,2] используется рациональное приближение , указанное JM (см. ниже).
Для аргументов в диапазоне [2,BIG] отношение рецидива:
digamma(x+1) = digamma(x) + 1/x;
используется для переноса оценки на диапазон [1,2].
Для аргументов > BIG асимптотическое расширение:
можно использовать. Однако это расширение расходится после нескольких терминов: точно, сколько терминов зависит от размера x. Поэтому значение BIG должно быть выбрано таким образом, чтобы серия могла быть усечена в термине, который слишком мал, чтобы оказать какое-либо влияние на результат при оценке по BIG. Выбор BIG=10 для 80-битных реалов, а BIG=20 для 128-битных реалов позволяет усечь серию после достаточно небольшого количества терминов и оценить как многочлен в 1/(x<315>*<317>xx)
.
В произвольной прецизионной версии этой функции используются отношения с рецидивами до x > BIG, а затем оценка через асимптотичное расширение выше. По мере того, как особые случаи целечисленных и полуцелечисленных аргументов обрабатываются через:
Рациональное приближение , указанное JM в диапазоне [1,2], происходит следующим образом.
Сначала высокоточное приближение к дигамме было построено с использованием 60-терминной дифференцированной Lanczos approximation, используемой формой:
В тех случаях, когда P(x) и Q(x) являются полиномиями из рациональной формы суммы Lanczos, а P'(x) и Q'(x) являются их первыми производными. Часть Ланзоса этого приближения имеет теоретическую точность ~100 десятичных цифр. Тем не менее, отмена в приведенной выше сумме сократит это примерно до 99-(1/y)
цифры, если результат y. Это приближение было использовано для расчета положительного корня дигаммы, и было установлено, что оно согласуется с значением, используемым Коди, до 25 цифр (см. Math. Comp. 27, 123-127 (1973) Коди, Strecok и Thacher) и значением, используемым Моррисом, до 35 цифр (см. TOMS Algorithm 708).
Точно так же несколько спотовых тестов согласовывались с значениями, рассчитанными с использованием функций. wolfram.com to >40 digits. Это достаточно точно, чтобы убедиться, что приближение ниже является точным, чтобы удвоить точность. Достижение 128-битной двойной точности требует, чтобы местоположение корня было известно ~70 цифр, и не ясно, соответствует ли значение, рассчитанное этим методом, этому требованию: сложность заключается в независимой проверке полученного значения.
Рациональное приближение , указанное JM, было оптимизировано для абсолютной ошибки с использованием формы:
digamma(x) = (x - X0)(Y + R(x - 1));
Там, где X0 является положительным корнем дигаммы, Y является константой, а R(x - 1) является рациональным приближением. Обратите внимание, что, поскольку X0 иррационален, нам нужно в два раза больше цифр в X0, чем в x, чтобы избежать ошибки отмены во время вычитания (это предполагает, что x является точным значением, если это не все ставки отключены). Это означает, что даже когда x является значением корня, округленного до ближайшего репрезентативного значения, результат дигаммы (x) не будет нулевым.
Статья Digamma раздела Math Toolkit 2.5.0 Gamma Functions может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
:: Главная :: Gamma Functions ::
реклама |