00001 #ifndef ROOT_TRadSpline
00002 #define ROOT_TRadSpline
00003
00004 class TRadSpline {
00005 protected:
00006 double fDelta;
00007 double fXmin;
00008 double fXmax;
00009 int fNp;
00010 bool fKstep;
00011 int fNpx;
00012
00013 virtual void BuildCoeff()=0;
00014
00015 public:
00016 TRadSpline() : fDelta(-1), fXmin(0), fXmax(0),
00017 fNp(0), fKstep(false), fNpx(100) {}
00018 TRadSpline(const char *title, double delta, double xmin,
00019 double xmax, int np, bool step) :
00020 fDelta(delta), fXmin(xmin),
00021 fXmax(xmax), fNp(np), fKstep(step),
00022 fNpx(100) {}
00023 virtual ~TRadSpline() {}
00024 virtual void GetKnot(int i, double &x, double &y) const =0;
00025
00026 virtual int GetNpx() const {return fNpx;}
00027
00028 virtual double Eval(double x) const=0;
00029 virtual void SaveAs(const char * ) const {;}
00030 void SetNpx(int n) {fNpx=n;}
00031
00032 };
00033
00034
00035
00036 class TRadSplinePoly {
00037 protected:
00038 double fX;
00039 double fY;
00040 public:
00041 TRadSplinePoly() :
00042 fX(0), fY(0) {}
00043 TRadSplinePoly(double x, double y) :
00044 fX(x), fY(y) {}
00045 virtual ~TRadSplinePoly() {}
00046 double &X() {return fX;}
00047 double &Y() {return fY;}
00048 void GetKnot(double &x, double &y) const {x=fX; y=fY;}
00049
00050 virtual double Eval(double) const {return fY;}
00051
00052 };
00053
00054
00055
00056 class TRadSplinePoly3 : public TRadSplinePoly {
00057 private:
00058 double fB;
00059 double fC;
00060 double fD;
00061 public:
00062 TRadSplinePoly3() :
00063 fB(0), fC(0), fD(0) {}
00064 TRadSplinePoly3(double x, double y, double b, double c, double d) :
00065 TRadSplinePoly(x,y), fB(b), fC(c), fD(d) {}
00066 double &B() {return fB;}
00067 double &C() {return fC;}
00068 double &D() {return fD;}
00069 double Eval(double x) const {
00070 double dx=x-fX;
00071 return (fY+dx*(fB+dx*(fC+dx*fD)));
00072 }
00073 double Derivative(double x) const {
00074 double dx=x-fX;
00075 return (fB+2*fC*dx+3*fD*dx*dx);
00076 }
00077
00078 };
00079
00080
00081
00082 class TRadSplinePoly5 : public TRadSplinePoly {
00083 private:
00084 double fB;
00085 double fC;
00086 double fD;
00087 double fE;
00088 double fF;
00089 public:
00090 TRadSplinePoly5() :
00091 fB(0), fC(0), fD(0), fE(0), fF(0) {}
00092 TRadSplinePoly5(double x, double y, double b, double c,
00093 double d, double e, double f) :
00094 TRadSplinePoly(x,y), fB(b), fC(c), fD(d), fE(e), fF(f) {}
00095 double &B() {return fB;}
00096 double &C() {return fC;}
00097 double &D() {return fD;}
00098 double &E() {return fE;}
00099 double &F() {return fF;}
00100 double Eval(double x) const {
00101 double dx=x-fX;
00102 return (fY+dx*(fB+dx*(fC+dx*(fD+dx*(fE+dx*fF)))));
00103 }
00104 double Derivative(double x) const{
00105 double dx=x-fX;
00106 return (fB+2*fC*dx+3*fD*dx*dx+4*fE*dx*dx*dx+5*fF*dx*dx*dx*dx);
00107 }
00108
00109 };
00110
00111
00112
00113 class TRadSpline3 : public TRadSpline {
00114 private:
00115 TRadSplinePoly3 *fPoly;
00116 double fValBeg;
00117 double fValEnd;
00118 int fBegCond;
00119 int fEndCond;
00120
00121 void BuildCoeff();
00122 void SetCond(const char *opt);
00123
00124 public:
00125 TRadSpline3() : fPoly(0), fValBeg(0), fValEnd(0),
00126 fBegCond(-1), fEndCond(-1) {}
00127 TRadSpline3(const char *title,
00128 double x[], double y[], int n, const char *opt=0,
00129 double valbeg=0, double valend=0);
00130 TRadSpline3(const char *title,
00131 double xmin, double xmax,
00132 double y[], int n, const char *opt=0,
00133 double valbeg=0, double valend=0);
00134 TRadSpline3(const char *title,
00135 double xmin, double xmax,
00136 double (*func)(const double&), int n, const char *opt=0,
00137 double valbeg=0, double valend=0);
00138 int FindX(double x) const;
00139 double Eval(double x) const;
00140 double Derivative(double x) const;
00141 virtual ~TRadSpline3() {if (fPoly) delete [] fPoly;}
00142 void GetCoeff(int i, double &x, double &y, double &b,
00143 double &c, double &d) {x=fPoly[i].X();y=fPoly[i].Y();
00144 b=fPoly[i].B();c=fPoly[i].C();d=fPoly[i].D();}
00145 void GetKnot(int i, double &x, double &y) const
00146 {x=fPoly[i].X(); y=fPoly[i].Y();}
00147 virtual void SaveAs(const char *filename) const;
00148 static void Test();
00149
00150 };
00151
00152
00153
00154 class TRadSpline5 : public TRadSpline {
00155 private:
00156 TRadSplinePoly5 *fPoly;
00157
00158 void BuildCoeff();
00159 void BoundaryConditions(const char *opt, int &beg, int &end,
00160 const char *&cb1, const char *&ce1, const char *&cb2,
00161 const char *&ce2);
00162 void SetBoundaries(double b1, double e1, double b2, double e2,
00163 const char *cb1, const char *ce1, const char *cb2,
00164 const char *ce2);
00165
00166 public:
00167 TRadSpline5() : fPoly(0) {}
00168 TRadSpline5(const char *title,
00169 double x[], double y[], int n,
00170 const char *opt=0, double b1=0, double e1=0,
00171 double b2=0, double e2=0);
00172 TRadSpline5(const char *title,
00173 double xmin, double xmax,
00174 double y[], int n,
00175 const char *opt=0, double b1=0, double e1=0,
00176 double b2=0, double e2=0);
00177 TRadSpline5(const char *title,
00178 double xmin, double xmax,
00179 double(*func)(const double&),
00180 int n, const char *opt=0,
00181 double b1=0, double e1=0,
00182 double b2=0, double e2=0);
00183 int FindX(double x) const;
00184 double Eval(double x) const;
00185 double Derivative(double x) const;
00186 ~TRadSpline5() {if (fPoly) delete [] fPoly;}
00187 void GetCoeff(int i, double &x, double &y, double &b,
00188 double &c, double &d, double &e, double &f)
00189 {x=fPoly[i].X();y=fPoly[i].Y();b=fPoly[i].B();
00190 c=fPoly[i].C();d=fPoly[i].D();
00191 e=fPoly[i].E();f=fPoly[i].F();}
00192 void GetKnot(int i, double &x, double &y) const
00193 {x=fPoly[i].X(); y=fPoly[i].Y();}
00194 virtual void SaveAs(const char *filename) const;
00195 static void Test();
00196
00197 };
00198
00199 #endif