[section:poisson_dist Poisson Distribution]

``#include <boost/math/distributions/poisson.hpp>``

  namespace boost { namespace math {
  
  template <class RealType = double, 
            class ``__Policy``   = ``__policy_class`` >
  class poisson_distribution;

  typedef poisson_distribution<> poisson;

  template <class RealType, class ``__Policy``>
  class poisson_distribution
  { 
  public:
    typedef RealType value_type;
    typedef Policy   policy_type;
    
    poisson_distribution(RealType mean = 1); // Constructor.
    RealType mean()const; // Accessor.
  }
   
  }} // namespaces boost::math
   
The [@http://en.wikipedia.org/wiki/Poisson_distribution Poisson distribution]
is a well-known statistical discrete distribution.
It expresses the probability of a number of events
(or failures, arrivals, occurrences ...)
occurring in a fixed period of time,
provided these events occur with a known mean rate [lambda][space]
(events/time), and are independent of the time since the last event.

The distribution was discovered by Sim__eacute on-Denis Poisson (1781 to 1840).

It has the Probability Mass Function:

[equation poisson_ref1]

for k events, with an expected number of events [lambda].

The following graph illustrates how the PDF varies with the parameter [lambda]:

[graph poisson_pdf_1]

[discrete_quantile_warning Poisson]

[h4 Member Functions]

   poisson_distribution(RealType mean = 1);
   
Constructs a poisson distribution with mean /mean/.

   RealType mean()const;
   
Returns the /mean/ of this distribution.
   
[h4 Non-member Accessors]

All the [link math_toolkit.dist.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 Poisson distribution is implemented in terms of the 
incomplete gamma functions __gamma_p and __gamma_q 
and as such should have low error rates: but refer to the documentation
of those functions for more information.
The quantile and its complement use the inverse gamma functions
and are therefore probably slightly less accurate: this is because the 
inverse gamma functions are implemented using an iterative method with a 
lower tolerance to avoid excessive computation.

[h4 Implementation]

In the following table [lambda][space] is the mean of the distribution,
/k/ is the random variable, /p/ is the probability and /q = 1-p/.

[table
[[Function][Implementation Notes]]
[[pdf][Using the relation: pdf = e[super -[lambda]] [lambda][super k] \/ k! ]]
[[cdf][Using the relation: p = [Gamma](k+1, [lambda]) \/ k! = __gamma_q(k+1, [lambda])]]
[[cdf complement][Using the relation: q = __gamma_p(k+1, [lambda]) ]]
[[quantile][Using the relation: k = __gamma_q_inva([lambda], p) - 1]]
[[quantile from the complement][Using the relation: k = __gamma_p_inva([lambda], q) - 1]]
[[mean][[lambda]]]
[[mode][ floor ([lambda]) or [floorlr[lambda]] ]]
[[skewness][1/[radic][lambda]]]
[[kurtosis][3 + 1/[lambda]]]
[[kurtosis excess][1/[lambda]]]
]

[/ poisson.qbk
  Copyright 2006 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).
]

[endsect][/section:poisson_dist Poisson]

