![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
Incomplete Gamma FunctionsBoost , Math Toolkit 2.5.0 , Gamma Functions
|
Microsoft Visual C++ версия 12.0 |
GNU C++ версия 5.1.0 |
GNU C++ версия 5.1.0 |
Солнечный компилятор версии 0x5130 |
|
---|---|---|---|---|
tgamma(a, z) средние значения |
Макс = 35.1ε (Средний = 6.97ε) |
Макс = 0,955ε (Mean = 0,05ε) |
Макс = 41ε (Средний = 8.09ε) |
Макс = 239ε (Средний = 30,2ε) |
tgamma(a, z) малые значения |
Макс = 1.54ε (Средний = 0.439ε) |
Макс = 0ε (Средний = 0ε) |
Макс = 2ε (Средний = 0,461ε) |
Макс = 2ε (Средний = 0,472ε) |
tgamma(a, z) большие значения |
Макс = 244ε (Средний = 20.2ε) |
Макс = 0ε (Mean = 0ε) |
Макс = 3.08e+04ε (Средний = 1,86e+03ε) |
Макс = 3.02e+04ε (Средний = 1,91e+03ε) |
tgamma(a, z) целые и полуцелые значения |
Макс = 13ε (Средний = 2.93ε) |
Макс = 0ε (Mean = 0ε) |
Макс = 11.8ε (Средний = 2.65ε) |
Макс = 71.6ε (Средний = 9.47ε) |
Table 6.10. Error rates for gamma_q
Microsoft Visual C++ версия 12.0 |
GNU C++ версия 5.1.0 |
GNU C++ версия 5.1.0 |
Солнечный компилятор версии 0x5130 |
|
---|---|---|---|---|
tgamma(a, z) средние значения |
Макс = 23,7ε (Средний = 4,03ε) |
Макс = 0,927ε (Средний = 0,035ε) |
Макс = 31.3ε (Средний = 6.56ε) |
Макс = 199ε (Средний = 26.6ε) |
tgamma(a, z) малые значения |
Макс = 2.26ε (Средний = 0.732ε) |
Макс = 0ε (Mean = 0ε) |
Макс = 2.45ε (Средний = 0.832ε) |
Макс = 2,25ε (Средний = 0,81ε) |
tgamma(a, z) большие значения |
Макс = 470ε (Средний = 31,5ε) |
Макс = 0ε (Mean = 0ε) |
Макс = 6,82e+03ε (Средний = 414ε) |
Макс = 1.15e+04ε (Средний = 733ε) |
tgamma(a, z) целые и полуцелые значения |
Макс = 8,48ε (Средний = 1,42ε) |
Макс = 0ε (Mean = 0ε) |
Макс = 11.1ε (Средний = 2.09ε) |
Макс = 54,7ε (Средний = 6,16ε) |
Table 6.11. Error rates for tgamma_lower
Microsoft Visual C++ версия 12.0 |
GNU C++ версия 5.1.0 |
GNU C++ версия 5.1.0 |
Солнечный компилятор версии 0x5130 |
|
---|---|---|---|---|
tgamma(a, z) средние значения |
Макс = 5,62ε (Средний = 1,43ε) |
Max = 0,833ε (Mean = 0,0315ε) |
Макс = 6.79ε (Средний = 1.38ε) |
Макс = 363ε (Средний = 63.8ε) |
tgamma(a, z) малые значения |
Макс = 1,57ε (Средний = 0,527ε) |
Макс = 0ε (Mean = 0ε) |
Макс = 1,97ε (Средний = 0,552ε) |
Макс = 1,97ε (Средний = 0,567ε) |
tgamma(a, z) целые и полуцелые значения |
Макс = 2.69ε (Средний = 0.866ε) |
Макс = 0ε (Mean = 0ε) |
Макс = 4,83ε (Средний = 1,12ε) |
Макс = 84.7ε (Средний = 17.5ε) |
Table 6.12. Error rates for tgamma (incomplete)
Microsoft Visual C++ версия 12.0 |
GNU C++ версия 5.1.0 |
GNU C++ версия 5.1.0 |
Солнечный компилятор версии 0x5130 |
|
---|---|---|---|---|
tgamma(a, z) средние значения |
Макс = 8.14ε (Средний = 1,71ε) |
Макс = 0ε (Mean = 0ε) |
Макс = 7,35ε (Средний = 1,69ε) |
Макс = 412ε (Средний = 95.5ε) |
tgamma(a, z) малые значения |
Макс = 2,53ε (Средний = 0,66ε) |
Макс = 0,753ε (Средний = 0,0474ε) |
Макс = 2.13ε (Средний = 0.717ε) |
Макс = 2.13ε (Средний = 0.712ε) |
tgamma(a, z) целые и полуцелые значения |
Макс = 5.16ε (Средний = 1,44ε) |
Макс = 0ε (Mean = 0ε) |
Макс = 5,52ε (Средний = 1,52ε) |
Макс = 79.6ε (Средний = 20.9ε) |
Существует два набора тестов: точечные тесты сравнивают значения, взятые из. Онлайн-оценщик Mathworldс этой реализацией выполняет базовую «проверку безумия». Тесты точности используют данные, генерируемые с очень высокой точностью (используя RR-класс NTL, установленный с точностью 1000 бит), используя эту реализацию с очень высокой точностью 60-кратногоприближения Lanczos, и некоторые, но не все, специальные случаи обработки отключены. Это менее чем удовлетворительно: действительно следует использовать независимый метод, но, по-видимому, имеется полное отсутствие таких методов. Мы даже не можем использовать преднамеренно наивную реализацию без специальной обработки корпуса, поскольку непрерывная фракция Legendre нестабильна для малых a и z.
Эти четыре функции имеют общую реализацию, поскольку все они связаны между собой:
1)
2)
3)
Нижняя неполная гамма вычисляется из ее последовательного представления:
4)
Или путем вычитания верхнего интеграла из Γ(a) или 1 когдаx - (1(3x)) >a и x >1.1/.
Верхний интеграл вычисляется из непрерывного представления фракции Legendre:
5)
Когда(x >1.1)или путем вычитания нижнего интеграла из Γ(a) или 1 когдаx - (1(3x))
Дляx< 1.1вычисления верхнего интеграла более сложны, так как продолжающееся представление фракции нестабильно в этой области. Однако существует еще одно представление серии для нижнего интеграла:
6)
Это позволяет вычислить верхний интеграл путем перестановки:
7)
См. документацию дляpowm1иtgamma1pm1для подробной информации об их осуществлении. Обратите внимание, однако, что точностьtgamma1pm1ограничена либо 35 цифрами, либо приближениемLanczos, связанным с типом T - если есть один - в зависимости от того, какой из двух больше. Это накладывает аналогичный предел на точность этой функции в этом регионе.
Дляx< 1.1точка кроссовера, где результат ~0,5 больше не встречается дляx ~ y. Используяx * 0,75< aв качестве критерия кроссовера для0,5< x<= 1.1сохраняет максимальное значение, вычисленное (будь то верхний или нижний интервал) примерно до 0,75. Аналогично дляx<= 0,5, затем используя-0,4 / log(x)< aв качестве критерия кроссовера сохраняет максимальное значение, рассчитанное примерно до 0,7 (будь то верхний или нижний интервал).
Существуют два особых случая, когда a — целое или половина целого числа, и условия кроссовера, перечисленные выше, указывают на то, что мы должны вычислить верхний интеграл Q. Если a — целое число в диапазоне1<= a< 30, то используется следующая конечная сумма:
9)
В то время как для полуцелых чисел в диапазоне0,5<= a< 30используется следующая конечная сумма:
10)
Они более стабильны и более эффективны, чем продолжающаяся альтернатива фракции.
Когда аргументaбольшой, иx ~ a, тогда серия (4) и продолжающаяся фракция (5) выше очень медленно сходятся. В этой области используется расширение за счет Темме:
11)
12)
13)
14)
Двойная сумма усечена до фиксированного числа терминов, чтобы дать конкретную целевую точность, и оценивается как многочлен полиномов. Существуют версии с двойной точностью до 128 бит: типы, требующие большей точности, чем те, которые не используют эти расширения. Коэффициенты Cknвычисляются заранее с использованием отношений повторения, заданных Темме. Зона, в которой используются эти расширения
(a > 20) && (a < 200) && fabs(x-a)/a < 0.4
И:
(a > 200) && (fabs(x-a)/a < 4.5/sqrt(a))
Последний диапазон действителен для всех типов до 128-битных длинных двойников и предназначен для обеспечения того, чтобы результат был больше 10-6, первый диапазон используется только для типов до 80-битных длинных двойников. Эти домены более узкие, чем рекомендованные Temme или Didonato и Morris. Однако использование более широкого диапазона приводит к тому, что большие и неточные (т.е. вычисленные) значения передаются в функции<exp
>и<erfc
>, что приводит к значительно большей частоте ошибок. Другими словами, здесь существует тонкая грань между эффективностью и ошибкой. Текущие ограничения должны удерживать количество терминов, требуемых (4) и (5), не более ~20 с двойной точностью.
Для нормализованных неполных гамма-функций вычисление основных условий мощности является центральным для точности функции. Для малых a и x, сочетающих условия мощности с приближениемLanczos, обеспечивает наибольшую точность:
15)
В случае, если это приводит к оттоку/перетоку, то показатель может быть уменьшен вaи приведен в энергетический термин.
Когда a и x большие, мы получаем очень большой показатель с основанием около одного: это не будет точно вычисляться с помощью функции pow, а ведение журналов просто приводит к ошибкам отмены. Наихудших ошибок можно избежать, используя:
16)
Когдаa-xмал, а a и x большие. Есть еще вычитание и, следовательно, некоторые ошибки отмены - но термины малы, поэтому абсолютная ошибка будет мала - и это абсолютная, а не относительная ошибка, которая учитывается в аргументе к функцииexp. Обратите внимание, что при достаточно больших а и х ошибки все равно достанутся вам в итоге, хотя это и задерживает неизбежное гораздо дольше, чем другие методы. Использованиеlog(1+x)-xвдохновлено Temme (см. ссылки ниже).
Статья Incomplete Gamma Functions раздела Math Toolkit 2.5.0 Gamma Functions может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
:: Главная :: Gamma Functions ::
реклама |