GammaLib 2.0.0
Loading...
Searching...
No Matches
GDerivative.hpp
Go to the documentation of this file.
1/***************************************************************************
2 * GDerivative.hpp - Derivative class *
3 * ----------------------------------------------------------------------- *
4 * copyright (C) 2011-2014 by Juergen Knoedlseder *
5 * ----------------------------------------------------------------------- *
6 * *
7 * This program is free software: you can redistribute it and/or modify *
8 * it under the terms of the GNU General Public License as published by *
9 * the Free Software Foundation, either version 3 of the License, or *
10 * (at your option) any later version. *
11 * *
12 * This program is distributed in the hope that it will be useful, *
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
15 * GNU General Public License for more details. *
16 * *
17 * You should have received a copy of the GNU General Public License *
18 * along with this program. If not, see <http://www.gnu.org/licenses/>. *
19 * *
20 ***************************************************************************/
21/**
22 * @file GDerivative.hpp
23 * @brief GDerivative class interface definition.
24 * @author Juergen Knoedlseder
25 */
26
27#ifndef GDERIVATIVE_HPP
28#define GDERIVATIVE_HPP
29
30/* __ Includes ___________________________________________________________ */
31#include <string>
32#include "GBase.hpp"
33#include "GFunction.hpp"
34
35
36/***********************************************************************//**
37 * @class GDerivative
38 *
39 * @brief Numerical derivatives class
40 *
41 * This class allows to compute numerical derivatives using various methods.
42 * The function to be derived is implemented by the abstract GFunction
43 * class.
44 ***************************************************************************/
45class GDerivative : public GBase {
46
47public:
48
49 // Constructors and destructors
50 GDerivative(void);
51 explicit GDerivative(GFunction* func);
52 GDerivative(const GDerivative& dx);
53 virtual ~GDerivative(void);
54
55 // Operators
57
58 // Methods
59 void clear(void);
60 GDerivative* clone(void) const;
61 std::string classname(void) const;
62 void max_iter(const int& max_iter);
63 void eps(const double& eps);
64 void step_frac(const double& fraction);
65 void silent(const bool& silent);
66 const int& iter(void) const;
67 const int& max_iter(void) const;
68 const double& eps(void) const;
69 const double& step_frac(void) const;
70 const bool& silent(void) const;
71 void function(GFunction* func);
72 const GFunction* function(void) const;
73 double value(const double& x, const double& step = 0.0);
74 double ridder(const double& x, const double& h, double* err);
75 double minuit2(const double& x, double* err);
76 double difference(const double& x, const double& h);
77 double left_difference(const double& x, const double& h);
78 double right_difference(const double& x, const double& h);
79 double smooth_robust(const double& x, const double& h,
80 const int& degree = 2,
81 const int& length = 5);
82 std::string print(const GChatter& chatter = NORMAL) const;
83
84protected:
85 // Protected methods
86 void init_members(void);
87 void copy_members(const GDerivative& dx);
88 void free_members(void);
89 void set_tiny(void);
90
91 // Tiny number computation
92 class tiny {
93 public:
94 tiny(void) : m_one(1.0) {}
95 ~tiny(void) {}
96 double one(void) const;
97 double operator()(double eps) const;
98 private:
99 double m_one;
100 };
101
102 // Protected members
103 GFunction* m_func; //!< Pointer to function
104 double m_eps; //!< Derivative precision
105 double m_step_frac; //!< Value fraction to use for initial step
106 double m_tiny; //!< Tiny number for minuit2
107 int m_max_iter; //!< Maximum number of iterations
108 int m_iter; //!< Number of iterations used
109 bool m_silent; //!< Suppress warnings
110};
111
112
113/***********************************************************************//**
114 * @brief Return class name
115 *
116 * @return String containing the class name ("GDerivative").
117 ***************************************************************************/
118inline
119std::string GDerivative::classname(void) const
120{
121 return ("GDerivative");
122}
123
124
125/***********************************************************************//**
126 * @brief Return number of iterations
127 *
128 * @return Number of iterations.
129 ***************************************************************************/
130inline
131const int& GDerivative::iter(void) const
132{
133 return m_iter;
134}
135
136
137/***********************************************************************//**
138 * @brief Set maximum number of iterations
139 *
140 * @param[in] max_iter Maximum number of iterations.
141 ***************************************************************************/
142inline
143void GDerivative::max_iter(const int& max_iter)
144{
146 return;
147}
148
149
150/***********************************************************************//**
151 * @brief Return maximum number of iterations
152 *
153 * @return Maximum number of iterations.
154 ***************************************************************************/
155inline
156const int& GDerivative::max_iter(void) const
157{
158 return m_max_iter;
159}
160
161
162/***********************************************************************//**
163 * @brief Set precision
164 *
165 * @param[in] eps Precision.
166 ***************************************************************************/
167inline
168void GDerivative::eps(const double& eps)
169{
170 m_eps = eps;
171 return;
172}
173
174
175/***********************************************************************//**
176 * @brief Get precision
177 *
178 * @return Precision.
179 ***************************************************************************/
180inline
181const double& GDerivative::eps(void) const
182{
183 return m_eps;
184}
185
186
187/***********************************************************************//**
188 * @brief Set step fraction
189 *
190 * @param[in] fraction Step fraction.
191 ***************************************************************************/
192inline
193void GDerivative::step_frac(const double& fraction)
194{
195 m_step_frac = fraction;
196 return;
197}
198
199
200/***********************************************************************//**
201 * @brief Get step fraction
202 *
203 * @return Step fraction.
204 ***************************************************************************/
205inline
206const double& GDerivative::step_frac(void) const
207{
208 return m_step_frac;
209}
210
211
212/***********************************************************************//**
213 * @brief Set silence flag
214 *
215 * @param[in] silent Silence flag.
216 ***************************************************************************/
217inline
218void GDerivative::silent(const bool& silent)
219{
221 return;
222}
223
224
225/***********************************************************************//**
226 * @brief Get silence flag
227 *
228 * @return True is class is silent, false otherwise.
229 ***************************************************************************/
230inline
231const bool& GDerivative::silent(void) const
232{
233 return m_silent;
234}
235
236
237/***********************************************************************//**
238 * @brief Set function
239 *
240 * @param[in] function Function.
241 *
242 * Sets the function for which the derivative should be determined.
243 ***************************************************************************/
244inline
246{
248 return;
249}
250
251
252/***********************************************************************//**
253 * @brief Get function
254 *
255 * @return Function.
256 ***************************************************************************/
257inline
259{
260 return m_func;
261}
262
263#endif /* GDERIVATIVE_HPP */
Definition of interface for all GammaLib classes.
Single parameter function abstract base class definition.
GChatter
Definition GTypemaps.hpp:33
@ NORMAL
Definition GTypemaps.hpp:36
Interface class for all GammaLib classes.
Definition GBase.hpp:52
double one(void) const
Return one.
double operator()(double eps) const
Evaluate minimal difference between two floating points.
Numerical derivatives class.
int m_iter
Number of iterations used.
void copy_members(const GDerivative &dx)
Copy class members.
double smooth_robust(const double &x, const double &h, const int &degree=2, const int &length=5)
Returns smooth noise-robust derivative.
int m_max_iter
Maximum number of iterations.
double minuit2(const double &x, double *err)
Returns derivative using Minuit2 algorithm.
GDerivative(void)
Void constructor.
GDerivative & operator=(const GDerivative &dx)
Assignment operator.
const bool & silent(void) const
Get silence flag.
virtual ~GDerivative(void)
Destructor.
double value(const double &x, const double &step=0.0)
Returns derivative.
void set_tiny(void)
Compute tiny number for Minuit2.
const double & step_frac(void) const
Get step fraction.
double m_eps
Derivative precision.
const double & eps(void) const
Get precision.
std::string classname(void) const
Return class name.
void init_members(void)
Initialise class members.
const int & max_iter(void) const
Return maximum number of iterations.
void free_members(void)
Delete class members.
double m_step_frac
Value fraction to use for initial step.
double m_tiny
Tiny number for minuit2.
const int & iter(void) const
Return number of iterations.
double left_difference(const double &x, const double &h)
Returns gradient computed from left-sided function difference.
const GFunction * function(void) const
Get function.
double right_difference(const double &x, const double &h)
Returns gradient computed from right-sided function difference.
double ridder(const double &x, const double &h, double *err)
Returns derivative by Ridders' method.
bool m_silent
Suppress warnings.
GFunction * m_func
Pointer to function.
GDerivative * clone(void) const
Clone derivative.
std::string print(const GChatter &chatter=NORMAL) const
Print derivative information.
double difference(const double &x, const double &h)
Returns gradient computed from symmetric function difference.
void clear(void)
Clear derivative.
Single parameter function abstract base class.
Definition GFunction.hpp:44