Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

Incomplete Gamma Functions

Boost , Math Toolkit 2.5.0 , Gamma Functions

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

PrevUpHomeNext
Synopsis
#include <boost/math/special_functions/gamma.hpp>
namespace boost{ namespace math{
template <class T1, class T2>
calculated-result-type gamma_p(T1 a, T2 z);
template <class T1, class T2, class Policy>
calculated-result-type gamma_p(T1 a, T2 z, const Policy&);
template <class T1, class T2>
calculated-result-type gamma_q(T1 a, T2 z);
template <class T1, class T2, class Policy>
calculated-result-type gamma_q(T1 a, T2 z, const Policy&);
template <class T1, class T2>
calculated-result-type tgamma_lower(T1 a, T2 z);
template <class T1, class T2, class Policy>
calculated-result-type tgamma_lower(T1 a, T2 z, const Policy&);
template <class T1, class T2>
calculated-result-type tgamma(T1 a, T2 z);
template <class T1, class T2, class Policy>
calculated-result-type tgamma(T1 a, T2 z, const Policy&);
}} // namespaces
Description

Существует четыренеполных гамма-функции: Две являются нормализованными версиями (также известными какупорядоченныенеполные гамма-функции), которые возвращают значения в диапазоне [0, 1], а две являются ненормализованными и возвращают значения в диапазоне [0, Γ(a)]. Пользователи, заинтересованные в статистических приложениях, должны использоватьнормализованные версии (gamma_p и gamma_q)..

Все эти функции требуютa>0иz>= 0, иначе они возвращают результатdomain_error.

Окончательный аргументПолитикаявляется необязательным и может использоваться для контроля поведения функции: как она обрабатывает ошибки, какой уровень точности использовать и т. д. См. документацию по политикедля более подробной информации.

Тип возврата этих функций вычисляется с использованиемправил расчета типа результата, когда T1 и T2 являются различными типами, в противном случае тип возврата является просто T1.

template <class T1, class T2>
calculated-result-type gamma_p(T1 a, T2 z);
template <class T1, class T2, class Policy>
calculated-result-type gamma_p(T1 a, T2 z, const Policy&);

Возвращает нормализованную низшую неполную гамма-функцию a и z:

Эта функция быстро меняется от 0 до 1 вокруг точки z == a:

template <class T1, class T2>
calculated-result-type gamma_q(T1 a, T2 z);
template <class T1, class T2, class Policy>
calculated-result-type gamma_q(T1 a, T2 z, const Policy&);

Возвращает нормализованную низшую неполную гамма-функцию a и z:

Эта функция быстро меняется от 1 до 0 вокруг точки z == a:

template <class T1, class T2>
calculated-result-type tgamma_lower(T1 a, T2 z);
template <class T1, class T2, class Policy>
calculated-result-type tgamma_lower(T1 a, T2 z, const Policy&);

Возвращает полную (ненормализованную) низшую неполную гамма-функцию a и z:

template <class T1, class T2>
calculated-result-type tgamma(T1 a, T2 z);
template <class T1, class T2, class Policy>
calculated-result-type tgamma(T1 a, T2 z, const Policy&);

Возвращает полную (ненормализованную) верхнюю неполную гамма-функцию a и z:

Accuracy

Следующие таблицы дают пиковые и средние относительные ошибки в различных областях a и z, а также сравнения с библиотекамиGSL-1.9иCephes. Обратите внимание, что только результаты для самого широкого типа плавающей точки в системе приведены, поскольку более узкие типы имеютфактически нулевую ошибку.

Обратите внимание, что ошибки растут по мере того, какувеличивается.

Обратите внимание, что более высокие показатели ошибок для двойных результатов длиной 80 и 128 бит несколько вводят в заблуждение: ожидаемые результаты, которые равны нулю при 64-битной двойной точности, могут быть ненулевыми, но исключительно небольшими, с большим диапазоном экспонентов длинного двойника. Эти результаты отражают более экстремальный характер испытаний, проводимых для этих типов.

Все значения находятся в единицах эпсилона.

Table 6.9. Error rates for gamma_p

Microsoft Visual C++ версия 12.0
Win32
двойная

GNU C++ версия 5.1.0
Linux
Double

GNU C++ версия 5.1.0
Linux
длинный двойной

Солнечный компилятор версии 0x5130
Солнечный солярис

tgamma(a, z) средние значения

