[section:logistic_dist Logistic Distribution]

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

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

   template <class RealType, class Policy>
   class logistic_distribution
   {
   public:
      typedef RealType value_type;
      typedef Policy   policy_type;
      // Construct:
      logistic_distribution(RealType location = 0, RealType scale = 1);
      // Accessors:
      RealType location()const; // location.
      RealType scale()const; // scale.
      
   };

   typedef logistic_distribution<> logistic;

   }} // namespaces
   
The logistic distribution is a continous probability distribution. 
It has two parameters - location and scale.  The cumulative distribution 
function of the logistic distribution appears in logistic regression 
and feedforward neural networks. Among other applications, 
United State Chess Federation and FIDE use it to calculate chess ratings.

The following graph shows how the distribution changes as the
parameters change:

[graph logistic_pdf]

[h4 Member Functions]

   logistic_distribution(RealType u = 0, RealType s = 1);

Constructs a logistic distribution with location /u/ and scale /s/.

Requires `scale > 0`, otherwise a __domain_error is raised.

   RealType location()const;   

Returns the location of this distribution.

   RealType scale()const;

Returns the scale 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 \[-\[max_value\], +\[min_value\]\]. 
However, the pdf and cdf support inputs of +[infin] and -[infin]
as special cases if RealType permits.

At `p=1` and `p=0`, the quantile function returns the result of 
+__overflow_error and -__overflow_error, while the complement 
quantile function returns the result of -__overflow_error and 
+__overflow_error respectively. 

[h4 Accuracy]

The logistic distribution is implemented in terms of the `std::exp` 
and the `std::log` functions, so its accuracy is related to the 
accurate implementations of those functions on a given platform. 
When calculating the quantile with a non-zero /position/ parameter 
catastrophic cancellation errors can occur: 
in such cases, only a low /absolute error/ can be guarenteed.

[h4 Implementation]

[table
[[Function][Implementation Notes]]
[[pdf][Using the relation: pdf = e[super -(x-u)/s] / (s*(1+e[super -(x-u)/s])[super 2])]]
[[cdf][Using the relation: p = 1/(1+e[super -(x-u)/s])]]
[[cdf complement][Using the relation: q = 1/(1+e[super (x-u)/s])]]
[[quantile][Using the relation: x = u - s*log(1/p-1)]]
[[quantile from the complement][Using the relation: x = u + s*log(p/1-p)]]
[[mean][u]]
[[mode][The same as the mean.]]
[[skewness][0]]
[[kurtosis excess][6/5]]
[[variance][ ([pi]*s)[super 2] / 3]]
]

[endsect]

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

