2
0
mirror of https://github.com/boostorg/math.git synced 2026-01-26 06:42:12 +00:00

Added stubs for new distributions. These are neither fully tested nor documented and,

in some cases, incomplete. However, migrating them into the sandbox will hopefully
help motivate their completion.


[SVN r42760]
This commit is contained in:
Andrew Sutton
2008-01-14 13:36:23 +00:00
parent fe3db87cc4
commit 8e24be2ffe
2 changed files with 301 additions and 0 deletions

View File

@@ -0,0 +1,138 @@
// Copyright Andrew Sutton 2007
//
// Use, modification and distribution are subject to 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)
#ifndef BOOST_MATH_GEOMETRIC_DISTRIBUTION_HPP
#define BOOST_MATH_GEOMETRIC_DISTRIBUTION_HPP
#include <boost/math/distributions/fwd.hpp>
#include <boost/math/distributions/complement.hpp>
#include <boost/math/constants/constants.hpp>
#include <boost/math/distributions/detail/common_error_handling.hpp>
namespace boost { namespace math {
// The geometric distribution... Write docs here...
template <typename RealType = double, typename Policy = policies::policy<> >
class geometric_distribution
{
public:
typedef RealType value_type;
typedef Policy policy_type;
geometric_distribution(value_type prob)
: m_prob(prob)
{
}
value_type success_probability() const
{ return m_prob; }
private:
value_type m_prob;
};
template <typename RealType, typename Policy>
inline std::pair<RealType, RealType>
range(const geometric_distribution<RealType, Policy>&)
{
return std::make_pair(RealType(), RealType());
}
template <typename RealType, typename Policy>
inline std::pair<RealType, RealType>
support(const geometric_distribution<RealType, Policy>&)
{
return std::make_pair(RealType(), RealType());
}
template <typename RealType, typename Policy>
inline RealType
pdf(const geometric_distribution<RealType, Policy>& dist, const RealType& x)
{
using std::pow;
RealType one = 1;
RealType p = dist.success_probability();
return pow(one - p, x - one) * p;
}
template <typename RealType, typename Policy>
inline RealType
cdf(const geometric_distribution<RealType, Policy>& dist, const RealType& x)
{
using std::pow;
RealType one = 1;
RealType p = dist.success_probability();
return one - pow(one - p, x);
}
template <typename RealType, typename Policy>
inline RealType
cdf(const complemented2_type<geometric_distribution<RealType, Policy>, RealType>& dist)
{
return RealType();
}
template <typename RealType, typename Policy>
inline RealType
quantile(const geometric_distribution<RealType, Policy>& dist, const RealType& x)
{
return RealType();
}
template <typename RealType, typename Policy>
inline RealType
quantile(const complemented2_type<geometric_distribution<RealType, Policy>, RealType>& dist)
{
return RealType();
}
template <typename RealType, typename Policy>
inline RealType
mean(const geometric_distribution<RealType, Policy>& dist)
{
RealType one = 1;
RealType p = dist.success_probability();
return one / p;
}
template <typename RealType, typename Policy>
inline RealType
variance(const geometric_distribution<RealType, Policy>& dist)
{
RealType one = 1;
RealType p = dist.success_probability();
return (one - p) / (p * p);
}
template <typename RealType, typename Policy>
inline RealType
skewness(const geometric_distribution<RealType, Policy>& dist)
{
using std::sqrt;
RealType one = 1;
RealType two = 2;
RealType p = dist.success_probability();
return (two - p) / sqrt(one - p);
}
template <typename RealType, typename Policy>
inline RealType
kurtosis(const geometric_distribution<RealType, Policy>& dist)
{
return RealType();
}
template <typename RealType, typename Policy>
inline RealType
kurtosis_excess(const geometric_distribution<RealType, Policy>& dist)
{
return RealType();
}
} }
#endif

View File

