WSJT-X/boost/libs/math/example/negative_binomial_example2.cpp

183 lines
8.1 KiB
C++
Raw Normal View History

// negative_binomial_example2.cpp
// Copyright Paul A. Bristow 2007, 2010.
// 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)
// Simple example demonstrating use of the Negative Binomial Distribution.
#include <boost/math/distributions/negative_binomial.hpp>
using boost::math::negative_binomial_distribution;
using boost::math::negative_binomial; // typedef
// In a sequence of trials or events
// (Bernoulli, independent, yes or no, succeed or fail)
// with success_fraction probability p,
// negative_binomial is the probability that k or fewer failures
// preceed the r th trial's success.
#include <iostream>
using std::cout;
using std::endl;
using std::setprecision;
using std::showpoint;
using std::setw;
using std::left;
using std::right;
#include <limits>
using std::numeric_limits;
int main()
{
cout << "Negative_binomial distribution - simple example 2" << endl;
// Construct a negative binomial distribution with:
// 8 successes (r), success fraction (p) 0.25 = 25% or 1 in 4 successes.
negative_binomial mynbdist(8, 0.25); // Shorter method using typedef.
// Display (to check) properties of the distribution just constructed.
cout << "mean(mynbdist) = " << mean(mynbdist) << endl; // 24
cout << "mynbdist.successes() = " << mynbdist.successes() << endl; // 8
// r th successful trial, after k failures, is r + k th trial.
cout << "mynbdist.success_fraction() = " << mynbdist.success_fraction() << endl;
// success_fraction = failures/successes or k/r = 0.25 or 25%.
cout << "mynbdist.percent success = " << mynbdist.success_fraction() * 100 << "%" << endl;
// Show as % too.
// Show some cumulative distribution function values for failures k = 2 and 8
cout << "cdf(mynbdist, 2.) = " << cdf(mynbdist, 2.) << endl; // 0.000415802001953125
cout << "cdf(mynbdist, 8.) = " << cdf(mynbdist, 8.) << endl; // 0.027129956288263202
cout << "cdf(complement(mynbdist, 8.)) = " << cdf(complement(mynbdist, 8.)) << endl; // 0.9728700437117368
// Check that cdf plus its complement is unity.
cout << "cdf + complement = " << cdf(mynbdist, 8.) + cdf(complement(mynbdist, 8.)) << endl; // 1
// Note: No complement for pdf!
// Compare cdf with sum of pdfs.
double sum = 0.; // Calculate the sum of all the pdfs,
int k = 20; // for 20 failures
for(signed i = 0; i <= k; ++i)
{
sum += pdf(mynbdist, double(i));
}
// Compare with the cdf
double cdf8 = cdf(mynbdist, static_cast<double>(k));
double diff = sum - cdf8; // Expect the diference to be very small.
cout << setprecision(17) << "Sum pdfs = " << sum << ' ' // sum = 0.40025683281803698
<< ", cdf = " << cdf(mynbdist, static_cast<double>(k)) // cdf = 0.40025683281803687
<< ", difference = " // difference = 0.50000000000000000
<< setprecision(1) << diff/ (std::numeric_limits<double>::epsilon() * sum)
<< " in epsilon units." << endl;
// Note: Use boost::math::tools::epsilon rather than std::numeric_limits
// to cover RealTypes that do not specialize numeric_limits.
//[neg_binomial_example2
// Print a table of values that can be used to plot
// using Excel, or some other superior graphical display tool.
cout.precision(17); // Use max_digits10 precision, the maximum available for a reference table.
cout << showpoint << endl; // include trailing zeros.
// This is a maximum possible precision for the type (here double) to suit a reference table.
int maxk = static_cast<int>(2. * mynbdist.successes() / mynbdist.success_fraction());
// This maxk shows most of the range of interest, probability about 0.0001 to 0.999.
cout << "\n"" k pdf cdf""\n" << endl;
for (int k = 0; k < maxk; k++)
{
cout << right << setprecision(17) << showpoint
<< right << setw(3) << k << ", "
<< left << setw(25) << pdf(mynbdist, static_cast<double>(k))
<< left << setw(25) << cdf(mynbdist, static_cast<double>(k))
<< endl;
}
cout << endl;
//] [/ neg_binomial_example2]
return 0;
} // int main()
/*
Output is:
negative_binomial distribution - simple example 2
mean(mynbdist) = 24
mynbdist.successes() = 8
mynbdist.success_fraction() = 0.25
mynbdist.percent success = 25%
cdf(mynbdist, 2.) = 0.000415802001953125
cdf(mynbdist, 8.) = 0.027129956288263202
cdf(complement(mynbdist, 8.)) = 0.9728700437117368
cdf + complement = 1
Sum pdfs = 0.40025683281803692 , cdf = 0.40025683281803687, difference = 0.25 in epsilon units.
//[neg_binomial_example2_1
k pdf cdf
0, 1.5258789062500000e-005 1.5258789062500003e-005
1, 9.1552734375000000e-005 0.00010681152343750000
2, 0.00030899047851562522 0.00041580200195312500
3, 0.00077247619628906272 0.0011882781982421875
4, 0.0015932321548461918 0.0027815103530883789
5, 0.0028678178787231476 0.0056493282318115234
6, 0.0046602040529251142 0.010309532284736633
7, 0.0069903060793876605 0.017299838364124298
8, 0.0098301179241389001 0.027129956288263202
9, 0.013106823898851871 0.040236780187115073
10, 0.016711200471036140 0.056947980658151209
11, 0.020509200578089786 0.077457181236241013
12, 0.024354675686481652 0.10181185692272265
13, 0.028101548869017230 0.12991340579173993
14, 0.031614242477644432 0.16152764826938440
15, 0.034775666725408917 0.19630331499479325
16, 0.037492515688331451 0.23379583068312471
17, 0.039697957787645101 0.27349378847076977
18, 0.041352039362130305 0.31484582783290005
19, 0.042440250924291580 0.35728607875719176
20, 0.042970754060845245 0.40025683281803687
21, 0.042970754060845225 0.44322758687888220
22, 0.042482450037426581 0.48571003691630876
23, 0.041558918514873783 0.52726895543118257
24, 0.040260202311284021 0.56752915774246648
25, 0.038649794218832620 0.60617895196129912
26, 0.036791631035234917 0.64297058299653398
27, 0.034747651533277427 0.67771823452981139
28, 0.032575923312447595 0.71029415784225891
29, 0.030329307911589130 0.74062346575384819
30, 0.028054609818219924 0.76867807557206813
31, 0.025792141284492545 0.79447021685656061
32, 0.023575629142856460 0.81804584599941710
33, 0.021432390129869489 0.83947823612928651
34, 0.019383705779220189 0.85886194190850684
35, 0.017445335201298231 0.87630727710980494
36, 0.015628112784496322 0.89193538989430121
37, 0.013938587078064250 0.90587397697236549
38, 0.012379666154859701 0.91825364312722524
39, 0.010951243136991251 0.92920488626421649
40, 0.0096507830144735539 0.93885566927869002
41, 0.0084738582566109364 0.94732952753530097
42, 0.0074146259745345548 0.95474415350983555
43, 0.0064662435824429246 0.96121039709227851
44, 0.0056212231142827853 0.96683162020656122
45, 0.0048717266990450708 0.97170334690560634
46, 0.0042098073105878630 0.97591315421619418
47, 0.0036275999165703964 0.97954075413276465
48, 0.0031174686783026818 0.98265822281106729
49, 0.0026721160099737302 0.98533033882104104
50, 0.0022846591885275322 0.98761499800956853
51, 0.0019486798960970148 0.98956367790566557
52, 0.0016582516423517923 0.99122192954801736
53, 0.0014079495076571762 0.99262987905567457
54, 0.0011928461106539983 0.99382272516632852
55, 0.0010084971662802015 0.99483122233260868
56, 0.00085091948404891532 0.99568214181665760
57, 0.00071656377604119542 0.99639870559269883
58, 0.00060228420831048650 0.99700098980100937
59, 0.00050530624256557675 0.99750629604357488
60, 0.00042319397814867202 0.99792949002172360
61, 0.00035381791615708398 0.99828330793788067
62, 0.00029532382517950324 0.99857863176306016
63, 0.00024610318764958566 0.99882473495070978
//] [neg_binomial_example2_1 end of Quickbook]
*/