00001 #ifndef TEMPLATE_FITTING_QUADRATICFIT_H
00002 #define TEMPLATE_FITTING_QUADRATICFIT_H
00003
00004 #include <iterator>
00005 #include "debug_tools.h"
00006
00007 namespace functions{
00008
00014 class QuadraticFit{
00015
00016 public:
00018 QuadraticFit(int length):fN(length+(length+1)%2),fX2(0),fX4(0){
00019 int range=(fN-1)/2;
00020 for(double x= -range; x <= range; ++x){
00021 fX2+=x*x;
00022 fX4+=x*x*x*x;
00023 }
00024 fDet=fX4*fN*fX2 - fX2*fX2*fX2;
00025 }
00026
00033 template <typename InputIterator>
00034 void Fit(InputIterator i_in, double& a, double& b, double& c){
00035 double Sy=0, Sxy=0, Sx2y=0, y=0;
00036 int range=(fN-1)/2;
00037 for(double x= -range; x <= range; ++x){
00038 y=*i_in;
00039 Sy+=y;
00040 Sxy+=x*y;
00041 Sx2y+=x*x*y;
00042
00043 ++i_in;
00044 }
00045 double Da=Sx2y*fX2*fN - Sy *fX2*fX2;
00046 double Db=Sxy *fX4*fN - Sxy *fX2*fX2;
00047 double Dc=Sy *fX4*fX2 - Sx2y*fX2*fX2;
00048 a=Da/fDet;
00049 b=Db/fDet;
00050 c=Dc/fDet;
00051 }
00052
00053 int GetSize()const{return fN;}
00054 private:
00055 int fN;
00056 double fDet, fX2, fX4;
00057 };
00058
00059 }
00060
00061 #endif // TEMPLATE_FITTING_QUADRATICFIT_H