@@ -0,0 +1,163 @@
// Copyright Edward M. Morrison 2007
// Copyright Andrew Sutton 2007
//
// Use, modification and distribution are subject to 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)
#ifndef BOOST_MATH_SKEW_NORMAL_DISTRIBUTION_HPP
#define BOOST_MATH_SKEW_NORMAL_DISTRIBUTION_HPP
#include <boost/math/distributions/fwd.hpp>
#include <boost/math/distributions/complement.hpp>
#include <boost/math/constants/constants.hpp>
#include <boost/math/distributions/detail/common_error_handling.hpp>
namespace boost { namespace math {
namespace skew_normal_detail {
// delta() := a / sqrt(1 + a^2)
// expectation() := d * sqrt(2/pi)
// variance() := 1 - 2*d^2 / pi
}
// The skew normal distribution is parameterized over location, shape and
// scale parameters. These are similar to mean and standard deviation in the
// normal distribution, but are scaled and "re-shaped".
//
// Note that we could forseeably cache a number of factors inside the distribution
// like we're doing with the correlation factor. However, these aren't really part
// of the public interface of the type. In fact, it may just be better to recompute
// them on the fly each time. Ask the math guys.
template <typename RealType = double, typename Policy = policies::policy<> >
class skew_normal_distribution
{
public:
typedef RealType value_type;
typedef Policy policy_type;
skew_normal_distribution(value_type loc = 0, value_type scale = 1, value_type shape = 0)
: m_location(loc)
, m_scale(scale)
, m_shape(shape)
, m_correlation(make_correlation(shape))
{
}
value_type location() const
{ return m_location; }
value_type scale() const
{ return m_scale; }
value_type shape() const
{ return m_shape; }
value_type correlation() const
{ return m_correlation; }
private:
value_type make_correlation(value_type shape)
{ return shape / sqrt(1.0 + shape * shape); }
private:
value_type m_location;
value_type m_scale;
value_type m_shape;
value_type m_correlation;
};
template <typename RealType, typename Policy>
inline std::pair<RealType, RealType>
range(const skew_normal_distribution<RealType, Policy>&)
{
return std::make_pair(RealType(), RealType());
}
template <typename RealType, typename Policy>
inline std::pair<RealType, RealType>
support(const skew_normal_distribution<RealType, Policy>&)
{
return std::make_pair(RealType(), RealType());
}
template <typename RealType, typename Policy>
inline RealType
pdf(const skew_normal_distribution<RealType, Policy>& dist, const RealType& x)
{
return RealType();
}
template <typename RealType, typename Policy>
inline RealType
cdf(const skew_normal_distribution<RealType, Policy>& dist, const RealType& x)
{
return RealType();
}
template <typename RealType, typename Policy>
inline RealType
cdf(const complemented2_type<skew_normal_distribution<RealType, Policy>, RealType>& dist)
{
return RealType();
}
template <typename RealType, typename Policy>
inline RealType
quantile(const skew_normal_distribution<RealType, Policy>& dist, const RealType& x)
{
return RealType();
}
template <typename RealType, typename Policy>
inline RealType
quantile(const complemented2_type<skew_normal_distribution<RealType, Policy>, RealType>& dist)
{
return RealType();
}
template <typename RealType, typename Policy>
inline RealType
mean(const skew_normal_distribution<RealType, Policy>& dist)
{
// This is the complicated way of writing dist.location()
RealType var = sqrt(dist.scale());
RealType root = sqrt(2.0 / constants::pi<RealType>());
return dist.location() + var * root * dist.correlation();
}
template <typename RealType, typename Policy>
inline RealType
variance(const skew_normal_distribution<RealType, Policy>& dist)
{
// This is apparently the same as dist.scale()^2.
RealType scale = dist.scale() * dist.scale();
RealType corr = dist.correlation() * dist.correlation();
return scale * (1.0 - 2.0 * corr / constants::pi<RealType>());
}
template <typename RealType, typename Policy>
inline RealType
skewness(const skew_normal_distribution<RealType, Policy>& dist)
{
return RealType();
}
template <typename RealType, typename Policy>
inline RealType
kurtosis(const skew_normal_distribution<RealType, Policy>& dist)
{
return RealType();
}
template <typename RealType, typename Policy>
inline RealType
kurtosis_excess(const skew_normal_distribution<RealType, Policy>& dist)
{
return RealType();
}
} }
#endif