/***************************************************************************
* GDerivative.hpp - Derivative class *
* ----------------------------------------------------------------------- *
* copyright (C) 2011-2014 by Juergen Knoedlseder *
* ----------------------------------------------------------------------- *
* *
* This program is free software: you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation, either version 3 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program. If not, see . *
* *
***************************************************************************/
/**
* @file GDerivative.hpp
* @brief GDerivative class interface definition.
* @author Juergen Knoedlseder
*/
#ifndef GDERIVATIVE_HPP
#define GDERIVATIVE_HPP
/* __ Includes ___________________________________________________________ */
#include
#include "GBase.hpp"
#include "GFunction.hpp"
/***********************************************************************//**
* @class GDerivative
*
* @brief Numerical derivatives class
*
* This class allows to compute numerical derivatives using various methods.
* The function to be derived is implemented by the abstract GFunction
* class.
***************************************************************************/
class GDerivative : public GBase {
public:
// Constructors and destructors
GDerivative(void);
explicit GDerivative(GFunction* func);
GDerivative(const GDerivative& dx);
virtual ~GDerivative(void);
// Operators
GDerivative& operator=(const GDerivative& dx);
// Methods
void clear(void);
GDerivative* clone(void) const;
std::string classname(void) const;
void max_iter(const int& max_iter);
void eps(const double& eps);
void step_frac(const double& fraction);
void silent(const bool& silent);
const int& iter(void) const;
const int& max_iter(void) const;
const double& eps(void) const;
const double& step_frac(void) const;
const bool& silent(void) const;
void function(GFunction* func);
const GFunction* function(void) const;
double value(const double& x, const double& step = 0.0);
double ridder(const double& x, const double& h, double* err);
double minuit2(const double& x, double* err);
double difference(const double& x, const double& h);
double left_difference(const double& x, const double& h);
double right_difference(const double& x, const double& h);
double smooth_robust(const double& x, const double& h,
const int& degree = 2,
const int& length = 5);
std::string print(const GChatter& chatter = NORMAL) const;
protected:
// Protected methods
void init_members(void);
void copy_members(const GDerivative& dx);
void free_members(void);
void set_tiny(void);
// Tiny number computation
class tiny {
public:
tiny(void) : m_one(1.0) {}
~tiny(void) {}
double one(void) const;
double operator()(double eps) const;
private:
double m_one;
};
// Protected members
GFunction* m_func; //!< Pointer to function
double m_eps; //!< Derivative precision
double m_step_frac; //!< Value fraction to use for initial step
double m_tiny; //!< Tiny number for minuit2
int m_max_iter; //!< Maximum number of iterations
int m_iter; //!< Number of iterations used
bool m_silent; //!< Suppress warnings
};
/***********************************************************************//**
* @brief Return class name
*
* @return String containing the class name ("GDerivative").
***************************************************************************/
inline
std::string GDerivative::classname(void) const
{
return ("GDerivative");
}
/***********************************************************************//**
* @brief Return number of iterations
*
* @return Number of iterations.
***************************************************************************/
inline
const int& GDerivative::iter(void) const
{
return m_iter;
}
/***********************************************************************//**
* @brief Set maximum number of iterations
*
* @param[in] max_iter Maximum number of iterations.
***************************************************************************/
inline
void GDerivative::max_iter(const int& max_iter)
{
m_max_iter = max_iter;
return;
}
/***********************************************************************//**
* @brief Return maximum number of iterations
*
* @return Maximum number of iterations.
***************************************************************************/
inline
const int& GDerivative::max_iter(void) const
{
return m_max_iter;
}
/***********************************************************************//**
* @brief Set precision
*
* @param[in] eps Precision.
***************************************************************************/
inline
void GDerivative::eps(const double& eps)
{
m_eps = eps;
return;
}
/***********************************************************************//**
* @brief Get precision
*
* @return Precision.
***************************************************************************/
inline
const double& GDerivative::eps(void) const
{
return m_eps;
}
/***********************************************************************//**
* @brief Set step fraction
*
* @param[in] fraction Step fraction.
***************************************************************************/
inline
void GDerivative::step_frac(const double& fraction)
{
m_step_frac = fraction;
return;
}
/***********************************************************************//**
* @brief Get step fraction
*
* @return Step fraction.
***************************************************************************/
inline
const double& GDerivative::step_frac(void) const
{
return m_step_frac;
}
/***********************************************************************//**
* @brief Set silence flag
*
* @param[in] silent Silence flag.
***************************************************************************/
inline
void GDerivative::silent(const bool& silent)
{
m_silent = silent;
return;
}
/***********************************************************************//**
* @brief Get silence flag
*
* @return True is class is silent, false otherwise.
***************************************************************************/
inline
const bool& GDerivative::silent(void) const
{
return m_silent;
}
/***********************************************************************//**
* @brief Set function
*
* @param[in] function Function.
*
* Sets the function for which the derivative should be determined.
***************************************************************************/
inline
void GDerivative::function(GFunction* function)
{
m_func = function;
return;
}
/***********************************************************************//**
* @brief Get function
*
* @return Function.
***************************************************************************/
inline
const GFunction* GDerivative::function(void) const
{
return m_func;
}
#endif /* GDERIVATIVE_HPP */