00001 #pragma ident "$Id: GaussianDistribution.cpp 1389 2008-09-04 17:06:43Z ckiesch $"
00002
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032 #include "GaussianDistribution.hpp"
00033
00034
00035 using namespace std;
00036
00037 namespace gpstk
00038 {
00039
00040
00041
00042
00043
00044 GaussianDistribution::GaussianDistribution()
00045 : mean(0.0), sigma(1.0)
00046 {
00047
00048 recompute();
00049
00050 }
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061 GaussianDistribution::GaussianDistribution( double mu,
00062 double sig )
00063 : mean(mu), sigma(sig)
00064 {
00065
00066 recompute();
00067
00068 }
00069
00070
00071
00072
00073
00074
00075
00076 double GaussianDistribution::pdf(double x)
00077 {
00078
00079 return ( a * exp( b * (x - mean) * (x - mean) ) );
00080
00081 }
00082
00083
00084
00085
00086
00087
00088
00089 double GaussianDistribution::cdf(double x)
00090 {
00091
00092 return ( 0.5 *
00093 ( 1.0
00094 + gpstk::erf( 0.70710678118654746 * (x - mean)/sigma ) ) );
00095
00096 }
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106 double GaussianDistribution::invcdf(double p)
00107 throw(InvalidParameter)
00108 {
00109
00110 double inf( 9.0e+99 );
00111
00112
00113 if( ( p < 0.0 ) ||
00114 ( p > 1.0 ) )
00115 {
00116 InvalidParameter e( "Invalid input value for 'p'." );
00117 GPSTK_THROW(e);
00118 }
00119
00120 if( p == 0.0 ) return -inf;
00121 if( p == 1.0 ) return inf;
00122
00123
00124 return ( mean
00125 + 1.4142135623730951 * sigma * gpstk::inverf( 2.0 * p - 1.0 ) );
00126
00127 }
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137 GaussianDistribution& GaussianDistribution::setSigma(double sig)
00138 {
00139
00140 if( sig <= 0.0 )
00141 {
00142 sig = 1.0;
00143 }
00144
00145 sigma = sig;
00146
00147 recompute();
00148
00149 return (*this);
00150
00151 }
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162 GaussianDistribution& GaussianDistribution::setParameters( double mu,
00163 double sig )
00164 {
00165
00166 mean = mu;
00167
00168
00169 setSigma(sig);
00170
00171 return (*this);
00172
00173 }
00174
00175
00176
00177
00178 void GaussianDistribution::recompute(void)
00179 {
00180
00181
00182 if( sigma <= 0.0)
00183 {
00184 sigma = 1.0;
00185 }
00186
00187 a = 0.3989422804014327 / sigma;
00188 b = -0.5 / (sigma*sigma);
00189
00190 return;
00191
00192 }
00193
00194
00195
00196 }