00001 #include "LinearFit.h"
00002
00003 template<typename Number>
00004 class PowerLawFit : public LinearFit<Number>
00005 {
00006 public:
00007 typedef map<Number, Number> Points;
00008
00009 PowerLawFit();
00010 PowerLawFit(Points * points);
00011 PowerLawFit(const PowerLawFit & fit);
00012 virtual ~PowerLawFit();
00013 const PowerLawFit & operator=(const PowerLawFit & fit);
00014 virtual void fit();
00015 virtual void fit(Points * points);
00016 const Number getExponent() const;
00017 const Number getCoefficient() const;
00018
00019 protected:
00021 Points * _data;
00023 Points _logData;
00025 Number _exponent;
00027 Number _coeff;
00028
00029 };
00030
00031 template<typename Number>
00032 PowerLawFit<Number>::PowerLawFit()
00033 : LinearFit<Number>(),_data(0),_exponent(0),_coeff(0)
00034 {}
00035
00036 template<typename Number>
00037 PowerLawFit<Number>::PowerLawFit(Points * points)
00038 : LinearFit<Number>(),_data(points),_exponent(0),_coeff(0)
00039 {
00040 }
00041
00042 template<typename Number>
00043 PowerLawFit<Number>::PowerLawFit(const PowerLawFit & fit)
00044 : LinearFit<Number>(fit), _data(fit._data),_exponent(fit._exponent),_coeff(fit._coeff)
00045 {}
00046
00047 template<typename Number>
00048 PowerLawFit<Number>::~PowerLawFit()
00049 {}
00050
00051 template<typename Number>
00052 const PowerLawFit<Number> & PowerLawFit<Number>::operator=(const PowerLawFit<Number> & fit)
00053 {
00054 LinearFit<Number>::operator=(fit);
00055 _data = fit._data;
00056 _exponent = fit._exponent;
00057 _coeff = fit._coeff;
00058 return *this;
00059 }
00060
00061 template<typename Number>
00062 void PowerLawFit<Number>::fit()
00063 {
00064 typename Points::const_iterator i;
00065 _logData.clear();
00066 double x,y;
00067 for (i=_data->begin();i!=_data->end();i++)
00068 {
00069 x = ::log(i->first);
00070 y = ::log(i->second);
00071 _logData[x]=y;
00072 }
00073 this->_points = &_logData;
00074 LinearFit<Number>::fit();
00075 _coeff = exp(this->_b);
00076 _exponent = this->_a;
00077 }
00078
00079 template<typename Number>
00080 void PowerLawFit<Number>::fit(Points * points)
00081 {
00082 _data = points;
00083 fit();
00084 }
00085
00086 template<typename Number>
00087 const Number PowerLawFit<Number>::getExponent() const
00088 {
00089 return _exponent;
00090 }
00091
00092 template<typename Number>
00093 const Number PowerLawFit<Number>::getCoefficient() const
00094 {
00095 return _coeff;
00096 }