Logo ROOT   6.30.04
Reference Guide
 All Namespaces Files Pages
GSLDerivator.cxx
Go to the documentation of this file.
1 // @(#)root/mathmore:$Id$
2 // Authors: L. Moneta, A. Zsenei 08/2005
3 
4  /**********************************************************************
5  * *
6  * Copyright (c) 2004 ROOT Foundation, CERN/PH-SFT *
7  * *
8  * This library is free software; you can redistribute it and/or *
9  * modify it under the terms of the GNU General Public License *
10  * as published by the Free Software Foundation; either version 2 *
11  * of the License, or (at your option) any later version. *
12  * *
13  * This library is distributed in the hope that it will be useful, *
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of *
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
16  * General Public License for more details. *
17  * *
18  * You should have received a copy of the GNU General Public License *
19  * along with this library (see file COPYING); if not, write *
20  * to the Free Software Foundation, Inc., 59 Temple Place, Suite *
21  * 330, Boston, MA 02111-1307 USA, or contact the author. *
22  * *
23  **********************************************************************/
24 
25 // Implementation file for class GSLDerivator
26 //
27 // Created by: moneta at Sat Nov 13 14:46:00 2004
28 //
29 // Last update: Sat Nov 13 14:46:00 2004
30 //
31 
32 #include "GSLDerivator.h"
33 
34 #include "GSLFunctionWrapper.h"
35 // for GSL greater then 1.5
36 #include "gsl/gsl_deriv.h"
37 // for OLD GSL versions
38 //#include "gsl/gsl_diff.h"
39 
40 #include <iostream>
41 
42 namespace ROOT {
43 namespace Math {
44 
45 
46 
47 double GSLDerivator::EvalCentral( double x, double h) {
48  // Central evaluation using previously set function
49  if ( !fFunction.IsValid() ) {
50  std::cerr << "GSLDerivator: Error : The function has not been specified" << std::endl;
51  fStatus = -1;
52  return 0;
53  }
54  fStatus = gsl_deriv_central( fFunction.GetFunc(), x, h, &fResult, &fError);
55  return fResult;
56 }
57 
58 double GSLDerivator::EvalForward( double x, double h) {
59  // Forward evaluation using previously set function
60  if ( !fFunction.IsValid() ) {
61  std::cerr << "GSLDerivator: Error : The function has not been specified" << std::endl;
62  fStatus = -1;
63  return 0;
64  }
65  fStatus = gsl_deriv_forward( fFunction.GetFunc(), x, h, &fResult, &fError);
66  return fResult;
67 }
68 
69 double GSLDerivator::EvalBackward( double x, double h) {
70  // Backward evaluation using previously set function
71  if ( !fFunction.IsValid() ) {
72  std::cerr << "GSLDerivator: Error : The function has not been specified" << std::endl;
73  fStatus = -1;
74  return 0;
75  }
76  fStatus = gsl_deriv_backward( fFunction.GetFunc(), x, h, &fResult, &fError);
77  return fResult;
78 }
79 
80 // static methods not requiring the function
81 double GSLDerivator::EvalCentral(const IGenFunction & f, double x, double h) {
82  // Central evaluation using given function
83  GSLFunctionWrapper gslfw;
84  double result, error = 0;
85  gslfw.SetFunction(f);
86  gsl_deriv_central( gslfw.GetFunc(), x, h, &result, &error);
87  return result;
88 }
89 
90 double GSLDerivator::EvalForward(const IGenFunction & f, double x, double h) {
91  // Forward evaluation using given function
92  GSLFunctionWrapper gslfw;
93  double result, error = 0;
94  gslfw.SetFunction(f);
95  gsl_deriv_forward( gslfw.GetFunc(), x, h, &result, &error);
96  return result;
97 }
98 
99 double GSLDerivator::EvalBackward(const IGenFunction & f, double x, double h) {
100  // Backward evaluation using given function
101  GSLFunctionWrapper gslfw;
102  double result, error = 0;
103  gslfw.SetFunction(f);
104  gsl_deriv_backward( gslfw.GetFunc(), x, h, &result, &error);
105  return result;
106 }
107 
108 
109 double GSLDerivator::Result() const { return fResult; }
110 
111 double GSLDerivator::Error() const { return fError; }
112 
113 int GSLDerivator::Status() const { return fStatus; }
114 
115 // fill GSLFunctionWrapper with the pointer to the function
116 
117 void GSLDerivator::SetFunction( GSLFuncPointer fp, void * p) {
118  fFunction.SetFuncPointer( fp );
119  fFunction.SetParams ( p );
120 }
121 
122 
123 void GSLDerivator::SetFunction(const IGenFunction &f) {
124  fFunction.SetFunction(f);
125 }
126 
127 } // namespace Math
128 } // namespace ROOT