mirror of
				https://github.com/saitohirga/WSJT-X.git
				synced 2025-10-31 04:50:34 -04:00 
			
		
		
		
	
		
			
				
	
	
		
			172 lines
		
	
	
		
			6.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			172 lines
		
	
	
		
			6.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| // inverse_chi_squared_distribution_example.cpp
 | |
| 
 | |
| // Copyright Paul A. Bristow 2010.
 | |
| // Copyright Thomas Mang 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)
 | |
| 
 | |
| // Example 1 of using inverse chi squared distribution
 | |
| #include <boost/math/distributions/inverse_chi_squared.hpp>
 | |
| using boost::math::inverse_chi_squared_distribution;  // inverse_chi_squared_distribution.
 | |
| using boost::math::inverse_chi_squared; //typedef for nverse_chi_squared_distribution double.
 | |
| 
 | |
| #include <iostream>
 | |
| using std::cout;    using std::endl;
 | |
| #include <iomanip> 
 | |
| using std::setprecision;
 | |
| using std::setw;
 | |
| #include <cmath>
 | |
| using std::sqrt;
 | |
| 
 | |
| template <class RealType>
 | |
| RealType naive_pdf1(RealType df, RealType x)
 | |
| { // Formula from Wikipedia http://en.wikipedia.org/wiki/Inverse-chi-square_distribution
 | |
|   // definition 1 using tgamma for simplicity as a check.
 | |
|    using namespace std; // For ADL of std functions.
 | |
|    using boost::math::tgamma;
 | |
|    RealType df2 = df / 2;
 | |
|    RealType result = (pow(2., -df2) * pow(x, (-df2 -1)) * exp(-1/(2 * x) ) )
 | |
|       / tgamma(df2);  // 
 | |
|    return result;
 | |
| }
 | |
| 
 | |
| template <class RealType>
 | |
| RealType naive_pdf2(RealType df, RealType x)
 | |
| { // Formula from Wikipedia http://en.wikipedia.org/wiki/Inverse-chi-square_distribution
 | |
|   // Definition 2, using tgamma for simplicity as a check.
 | |
|   // Not scaled, so assumes scale = 1 and only uses nu aka df.
 | |
|    using namespace std; // For ADL of std functions.
 | |
|    using boost::math::tgamma;
 | |
|    RealType df2 = df / 2;
 | |
|    RealType result = (pow(df2, df2) * pow(x, (-df2 -1)) * exp(-df/(2*x) ) )
 | |
|      / tgamma(df2);
 | |
|    return result;
 | |
| }
 | |
| 
 | |
| template <class RealType>
 | |
| RealType naive_pdf3(RealType df, RealType scale, RealType x)
 | |
| { // Formula from Wikipedia http://en.wikipedia.org/wiki/Scaled-inverse-chi-square_distribution
 | |
|   // *Scaled* version, definition 3, df aka nu, scale aka sigma^2
 | |
|   // using tgamma for simplicity as a check.
 | |
|    using namespace std; // For ADL of std functions.
 | |
|    using boost::math::tgamma;
 | |
|    RealType df2 = df / 2;
 | |
|    RealType result = (pow(scale * df2, df2) * exp(-df2 * scale/x) ) 
 | |
|      / (tgamma(df2) * pow(x, 1+df2));
 | |
|    return result;
 | |
| }
 | |
| 
 | |
| template <class RealType>
 | |
| RealType naive_pdf4(RealType df, RealType scale, RealType x)
 | |
| { // Formula from http://mathworld.wolfram.com/InverseChi-SquaredDistribution.html
 | |
|   // Weisstein, Eric W. "Inverse Chi-Squared Distribution." From MathWorld--A Wolfram Web Resource.
 | |
|   // *Scaled* version, definition 3, df aka nu, scale aka sigma^2
 | |
|   // using tgamma for simplicity as a check.
 | |
|    using namespace std; // For ADL of std functions.
 | |
|    using boost::math::tgamma;
 | |
|    RealType nu = df; // Wolfram uses greek symbols nu,
 | |
|    RealType xi = scale; // and xi.
 | |
|    RealType result = 
 | |
|      pow(2, -nu/2) *  exp(- (nu * xi)/(2 * x)) * pow(x, -1-nu/2) * pow((nu * xi), nu/2) 
 | |
|      / tgamma(nu/2);
 | |
|    return result;
 | |
| }
 | |
| 
 | |
| int main()
 | |
