00001
00002
00003
00004 #ifndef ROOT_TNumDeriv
00005 #define ROOT_TNumDeriv
00006 #include <math.h>
00007 #include "TNamed.h"
00008
00009 class TNumDeriv : public TNamed {
00010 public:
00011 TNumDeriv(const char *name):TNamed(name,"") {fStep=0.01;fIArg=0;fOutLim=0;};
00012 virtual ~TNumDeriv(){}
00013 virtual Double_t Fcn(Double_t add=0.)=0;
00014 Double_t DFcn(Double_t add=0.);
00015 void SetOutLimit(int lim=1) {fOutLim=lim ;}
00016 void SetStep(Double_t step) {fStep =step ;}
00017 void SetIArg(Int_t iarg) {fIArg =iarg ;}
00018 Int_t GetIArg() {return fIArg ;}
00019
00020 Double_t GetStep() {return fStep ;}
00021 static Double_t Tiny();
00022 static Double_t Epsilon();
00023
00024 private:
00025 double numericalDerivative( double x ,double &delta, double &error);
00026
00027 protected:
00028 Double_t fStep;
00029 Int_t fIArg;
00030 Int_t fOutLim;
00031 static Double_t fgTiny;
00032 static Double_t fgEpsilon;
00033 ClassDef(TNumDeriv,0)
00034 };
00035
00036
00037
00038 class TNumDeriv1Test : public TNumDeriv {
00039 public:
00040 TNumDeriv1Test(double x) :TNumDeriv("DerivTest") {fX=x;SetStep(1e-3);}
00041 virtual ~TNumDeriv1Test(){};
00042
00043 virtual Double_t Fcn(Double_t arg){return pow(fX+arg,3);}
00044
00045 double fX;
00046 ClassDef(TNumDeriv1Test,0)
00047 };
00048
00049 class TNumDeriv2Test : public TNumDeriv {
00050 public:
00051 TNumDeriv2Test(double x) :TNumDeriv("DerivTest") {fDT=new TNumDeriv1Test(x);fDT->SetStep(0.1);}
00052 virtual ~TNumDeriv2Test() {delete fDT;};
00053 virtual Double_t Fcn(Double_t arg){return fDT->DFcn(arg);}
00054
00055 TNumDeriv1Test *fDT;
00056 ClassDef(TNumDeriv2Test,0)
00057 };
00058
00059
00060 #ifdef __CINT__
00061 #pragma link off all globals;
00062 #pragma link off all classes;
00063 #pragma link off all functions;
00064 #pragma link C++ class TNumDeriv;
00065 #pragma link C++ class TNumDeriv1Test;
00066 #pragma link C++ class TNumDeriv2Test;
00067 #endif
00068
00069
00070 #endif //ROOT_TNumDeriv
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083