PowerLaw.cxx
Go to the documentation of this file.
1 
12 #ifdef _MSC_VER
13 #include "msdevstudio/MSconfig.h"
14 #endif
15 
16 #include "PowerLaw.h"
17 
18 #include "FunctionHelper.h"
19 
20 #include <cmath>
21 #include <cassert>
22 
23 #ifdef ITERATOR_MEMBER_DEFECT
24 using namespace std;
25 #else
26 using std::max;
27 using std::vector;
28 #endif
29 
30 namespace hippodraw {
31 
32 PowerLaw::PowerLaw ( )
33 {
34  initialize ();
35 }
36 
37 PowerLaw::PowerLaw ( double prefactor, double index )
38 {
39  initialize ();
40 
41  m_parms[0] = prefactor;
42  m_parms[1] = index;
43 }
44 
45 void PowerLaw::initialize ()
46 {
47  m_name = "PowerLaw";
48  m_parm_names.push_back ( "Prefactor" );
49  m_parm_names.push_back ( "Index" );
50 
51  resize ();
52 }
53 
55 {
56  return new PowerLaw ( *this );
57 }
58 
59 double PowerLaw::operator () ( double x ) const
60 {
61  return m_parms[0]*pow(x, m_parms[1]);
62 }
63 
64 /* virtual */
65 void
66 PowerLaw::
67 initialParameters ( const FunctionHelper * helper )
68 {
69  double min_x = helper->minCoord ();
70  double max_x = helper->maxCoord ();
71  max_x = (min_x + max_x)/2.;
72 
73  double min_y, max_y;
74  try {
75  min_y = helper->valueAt(min_x);
76  max_y = helper->valueAt(max_x);
77  if (min_y != 0 && max_y != 0) {
78  m_parms[1] = log( max_y/min_y ) / log( max_x/min_x );
79  m_parms[0] = max_y/pow(max_x, m_parms[1]);
80  return;
81  }
82  } catch (...) {
83 // do nothing
84  }
85 
86 // default behavior
87  min_y = max(helper->minValue(), 1.);
88  max_y = helper->maxValue();
89  m_parms[1] = log( max_y/min_y ) / log( max_x/min_x );
90  m_parms[0] = max_y/pow(max_x, m_parms[1]);
91 }
92 
93 double PowerLaw::derivByParm ( int i, double x ) const
94 {
95  switch ( i ) {
96  case 0 :
97  return pow(x, m_parms[1]);
98  break;
99 
100  case 1 :
101  return m_parms[0]*pow(x, m_parms[1])*log(x);
102  break;
103 
104  default:
105  assert ( false );
106  break;
107  }
108  return 0.0;
109 }
110 
111 } // namespace hippodraw
112 

Generated for HippoDraw Class Library by doxygen