mirror of
				https://github.com/saitohirga/WSJT-X.git
				synced 2025-11-04 05:50:31 -05:00 
			
		
		
		
	
		
			
	
	
		
			140 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			140 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 
								 | 
							
								[section:gamma_dist Gamma (and Erlang) Distribution]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								``#include <boost/math/distributions/gamma.hpp>``
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   namespace boost{ namespace math{ 
							 | 
						||
| 
								 | 
							
								      
							 | 
						||
| 
								 | 
							
								   template <class RealType = double, 
							 | 
						||
| 
								 | 
							
								             class ``__Policy``   = ``__policy_class`` >
							 | 
						||
| 
								 | 
							
								   class gamma_distribution
							 | 
						||
| 
								 | 
							
								   {
							 | 
						||
| 
								 | 
							
								   public:
							 | 
						||
| 
								 | 
							
								      typedef RealType value_type;
							 | 
						||
| 
								 | 
							
								      typedef Policy   policy_type;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      gamma_distribution(RealType shape, RealType scale = 1)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      RealType shape()const;
							 | 
						||
| 
								 | 
							
								      RealType scale()const;
							 | 
						||
| 
								 | 
							
								   };
							 | 
						||
| 
								 | 
							
								   
							 | 
						||
| 
								 | 
							
								   }} // namespaces
							 | 
						||
| 
								 | 
							
								   
							 | 
						||
| 
								 | 
							
								The gamma distribution is a continuous probability distribution.
							 | 
						||
| 
								 | 
							
								When the shape parameter is an integer then it is known as the 
							 | 
						||
| 
								 | 
							
								Erlang Distribution.  It is also closely related to the Poisson
							 | 
						||
| 
								 | 
							
								and Chi Squared Distributions.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								When the shape parameter has an integer value, the distribution is the
							 | 
						||
