40 #include "gsl/gsl_deriv.h"
47 Derivator::Derivator() {
48 fDerivator =
new GSLDerivator();
51 Derivator::Derivator(
const IGenFunction &f)
54 fDerivator =
new GSLDerivator();
55 fDerivator->SetFunction(f);
58 Derivator::Derivator(
const GSLFuncPointer &f,
void * p)
61 fDerivator =
new GSLDerivator();
62 fDerivator->SetFunction(f,p);
66 Derivator::~Derivator()
68 if (fDerivator)
delete fDerivator;
72 Derivator::Derivator(
const Derivator &)
76 Derivator & Derivator::operator = (
const Derivator &rhs)
78 if (
this == &rhs)
return *
this;
84 void Derivator::SetFunction(
const IGenFunction &f) {
85 fDerivator->SetFunction(f);
88 void Derivator::SetFunction(
const GSLFuncPointer &f,
void * p) {
89 fDerivator->SetFunction(f,p);
93 double Derivator::Eval(
double x,
double h)
const {
94 return fDerivator->EvalCentral(x, h);
97 double Derivator::EvalCentral(
double x,
double h)
const {
98 return fDerivator->EvalCentral(x, h);
101 double Derivator::EvalForward(
double x,
double h)
const {
102 return fDerivator->EvalForward(x, h);
105 double Derivator::EvalBackward(
double x,
double h)
const {
106 return fDerivator->EvalBackward(x, h);
110 double Derivator::Eval(
const IGenFunction & f,
double x,
double h ) {
111 return GSLDerivator::EvalCentral(f, x, h );
114 double Derivator::EvalCentral(
const IGenFunction & f,
double x,
double h) {
115 return GSLDerivator::EvalCentral(f,x,h);
118 double Derivator::EvalForward(
const IGenFunction & f,
double x,
double h) {
119 return GSLDerivator::EvalForward(f, x, h);
122 double Derivator::EvalBackward(
const IGenFunction & f,
double x,
double h) {
123 return GSLDerivator::EvalBackward(f, x, h);
126 double Derivator::Eval(
const IMultiGenFunction & f,
const double * x,
unsigned int icoord,
double h ) {
129 OneDimMultiFunctionAdapter<> adapter(f,x,icoord);
130 d.SetFunction( &GSLFunctionAdapter<OneDimMultiFunctionAdapter<> >::F,static_cast<void *>(&adapter) );
131 return d.EvalCentral(x[icoord],h);
134 double Derivator::Eval(IParamFunction & f,
double x,
const double * p,
unsigned int ipar,
double h ) {
138 OneDimParamFunctionAdapter<IParamFunction &> adapter(f,&xx,p,ipar);
139 d.SetFunction( &GSLFunctionAdapter<OneDimParamFunctionAdapter<IParamFunction &> >::F,static_cast<void *>(&adapter) );
140 return d.EvalCentral(p[ipar],h);
143 double Derivator::Eval(IParamMultiFunction & f,
const double * x,
const double * p,
unsigned int ipar,
double h ) {
146 OneDimParamFunctionAdapter<IParamMultiFunction &> adapter(f,x,p,ipar);
147 d.SetFunction( &GSLFunctionAdapter<OneDimParamFunctionAdapter<IParamMultiFunction &> >::F,static_cast<void *>(&adapter) );
148 return d.EvalCentral(p[ipar],h);
152 double Derivator::Result()
const {
return fDerivator->Result(); }
154 double Derivator::Error()
const {
return fDerivator->Error(); }
156 int Derivator::Status()
const {
return fDerivator->Status(); }