mirror of
				https://github.com/saitohirga/WSJT-X.git
				synced 2025-11-04 05:50:31 -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).
							 | 
						||
| 
								 | 
							
								]
							 | 
						||
| 
								 | 
							
								
							 |