| 
								 | 
							
								[@http://en.wikipedia.org/wiki/Erlang_distribution Erlang distribution].
							 | 
						||
| 
								 | 
							
								Since this can be produced by ensuring that the shape parameter has an
							 | 
						||
| 
								 | 
							
								integer value > 0, the Erlang distribution is not separately implemented.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								[note
							 | 
						||
| 
								 | 
							
								To avoid potential confusion with the gamma functions, this
							 | 
						||
| 
								 | 
							
								distribution does not provide the typedef:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								``typedef gamma_distribution<double> gamma;`` 
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Instead if you want a double precision gamma distribution you can write 
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								``boost::math::gamma_distribution<> my_gamma(1, 1);``
							 | 
						||
| 
								 | 
							
								]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								For shape parameter /k/ and scale parameter [theta][space] it is defined by the
							 | 
						||
| 
								 | 
							
								probability density function:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								[equation gamma_dist_ref1]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Sometimes an alternative formulation is used: given parameters
							 | 
						||
| 
								 | 
							
								[alpha][space]= k and [beta][space]= 1 / [theta], then the 
							 | 
						||
| 
								 | 
							
								distribution can be defined by the PDF:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								[equation gamma_dist_ref2]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								In this form the inverse scale parameter is called a /rate parameter/.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Both forms are in common usage: this library uses the first definition
							 | 
						||
| 
								 | 
							
								throughout.  Therefore to construct a Gamma Distribution from a ['rate
							 | 
						||
| 
								 | 
							
								parameter], you should pass the reciprocal of the rate as the scale parameter.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								The following two graphs illustrate how the PDF of the gamma distribution
							 | 
						||
| 
								 | 
							
								varies as the parameters vary:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								[graph gamma1_pdf]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								[graph gamma2_pdf]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								The [*Erlang Distribution] is the same as the Gamma, but with the shape parameter
							 | 
						||
| 
								 | 
							
								an integer.  It is often expressed using a /rate/ rather than a /scale/ as the 
							 | 
						||
| 
								 | 
							
								second parameter (remember that the rate is the reciprocal of the scale).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Internally the functions used to implement the Gamma Distribution are
							 | 
						||
| 
								 | 
							
								already optimised for small-integer arguments, so in general there should
							 | 
						||
| 
								 | 
							
								be no great loss of performance from using a Gamma Distribution rather than
							 | 
						||
| 
								 | 
							
								a dedicated Erlang Distribution.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								[h4 Member Functions]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   gamma_distribution(RealType shape, RealType scale = 1);
							 | 
						||
| 
								 | 
							
								   
							 | 
						||
| 
								 | 
							
								Constructs a gamma distribution with shape /shape/ and 
							 | 
						||
| 
								 | 
							
								scale /scale/.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Requires that the shape and scale parameters are greater than zero, otherwise calls
							 | 
						||
| 
								 | 
							
								__domain_error.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   RealType shape()const;
							 | 
						||
| 
								 | 
							
								   
							 | 
						||
| 
								 | 
							
								Returns the /shape/ parameter of this distribution.
							 | 
						||
| 
								 | 
							
								   
							 | 
						||
| 
								 | 
							
								   RealType scale()const;
							 | 
						||
| 
								 | 
							
								      
							 | 
						||
| 
								 | 
							
								Returns the /scale/ parameter of this distribution.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								[h4 Non-member Accessors]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								All the [link math_toolkit.dist_ref.nmp usual non-member accessor functions] that are generic to all
							 | 
						||
| 
								 | 
							
								distributions are supported: __usual_accessors.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								The domain of the random variable is \[0,+[infin]\].
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								[h4 Accuracy]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								The lognormal distribution is implemented in terms of the 
							 | 
						||
| 
								 | 
							
								incomplete gamma functions __gamma_p and __gamma_q and their
							 | 
						||
| 
								 | 
							
								inverses __gamma_p_inv and __gamma_q_inv: refer to the accuracy
							 | 
						||
| 
								 | 
							
								data for those functions for more information.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								[h4 Implementation]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								In the following table /k/ is the shape parameter of the distribution, 
							 | 
						||
| 
								 | 
							
								[theta][space] is its scale parameter, /x/ is the random variate, /p/ is the probability
							 | 
						||
| 
								 | 
							
								and /q = 1-p/.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								[table
							 | 
						||
| 
								 | 
							
								[[Function][Implementation Notes]]
							 | 
						||
| 
								 | 
							
								[[pdf][Using the relation: pdf = __gamma_p_derivative(k, x / [theta]) / [theta] ]]
							 | 
						||
| 
								 | 
							
								[[cdf][Using the relation: p = __gamma_p(k, x / [theta]) ]]
							 | 
						||
| 
								 | 
							
								[[cdf complement][Using the relation: q = __gamma_q(k, x / [theta]) ]]
							 | 
						||
| 
								 | 
							
								[[quantile][Using the relation: x = [theta][space]* __gamma_p_inv(k, p) ]]
							 | 
						||
| 
								 | 
							
								[[quantile from the complement][Using the relation: x = [theta][space]* __gamma_q_inv(k, p) ]]
							 | 
						||
| 
								 | 
							
								[[mean][k[theta] ]]
							 | 
						||
| 
								 | 
							
								[[variance][k[theta][super 2] ]]
							 | 
						||
| 
								 | 
							
								[[mode][(k-1)[theta][space] for ['k>1] otherwise a __domain_error ]]
							 | 
						||
| 
								 | 
							
								[[skewness][2 / sqrt(k) ]]
							 | 
						||
| 
								 | 
							
								[[kurtosis][3 + 6 / k]]
							 | 
						||
| 
								 | 
							
								[[kurtosis excess][6 / k ]]
							 | 
						||
| 
								 | 
							
								]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								[endsect][/section:gamma_dist Gamma (and Erlang) Distribution]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								[/ 
							 | 
						||
| 
								 | 
							
								  Copyright 2006, 2010 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).
							 | 
						||
| 
								 | 
							
								]
							 | 
						||
| 
								 | 
							
								
							 |