[section:exp_dist Exponential Distribution]

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

   template <class RealType = double, 
             class ``__Policy``   = ``__policy_class`` >
   class exponential_distribution;

   typedef exponential_distribution<> exponential;

   template <class RealType, class ``__Policy``>
   class exponential_distribution
   {
   public:
      typedef RealType value_type;
      typedef Policy   policy_type;

      exponential_distribution(RealType lambda = 1);

      RealType lambda()const;
   };


The [@http://en.wikipedia.org/wiki/Exponential_distribution exponential distribution]
is a [@http://en.wikipedia.org/wiki/Probability_distribution continuous probability distribution]
with PDF:

[equation exponential_dist_ref1]

It is often used to model the time between independent 
events that happen at a constant average rate.

The following graph shows how the distribution changes for different
values of the rate parameter lambda:

[graph exponential_pdf]

[h4 Member Functions]

   exponential_distribution(RealType lambda = 1);
   
Constructs an
[@http://en.wikipedia.org/wiki/Exponential_distribution Exponential distribution]
with parameter /lambda/.
Lambda is defined as the reciprocal of the scale parameter.

Requires lambda > 0, otherwise calls __domain_error.

   RealType lambda()const;
   
Accessor function returns the lambda parameter of the 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 exponential distribution is implemented in terms of the 
standard library functions `exp`, `log`, `log1p` and `expm1`
and as such should have very low error rates.

[h4 Implementation]

In the following table [lambda] is the parameter lambda of the distribution, 
/x/ is the random variate, /p/ is the probability and /q = 1-p/.

[table
[[Function][Implementation Notes]]
[[pdf][Using the relation: pdf = [lambda] * exp(-[lambda] * x) ]]
[[cdf][Using the relation: p = 1 - exp(-x * [lambda]) = -expm1(-x * [lambda]) ]]
[[cdf complement][Using the relation: q = exp(-x * [lambda]) ]]
[[quantile][Using the relation: x = -log(1-p) / [lambda] = -log1p(-p) / [lambda]]]
[[quantile from the complement][Using the relation: x = -log(q) / [lambda]]]
[[mean][1/[lambda]]]
[[standard deviation][1/[lambda]]]
[[mode][0]]
[[skewness][2]]
[[kurtosis][9]]
[[kurtosis excess][6]]
]

[h4 references]

* [@http://mathworld.wolfram.com/ExponentialDistribution.html Weisstein, Eric W. "Exponential Distribution." From MathWorld--A Wolfram Web Resource]
* [@http://documents.wolfram.com/calccenter/Functions/ListsMatrices/Statistics/ExponentialDistribution.html Wolfram Mathematica calculator]
* [@http://www.itl.nist.gov/div898/handbook/eda/section3/eda3667.htm NIST Exploratory Data Analysis]
* [@http://en.wikipedia.org/wiki/Exponential_distribution Wikipedia Exponential distribution]

(See also the reference documentation for the related __extreme_distrib.)

* 
[@http://www.worldscibooks.com/mathematics/p191.html Extreme Value Distributions, Theory and Applications
Samuel Kotz & Saralees Nadarajah]
discuss the relationship of the types of extreme value distributions.

[endsect][/section:exp_dist Exponential]

[/ exponential.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).
]

