Sophie

Sophie

distrib > Mageia > 5 > i586 > by-pkgid > dc51b8a2b4c20bd1ac1b9c8f81249719 > files > 1873

boost-examples-1.55.0-8.mga5.noarch.rpm

// 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]

*/