mirror of
				https://github.com/saitohirga/WSJT-X.git
				synced 2025-11-03 21:40:52 -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).
 | 
						|
]
 | 
						|
 |