Макс = 35.1ε (Средний = 6.97ε)

Макс = 0,955ε (Mean = 0,05ε)

GSL 1.16:Макс = 342ε (Mean = 45.8ε)]
Rmath 3.0.2:Макс = 389ε (Mean = 44ε)]
Цефес:Макс = 492ε (Mean = 101ε)]

Макс = 41ε (Средний = 8.09ε)

Макс = 239ε (Средний = 30,2ε)

tgamma(a, z) малые значения

Макс = 1.54ε (Средний = 0.439ε)

Макс = 0ε (Средний = 0ε)
GSL 1.16:Макс = 4.82ε (Средний = 0.758ε)]
Макс = 21ε (Средний = 5.65ε)

[Средний = 0.01ε] [Средний = 0.306ε]]

Макс = 2ε (Средний = 0,461ε)

Макс = 2ε (Средний = 0,472ε)

tgamma(a, z) большие значения

Макс = 244ε (Средний = 20.2ε)

Макс = 0ε (Mean = 0ε)
GSL 1.16:Макс = 1.02e+03ε (Mean = 105ε)]
Rmath 3.0.2:Макс = 1.11e+03ε (Mean = 67.5ε)]
Цефес:Макс = 8.18e+06ε (Mean = 7.69e+05ε]]

Макс = 3.08e+04ε (Средний = 1,86e+03ε)

Макс = 3.02e+04ε (Средний = 1,91e+03ε)

tgamma(a, z) целые и полуцелые значения

Макс = 13ε (Средний = 2.93ε)

Макс = 0ε (Mean = 0ε)

GSL 1.16:Макс = 128ε (Mean = 226ε)]
Rmath 3.0.2:Макс = 66.2ε (Mean = 12.2ε)]
Цефес:Макс = 83.6ε (Mean = 22.2ε)

Макс = 11.8ε (Средний = 2.65ε)

Макс = 71.6ε (Средний = 9.47ε)


Table 6.10. Error rates for gamma_q

Microsoft Visual C++ версия 12.0
Win32
двойная

GNU C++ версия 5.1.0
Linux
Double

GNU C++ версия 5.1.0
Linux
длинный двойной

Солнечный компилятор версии 0x5130
Солнечный солярис

tgamma(a, z) средние значения

Макс = 23,7ε (Средний = 4,03ε)

Макс = 0,927ε (Средний = 0,035ε)

GSL 1.16:Макс = 201ε (Средний = 131ε)]
Цефес:Макс = 388ε (Средний = 93,8ε)

Макс = 31.3ε (Средний = 6.56ε)

Макс = 199ε (Средний = 26.6ε)

tgamma(a, z) малые значения

Макс = 2.26ε (Средний = 0.732ε)

Макс = 0ε (Mean = 0ε)

GSL 1.16:Макс = 1.38e+10ε (Mean = 1.05e+09ε)
Макс = 65.6ε (Mean = 11ε)]
Макс = 3.42e+11ε (Mean = 4.1e+10ε]]

Макс = 2.45ε (Средний = 0.832ε)

Макс = 2,25ε (Средний = 0,81ε)

tgamma(a, z) большие значения

Макс = 470ε (Средний = 31,5ε)

Макс = 0ε (Mean = 0ε)

GSL 1.16:Макс = 2.71e+04ε (Mean = 2.16e+03ε)]
Rmath 3.0.2:Макс = 1.02e+03ε (Mean = 62.7ε)]
Цефес:Макс = 8.17e+06ε (Mean = 7.7e+05ε)

Макс = 6,82e+03ε (Средний = 414ε)

Макс = 1.15e+04ε (Средний = 733ε)

tgamma(a, z) целые и полуцелые значения

Макс = 8,48ε (Средний = 1,42ε)

Макс = 0ε (Mean = 0ε)
GSL 1.16:Макс = 118ε (Mean = 128ε)]
Rmath 3.0.2:Макс = 138ε (Mean = 16.9ε)]
Цефес:Макс = 129ε (Mean = 26.5ε)]

Макс = 11.1ε (Средний = 2.09ε)

Макс = 54,7ε (Средний = 6,16ε)


Table 6.11. Error rates for tgamma_lower

Microsoft Visual C++ версия 12.0
Win32
двойная

GNU C++ версия 5.1.0
Linux
Double

GNU C++ версия 5.1.0
Linux
длинный двойной

