mirror of
https://github.com/saitohirga/WSJT-X.git
synced 2024-11-17 17:42:02 -05:00
111 lines
3.0 KiB
Plaintext
111 lines
3.0 KiB
Plaintext
|
[section:polygamma Polygamma]
|
||
|
|
||
|
[h4 Synopsis]
|
||
|
|
||
|
``
|
||
|
#include <boost/math/special_functions/polygamma.hpp>
|
||
|
``
|
||
|
|
||
|
namespace boost{ namespace math{
|
||
|
|
||
|
template <class T>
|
||
|
``__sf_result`` polygamma(int n, T z);
|
||
|
|
||
|
template <class T, class ``__Policy``>
|
||
|
``__sf_result`` polygamma(int n, T z, const ``__Policy``&);
|
||
|
|
||
|
}} // namespaces
|
||
|
|
||
|
[h4 Description]
|
||
|
|
||
|
Returns the polygamma function of /x/. Polygamma is defined as the n'th
|
||
|
derivative of the digamma function:
|
||
|
|
||
|
[equation polygamma1]
|
||
|
|
||
|
The following graphs illustrate the behaviour of the function for odd and even order:
|
||
|
|
||
|
[graph polygamma2]
|
||
|
[graph polygamma3]
|
||
|
|
||
|
[optional_policy]
|
||
|
|
||
|
The return type of this function is computed using the __arg_promotion_rules:
|
||
|
the result is of type `double` when T is an integer type, and type T otherwise.
|
||
|
|
||
|
[h4 Accuracy]
|
||
|
|
||
|
The following table shows the peak errors (in units of epsilon)
|
||
|
found on various platforms with various floating point types.
|
||
|
Unless otherwise specified any floating point type that is narrower
|
||
|
than the one shown will have __zero_error.
|
||
|
|
||
|
[table_polygamma]
|
||
|
|
||
|
As shown above, error rates are generally very acceptable for moderately sized
|
||
|
arguments. Error rates should stay low for exact inputs, however, please note that the
|
||
|
function becomes exceptionally sensitive to small changes in input for large n and negative x,
|
||
|
indeed for cases where ['n!] would overflow, the function changes directly from -[infin] to
|
||
|
+[infin] somewhere between each negative integer - ['these cases are not handled correctly].
|
||
|
|
||
|
[*For these reasons results should be treated with extreme caution when /n/ is large and x negative].
|
||
|
|
||
|
[h4 Testing]
|
||
|
|
||
|
Testing is against Mathematica generated spot values to 35 digit precision.
|
||
|
|
||
|
[h4 Implementation]
|
||
|
|
||
|
For x < 0 the following reflection formula is used:
|
||
|
|
||
|
[equation polygamma2]
|
||
|
|
||
|
The n'th derivative of ['cot(x)] is tabulated for small /n/, and for larger n
|
||
|
has the general form:
|
||
|
|
||
|
[equation polygamma3]
|
||
|
|
||
|
The coefficients of the cosine terms can be calculated iteratively starting
|
||
|
from ['C[sub 1,0] = -1] and then using
|
||
|
|
||
|
[equation polygamma7]
|
||
|
|
||
|
to generate coefficients for n+1.
|
||
|
|
||
|
Note that every other coefficient is zero, and therefore what we have are
|
||
|
even or odd polynomials depending on whether n is even or odd.
|
||
|
|
||
|
Once x is positive then we have two methods available to us, for small x
|
||
|
we use the series expansion:
|
||
|
|
||
|
[equation polygamma4]
|
||
|
|
||
|
Note that the evaluation of zeta functions at integer values is essentially a table lookup
|
||
|
as __zeta is optimized for those cases.
|
||
|
|
||
|
For large x we use the asymptotic expansion:
|
||
|
|
||
|
[equation polygamma5]
|
||
|
|
||
|
For x in-between the two extremes we use the relation:
|
||
|
|
||
|
[equation polygamma6]
|
||
|
|
||
|
to make x large enough for the asymptotic expansion to be used.
|
||
|
|
||
|
There are also two special cases:
|
||
|
|
||
|
[equation polygamma8]
|
||
|
|
||
|
[equation polygamma9]
|
||
|
|
||
|
[endsect][/section:polygamma The Polygamma Function]
|
||
|
|
||
|
[/
|
||
|
Copyright 2014 John Maddock and Paul A. Bristow.
|
||
|
Distributed under the Boost Software License, Version 1.0.
|
||
|
(See accompanying file LICENSE_1_0.txt or copy at
|
||
|
http://www.boost.org/LICENSE_1_0.txt).
|
||
|
]
|
||
|
|