| {
 | |
| 
 | |
|   cout << "Example (basic) using Inverse chi squared distribution. " << endl;
 | |
| 
 | |
|   // TODO find a more practical/useful example.  Suggestions welcome?
 | |
| 
 | |
| #ifdef BOOST_NO_CXX11_NUMERIC_LIMITS
 | |
|   int max_digits10 = 2 + (boost::math::policies::digits<double, boost::math::policies::policy<> >() * 30103UL) / 100000UL;
 | |
|   cout << "BOOST_NO_CXX11_NUMERIC_LIMITS is defined" << endl; 
 | |
| #else 
 | |
|   int max_digits10 = std::numeric_limits<double>::max_digits10;
 | |
| #endif
 | |
|   cout << "Show all potentially significant decimal digits std::numeric_limits<double>::max_digits10 = "
 | |
|     << max_digits10 << endl; 
 | |
|   cout.precision(max_digits10); // 
 | |
| 
 | |
|   inverse_chi_squared ichsqdef; // All defaults  - not very useful!
 | |
|   cout << "default df = " << ichsqdef.degrees_of_freedom()
 | |
|     << ", default scale = " <<  ichsqdef.scale() << endl; //  default df = 1, default scale = 0.5
 | |
| 
 | |
|    inverse_chi_squared ichsqdef4(4); // Unscaled version, default scale = 1 / degrees_of_freedom
 | |
|    cout << "default df = " << ichsqdef4.degrees_of_freedom()
 | |
|     << ", default scale = " <<  ichsqdef4.scale() << endl; //  default df = 4, default scale = 2
 | |
| 
 | |
|    inverse_chi_squared ichsqdef32(3, 2); // Scaled version, both degrees_of_freedom and scale specified.
 | |
|    cout << "default df = " << ichsqdef32.degrees_of_freedom()
 | |
|     << ", default scale = " <<  ichsqdef32.scale() << endl; // default df = 3, default scale = 2
 | |
| 
 | |
|   {
 | |
|     cout.precision(3);
 | |
|     double nu = 5.;
 | |
|     //double scale1 = 1./ nu; // 1st definition sigma^2 = 1/df;
 | |
|     //double scale2 = 1.; // 2nd definition sigma^2 = 1
 | |
|     inverse_chi_squared ichsq(nu, 1/nu); // Not scaled
 | |
|     inverse_chi_squared sichsq(nu, 1/nu); // scaled
 | |
| 
 | |
|     cout << "nu = " << ichsq.degrees_of_freedom() << ", scale = " << ichsq.scale() << endl;
 | |
| 
 | |
|     int width = 8;
 | |
| 
 | |
|     cout << "     x        pdf      pdf1   pdf2  pdf(scaled)    pdf       pdf      cdf     cdf" << endl;
 | |
|     for (double x = 0.0; x < 1.; x += 0.1)
 | |
|     {
 | |
|       cout 
 | |
|         << setw(width) << x 
 | |
|         << ' ' << setw(width) << pdf(ichsq, x) // unscaled
 | |
|         << ' ' << setw(width) << naive_pdf1(nu,  x) // Wiki def 1 unscaled matches graph 
 | |
|         << ' ' << setw(width) << naive_pdf2(nu,  x) // scale = 1 - 2nd definition.
 | |
|         << ' ' << setw(width) << naive_pdf3(nu, 1/nu, x) // scaled 
 | |
|         << ' ' << setw(width) << naive_pdf4(nu, 1/nu, x) // scaled 
 | |
|         << ' ' << setw(width) << pdf(sichsq, x)  // scaled
 | |
|         << ' ' << setw(width) << cdf(sichsq, x)  // scaled
 | |
|         << ' ' << setw(width) << cdf(ichsq, x)  // unscaled
 | |
|        << endl;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   cout.precision(max_digits10);
 | |
| 
 | |
|   inverse_chi_squared ichisq(2., 0.5);
 | |
|   cout << "pdf(ichisq, 1.) = " << pdf(ichisq, 1.) << endl;
 | |
|   cout << "cdf(ichisq, 1.) = " << cdf(ichisq, 1.) << endl;
 | |
| 
 | |
|   return 0;
 | |
| }  // int main()
 | |
| 
 | |
| /*
 | |
| 
 | |
| Output is:
 | |
|  Example (basic) using Inverse chi squared distribution. 
 | |
|   Show all potentially significant decimal digits std::numeric_limits<double>::max_digits10 = 17
 | |
|   default df = 1, default scale = 1
 | |
|   default df = 4, default scale = 0.25
 | |
|   default df = 3, default scale = 2
 | |
|   nu = 5, scale = 0.2
 | |
|        x        pdf      pdf1   pdf2  pdf(scaled)    pdf       pdf      cdf     cdf
 | |
|          0        0    -1.#J    -1.#J    -1.#J    -1.#J        0        0        0
 | |
|        0.1     2.83     2.83 3.26e-007     2.83     2.83     2.83   0.0752   0.0752
 | |
|        0.2     3.05     3.05  0.00774     3.05     3.05     3.05    0.416    0.416
 | |
|        0.3      1.7      1.7    0.121      1.7      1.7      1.7    0.649    0.649
 | |
|        0.4    0.941    0.941    0.355    0.941    0.941    0.941    0.776    0.776
 | |
|        0.5    0.553    0.553    0.567    0.553    0.553    0.553    0.849    0.849
 | |
|        0.6    0.345    0.345    0.689    0.345    0.345    0.345    0.893    0.893
 | |
|        0.7    0.227    0.227    0.728    0.227    0.227    0.227    0.921    0.921
 | |
|        0.8    0.155    0.155    0.713    0.155    0.155    0.155     0.94     0.94
 | |
|        0.9     0.11     0.11    0.668     0.11     0.11     0.11    0.953    0.953
 | |
|          1   0.0807   0.0807     0.61   0.0807   0.0807   0.0807    0.963    0.963
 | |
|   pdf(ichisq, 1.) = 0.30326532985631671
 | |
|   cdf(ichisq, 1.) = 0.60653065971263365
 | |
| 
 | |
| 
 | |
| */
 | |
| 
 |