Gaussian.cxx
Go to the documentation of this file.
1 
12 #ifdef _MSC_VER
13 #include "msdevstudio/MSconfig.h"
14 #endif
15 
16 #include "Gaussian.h"
17 
18 #include "FunctionHelper.h"
19 
20 #include <cmath>
21 #include <cassert>
22 
23 using std::distance;
24 
25 #ifdef ITERATOR_MEMBER_DEFECT
26 using namespace std;
27 #else
28 using std::exp;
29 using std::vector;
30 #endif
31 
32 using namespace hippodraw;
33 
34 Gaussian::Gaussian ( )
35 {
36  initialize ();
37 }
38 
39 Gaussian::Gaussian ( double n, double m, double s )
40 {
41  initialize ();
42 
43  m_parms[norm] = n;
44  m_parms[mean] = m;
45  m_parms[sigma] = s;
46 }
47 
48 void Gaussian::initialize ()
49 {
50  m_name = "Gaussian";
51 
52  m_parm_names.push_back ( "Norm" );
53  m_parm_names.push_back ( "Mean" );
54  m_parm_names.push_back ( "Sigma" );
55 
56  resize ();
57 }
58 
60 {
61  return new Gaussian ( *this );
62 }
63 
64 double Gaussian::operator () ( double x ) const
65 {
66  double value = 0.0;
67  if ( m_parms[sigma] != 0.0 ) {
68  double t = ( x - m_parms[mean] ) / m_parms[sigma];
69  t = 0.5 * t*t;
70  if ( fabs ( t ) < 50.0 ) {
71  value = exp ( -t ) / ( 2.50662828 * m_parms[sigma] );
72  }
73  } // sigma == 0.
74  else {
75  if ( x == m_parms[mean] ) value = 1.0;
76  }
77  return value * m_parms[norm];
78 }
79 
80 /* virtual */
81 void
82 Gaussian::
83 initialParameters ( const FunctionHelper * helper )
84 {
85  double min_x = helper->minCoord ();
86  double max_x = helper->maxCoord ();
87  int size = helper->size();
88  double total = helper->getTotal ();
89 
90  m_parms[norm] = total * ( max_x - min_x ) / size;
91  m_parms[mean] = helper->meanCoord ();
92  m_parms[sigma] = helper->stdCoord ();
93 }
94 
95 double Gaussian::derivByParm ( int i, double x ) const
96 {
97  switch ( i ) {
98  case norm :
99  return derivByNorm ( x );
100  break;
101 
102  case mean :
103  return derivByMean ( x );
104  break;
105 
106  case sigma :
107  return derivBySigma ( x );
108  break;
109 
110  default :
111  assert ( false );
112  break;
113  }
114  return 0.0;
115 }
116 
117 double Gaussian::derivByNorm ( double x ) const
118 {
119  if ( m_parms[sigma] != 0.0 ) {
120  double t = ( x - m_parms[mean] ) / m_parms[sigma];
121  t = 0.5 * t*t;
122  if ( fabs ( t ) > 50.0 ) {
123  return 0.0;
124  }
125  else {
126  return exp ( -t ) / ( 2.50662828 * m_parms[sigma] );
127  }
128  } // sigma == 0.0
129  else {
130  if ( x != m_parms[mean] ) {
131  return 0.0;
132  } else {
133  return 1.0;
134  }
135  }
136 }
137 
138 double Gaussian::derivByMean ( double x ) const
139 {
140  double dx = x - m_parms[mean];
141  if ( m_parms[sigma] != 0.0 ) {
142  return m_parms[norm] * dx
143  * exp ( -dx*dx / ( 2.0 * m_parms[sigma] * m_parms[sigma] ) )
144  / ( 2.50662828 * m_parms[sigma] * m_parms[sigma] * m_parms[sigma] );
145  }
146  else {
147  if ( x != m_parms[mean] ) return 0.0;
148  else return 1.0;
149  }
150 }
151 
152 double Gaussian::derivBySigma ( double x ) const
153 {
154  if ( m_parms[sigma] == 0.0 ) return 0.0;
155  double dx = x - m_parms[mean];
156  double p2 = m_parms[sigma] * m_parms[sigma];
157  double ex = exp ( -dx*dx / ( 2.0 * p2 ) );
158  return m_parms[norm] * ( dx*dx * ex / ( p2*p2) - ex / p2 ) / 2.50662828;
159 }
160 

Generated for HippoDraw Class Library by doxygen