Солнечный компилятор версии 0x5130
Солнечный солярис

tgamma(a, z) средние значения

Макс = 5,62ε (Средний = 1,43ε)

Max = 0,833ε (Mean = 0,0315ε)

GSL 1.16:Max = 0,833ε (Mean = 0,0315ε)

Макс = 6.79ε (Средний = 1.38ε)

Макс = 363ε (Средний = 63.8ε)

tgamma(a, z) малые значения

Макс = 1,57ε (Средний = 0,527ε)

Макс = 0ε (Mean = 0ε)

GSL 1.16:Макс = 0ε (Mean = 0ε)]

Макс = 1,97ε (Средний = 0,552ε)

Макс = 1,97ε (Средний = 0,567ε)

tgamma(a, z) целые и полуцелые значения

Макс = 2.69ε (Средний = 0.866ε)

Макс = 0ε (Mean = 0ε)

GSL 1.16:Макс = 0ε (Mean = 0ε)]

Макс = 4,83ε (Средний = 1,12ε)

Макс = 84.7ε (Средний = 17.5ε)


Table 6.12. Error rates for tgamma (incomplete)

Microsoft Visual C++ версия 12.0
Win32
двойная

GNU C++ версия 5.1.0
Linux
Double

GNU C++ версия 5.1.0
Linux
длинный двойной

Солнечный компилятор версии 0x5130
Солнечный солярис

tgamma(a, z) средние значения

Макс = 8.14ε (Средний = 1,71ε)

Макс = 0ε (Mean = 0ε)

GSL 1.16:Макс = 200ε (Mean = 13.3ε)]

Макс = 7,35ε (Средний = 1,69ε)

Макс = 412ε (Средний = 95.5ε)

tgamma(a, z) малые значения

Макс = 2,53ε (Средний = 0,66ε)

Макс = 0,753ε (Средний = 0,0474ε)

GSL 1.16:Макс = 1,38e+10ε (Средний = 1,05e+09ε)

Макс = 2.13ε (Средний = 0.717ε)

Макс = 2.13ε (Средний = 0.712ε)

tgamma(a, z) целые и полуцелые значения

Макс = 5.16ε (Средний = 1,44ε)

Макс = 0ε (Mean = 0ε)

GSL 1.16:Макс = 117ε (Mean = 12.5ε)]

Макс = 5,52ε (Средний = 1,52ε)

Макс = 79.6ε (Средний = 20.9ε)


Testing

Существует два набора тестов: точечные тесты сравнивают значения, взятые из. Онлайн-оценщик Mathworldс этой реализацией выполняет базовую «проверку безумия». Тесты точности используют данные, генерируемые с очень высокой точностью (используя RR-класс NTL, установленный с точностью 1000 бит), используя эту реализацию с очень высокой точностью 60-кратногоприближения Lanczos, и некоторые, но не все, специальные случаи обработки отключены. Это менее чем удовлетворительно: действительно следует использовать независимый метод, но, по-видимому, имеется полное отсутствие таких методов. Мы даже не можем использовать преднамеренно наивную реализацию без специальной обработки корпуса, поскольку непрерывная фракция Legendre нестабильна для малых a и z.

Implementation

Эти четыре функции имеют общую реализацию, поскольку все они связаны между собой:

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 (см. ссылки ниже).

References
  • N. M. Temme, A Set of Algorithms for the Incomplete Gamma Functions, Probability in the Engineering and Informational Sciences, 8, 1994.
  • Н. М. Темме «Асимптотическое расширение неполных гамма-функций», Сиам Дж. Anal. Vol 10 No 4, July 1979, p757.
  • А. Р. Дидонато и А. Х. Моррис, Вычисление коэффициентов неполной гамма-функции и их обратных. ACM TOMS, Vol 12, No 4, Dec 1986, p377.
  • W. Gautschi, The Incomplete Gamma Functions Since Tricomi, In Tricomi's Ideas and Contemporary Applied Mathematics, Atti dei Convegni Lincei, n. 147, Accademia Nazionale dei Lincei, Roma, 1998, pp. 203--237.http://citeseer.ist.psu.edu/gautschi98incomplete.html

PrevUpHomeNext

Статья Incomplete Gamma Functions раздела Math Toolkit 2.5.0 Gamma Functions может быть полезна для разработчиков на c++ и boost.




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: Gamma Functions ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-05-19 22:01:05/0.013220071792603/1