PowerLaw.cxx

Go to the documentation of this file.
00001 
00012 #ifdef _MSC_VER
00013 #include "msdevstudio/MSconfig.h"
00014 #endif
00015 
00016 #include "PowerLaw.h"
00017 
00018 #include "FunctionHelper.h"
00019 
00020 #include <cmath>
00021 #include <cassert>
00022 
00023 #ifdef ITERATOR_MEMBER_DEFECT
00024 using namespace std;
00025 #else
00026 using std::max;
00027 using std::vector;
00028 #endif
00029 
00030 namespace hippodraw {
00031 
00032 PowerLaw::PowerLaw ( )
00033 {
00034   initialize ();
00035 }
00036 
00037 PowerLaw::PowerLaw ( double prefactor, double index )
00038 {
00039   initialize ();
00040 
00041   m_parms[0] = prefactor;
00042   m_parms[1] = index;
00043 }
00044 
00045 void PowerLaw::initialize ()
00046 {
00047   m_name = "PowerLaw";
00048   m_parm_names.push_back ( "Prefactor" );
00049   m_parm_names.push_back ( "Index" );
00050 
00051   resize ();
00052 }
00053 
00054 FunctionBase * PowerLaw::clone () const
00055 {
00056   return new PowerLaw ( *this );
00057 }
00058 
00059 double PowerLaw::operator () ( double x ) const
00060 {
00061    return m_parms[0]*pow(x, m_parms[1]);
00062 }
00063 
00064 /* virtual */
00065 void 
00066 PowerLaw::
00067 initialParameters ( const FunctionHelper * helper )
00068 {
00069   double min_x = helper->minCoord ();
00070   double max_x = helper->maxCoord ();
00071   max_x = (min_x + max_x)/2.;
00072 
00073   double min_y, max_y;
00074   try {
00075      min_y = helper->valueAt(min_x);
00076      max_y = helper->valueAt(max_x);
00077      if (min_y != 0 && max_y != 0) {
00078         m_parms[1] = log( max_y/min_y ) / log( max_x/min_x );
00079         m_parms[0] = max_y/pow(max_x, m_parms[1]);
00080         return;
00081      }
00082   } catch (...) {
00083 // do nothing
00084   }
00085 
00086 // default behavior
00087   min_y = max(helper->minValue(), 1.);
00088   max_y = helper->maxValue();
00089   m_parms[1] = log( max_y/min_y ) / log( max_x/min_x );
00090   m_parms[0] = max_y/pow(max_x, m_parms[1]);
00091 }
00092 
00093 double PowerLaw::derivByParm ( int i, double x ) const
00094 {
00095   switch ( i ) {
00096   case 0 :
00097     return pow(x, m_parms[1]);
00098     break;
00099 
00100   case 1 :
00101      return m_parms[0]*pow(x, m_parms[1])*log(x);
00102     break;
00103 
00104   default:
00105     assert ( false );
00106     break;
00107   }
00108   return 0.0;
00109 }
00110 
00111 } // namespace hippodraw
00112 

Generated for HippoDraw Class Library by doxygen