Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral Class Reference

The simple class for numerical integrations. More...

#include </scratch/z5/marcocle/GaudiDocs/lhcb-release/825/GAUDI/GAUDI_v26r3/InstallArea/x86_64-slc6-gcc48-opt/include/GaudiMath/NumericalIndefiniteIntegral.h>

Inheritance diagram for Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral:
Collaboration diagram for Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral:

Classes

struct  _Function
 
struct  _Workspace
 

Public Types

typedef std::vector< double > Points
 typedef for vector of singular points More...
 
typedef std::vector< double > Points
 typedef for vector of singular points More...
 

Public Member Functions

 NumericalIndefiniteIntegral (const AbsFunction &function, const size_t index, const double a, const GaudiMath::Integration::Limit limit=GaudiMath::Integration::VariableHighLimit, const GaudiMath::Integration::Type type=GaudiMath::Integration::Adaptive, const GaudiMath::Integration::KronrodRule rule=GaudiMath::Integration::Default, const double epsabs=1e-10, const double epsrel=1.e-7, const size_t size=1000)
 From CLHEP/GenericFunctions. More...
 
 NumericalIndefiniteIntegral (const AbsFunction &function, const size_t index, const double a, const Points &points, const GaudiMath::Integration::Limit limit=GaudiMath::Integration::VariableHighLimit, const double epsabs=1e-9, const double epsrel=1.e-6, const size_t size=1000)
 standard constructor More...
 
 NumericalIndefiniteIntegral (const AbsFunction &function, const size_t index, const GaudiMath::Integration::Limit limit=GaudiMath::Integration::VariableHighLimit, const double epsabs=1e-9, const double epsrel=1.e-6, const size_t size=1000)
 standard constructor The function, created with this constructor evaluates following indefinite integral: More...
 
 NumericalIndefiniteIntegral (const NumericalIndefiniteIntegral &)
 copy constructor More...
 
virtual ~NumericalIndefiniteIntegral ()
 destructor More...
 
virtual unsigned int dimensionality () const
 dimensionality of the problem More...
 
virtual double operator() (double argument) const
 Function value. More...
 
virtual double operator() (const Argument &argument) const
 Function value. More...
 
virtual bool hasAnalyticDerivative () const
 Does this function have an analytic derivative? More...
 
virtual Genfun::Derivative partial (unsigned int index) const
 Derivatives. More...
 
const AbsFunction & function () const
 accessor to the function itself More...
 
double a () const
 integration limit More...
 
const Pointspoints () const
 known singularities More...
 
double epsabs () const
 absolute precision More...
 
double epsrel () const
 relatiove precision More...
 
double result () const
 previous result More...
 
double error () const
 evaluate of previous error More...
 
size_t size () const
 
GaudiMath::Integration::Limit limit () const
 integration limit More...
 
GaudiMath::Integration::Type type () const
 integration type More...
 
GaudiMath::Integration::Category category () const
 integration category More...
 
GaudiMath::Integration::KronrodRule rule () const
 integration rule More...
 
 NumericalIndefiniteIntegral (const AbsFunction &function, const size_t index, const double a, const GaudiMath::Integration::Limit limit=GaudiMath::Integration::VariableHighLimit, const GaudiMath::Integration::Type type=GaudiMath::Integration::Adaptive, const GaudiMath::Integration::KronrodRule rule=GaudiMath::Integration::Default, const double epsabs=1e-10, const double epsrel=1.e-7, const size_t size=1000)
 From CLHEP/GenericFunctions. More...
 
 NumericalIndefiniteIntegral (const AbsFunction &function, const size_t index, const double a, const Points &points, const GaudiMath::Integration::Limit limit=GaudiMath::Integration::VariableHighLimit, const double epsabs=1e-9, const double epsrel=1.e-6, const size_t size=1000)
 standard constructor More...
 
 NumericalIndefiniteIntegral (const AbsFunction &function, const size_t index, const GaudiMath::Integration::Limit limit=GaudiMath::Integration::VariableHighLimit, const double epsabs=1e-9, const double epsrel=1.e-6, const size_t size=1000)
 standard constructor The function, created with this constructor evaluates following indefinite integral: More...
 
 NumericalIndefiniteIntegral (const NumericalIndefiniteIntegral &)
 copy constructor More...
 
virtual ~NumericalIndefiniteIntegral ()
 destructor More...
 
virtual unsigned int dimensionality () const
 dimensionality of the problem More...
 
virtual double operator() (double argument) const
 Function value. More...
 
virtual double operator() (const Argument &argument) const
 Function value. More...
 
virtual bool hasAnalyticDerivative () const
 Does this function have an analytic derivative? More...
 
virtual Genfun::Derivative partial (unsigned int index) const
 Derivatives. More...
 
const AbsFunction & function () const
 accessor to the function itself More...
 
double a () const
 integration limit More...
 
const Pointspoints () const
 known singularities More...
 
double epsabs () const
 absolute precision More...
 
double epsrel () const
 relatiove precision More...
 
double result () const
 previous result More...
 
double error () const
 evaluate of previous error More...
 
size_t size () const
 
GaudiMath::Integration::Limit limit () const
 integration limit More...
 
GaudiMath::Integration::Type type () const
 integration type More...
 
GaudiMath::Integration::Category category () const
 integration category More...
 
GaudiMath::Integration::KronrodRule rule () const
 integration rule More...
 

Protected Member Functions

double QAGI (_Function *fun) const
 
double QAGP (_Function *fun) const
 
double QNG (_Function *fun) const
 
double QAG (_Function *fun) const
 
double QAGS (_Function *fun) const
 
_Workspaceallocate () const
 allocate the integration workspace More...
 
_Workspacews () const
 
StatusCode Exception (const std::string &message, const StatusCode &sc=StatusCode::FAILURE) const
 
double QAGI (_Function *fun) const
 
double QAGP (_Function *fun) const
 
double QNG (_Function *fun) const
 
double QAG (_Function *fun) const
 
double QAGS (_Function *fun) const
 
_Workspaceallocate () const
 
_Workspacews () const
 
StatusCode Exception (const std::string &message, const StatusCode &sc=StatusCode::FAILURE) const
 

Private Member Functions

 NumericalIndefiniteIntegral ()
 
NumericalIndefiniteIntegraloperator= (const NumericalIndefiniteIntegral &)
 
 NumericalIndefiniteIntegral ()
 
NumericalIndefiniteIntegraloperator= (const NumericalIndefiniteIntegral &)
 

Private Attributes

const AbsFunction * m_function
 
size_t m_DIM
 
size_t m_index
 
double m_a
 
GaudiMath::Integration::Limit m_limit
 
GaudiMath::Integration::Type m_type
 
GaudiMath::Integration::Category m_category
 
GaudiMath::Integration::KronrodRule m_rule
 
Points m_points
 
double * m_pdata
 
double m_epsabs
 
double m_epsrel
 
double m_result
 
double m_error
 
size_t m_size
 
_Workspacem_ws
 
Argument m_argument
 

Detailed Description

The simple class for numerical integrations.

It allows to evaluate following indefinite integrals:

\[ {\mathcal{F}}_i \left(x_1, \dots , x_{i-1}, x_i , x_{i+1}, \dots , x_n \right) = \int\limits_{a}^{x_i} f \left(x_1, \dots , x_{i-1}, \hat{x}_i , x_{i+1}, \dots , x_n \right) \, {\mathrm{d}} \hat{x}_i \]

\[ {\mathcal{F}}_i \left(x_1, \dots , x_{i-1}, x_i , x_{i+1}, \dots , x_n \right) = \int\limits_{x_i}^{a} f \left(x_1, \dots , x_{i-1}, \hat{x}_i , x_{i+1}, \dots , x_n \right) \, {\mathrm{d}} \hat{x}_i \]

\[ {\mathcal{F}}_i \left(x_1, \dots , x_{i-1}, x_i , x_{i+1}, \dots , x_n \right) = \int\limits_{-\infty}^{x_i} f \left(x_1, \dots , x_{i-1}, \hat{x}_i , x_{i+1}, \dots , x_n \right) \, {\mathrm{d}} \hat{x}_i \]

\[ {\mathcal{F}}_i \left(x_1, \dots , x_{i-1}, x_i , x_{i+1}, \dots , x_n \right) = \int\limits_{x_i}^{+\infty} f \left(x_1, \dots , x_{i-1}, \hat{x}_i , x_{i+1}, \dots , x_n \right) \, {\mathrm{d}} \hat{x}_i \]

Author
Vanya BELYAEV Ivan..nosp@m.Bely.nosp@m.aev@i.nosp@m.tep..nosp@m.ru
Date
2003-08-31

Definition at line 76 of file NumericalIndefiniteIntegral.h.

Member Typedef Documentation

typedef for vector of singular points

Definition at line 80 of file NumericalIndefiniteIntegral.h.

typedef for vector of singular points

Definition at line 80 of file NumericalIndefiniteIntegral.h.

Constructor & Destructor Documentation

Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::NumericalIndefiniteIntegral ( const AbsFunction &  function,
const size_t  index,
const double  a,
const GaudiMath::Integration::Limit  limit = GaudiMath::Integration::VariableHighLimit,
const GaudiMath::Integration::Type  type = GaudiMath::Integration::Adaptive,
const GaudiMath::Integration::KronrodRule  rule = GaudiMath::Integration::Default,
const double  epsabs = 1e-10,
const double  epsrel = 1.e-7,
const size_t  size = 1000 
)

From CLHEP/GenericFunctions.

from CLHEP/GenericFunctions

Standard constructor The function, created with this constructor evaluates following indefinite integral:

\[ {\mathcal{F}}_i \left(x_1, \dots , x_{i-1}, x_i , x_{i+1}, \dots , x_n \right) = \int\limits_{a}^{x_i} f \left(x_1, \dots , x_{i-1}, \hat{x}_i , x_{i+1}, \dots , x_n \right) \, {\mathrm{d}} \hat{x}_i \]

for value of limit = VariableHighLimit and the integral

\[ {\mathcal{F}}_i \left(x_1, \dots , x_{i-1}, x_i , x_{i+1}, \dots , x_n \right) = \int\limits_{x_i}^{a} f \left(x_1, \dots , x_{i-1}, \hat{x}_i , x_{i+1}, \dots , x_n \right) \, {\mathrm{d}} \hat{x}_i \]

for value of limit = VariableLowLimit

If function contains singularities, the type = Type::AdaptiveSingular need to be used

For faster integration of smooth function non-adaptive integration can be used: type = Type::NonAdaptive need to be used

For adaptive integration one can specify the order of Gauss-Kronrad integration rule rule = KronrodRule::Gauss15 The higher-order rules give better accuracy for smooth functions, while lower-order rules save the time when the function contains local difficulties, such as discontinuites.

  • The GSL routine gsl_integration_qng is used for type = Type:NonAdaptive :
  • The GSL routine gsl_integration_qag is used for type = Type:Adaptive :
  • The GSL routine gsl_integration_qags is used for type = Type:AdaptiveSingular :
Parameters
functionthe base function
indexthe variable index
aintegration limit
limitflag to distinguisch low variable limit from high variable limit
typethe integration type (adaptive, non-adaptive or adaptive for singular functions
keyGauss-Kronrad integration rule
epsabsabsolute precision for integration
epsrelrelative precision for integration
limbisection limit

Standard constructor

Parameters
functionthe base function
indexthe variable index
aintegration limit
limitflag to distinguisch low variable limit from high variable limit
typethe integration type (adaptive, non-adaptive or adaptive for singular functions
keyGauss-Kronrad integration rule
epsabsabsolute precision for integration
epsrelrelative precision for integration
limbisection limit

Definition at line 83 of file NumericalIndefiniteIntegral.cpp.

92  : AbsFunction ()
93  , m_function ( function.clone() )
94  , m_DIM ( function.dimensionality() )
95  , m_index ( index )
96  , m_a ( a )
97  , m_limit ( limit )
98  , m_type ( type )
100  , m_rule ( rule )
101  //
102  , m_points ( )
103  , m_pdata ( 0 )
104  //
105  , m_epsabs ( epsabs )
106  , m_epsrel ( epsrel )
107  //
108  , m_result ( GSL_NEGINF )
109  , m_error ( GSL_POSINF )
110  //
111  , m_size ( size )
112  , m_ws ( 0 )
113  , m_argument ( function.dimensionality() )
114  {
117  if ( m_index >= m_DIM )
118  { Exception("::constructor: invalid variable index") ; }
119  }
StatusCode Exception(const std::string &message, const StatusCode &sc=StatusCode::FAILURE) const
GaudiMath::Integration::Limit limit() const
integration limit
virtual unsigned int dimensionality() const
dimensionality of the problem
GaudiMath::Integration::KronrodRule rule() const
integration rule
GaudiMath::Integration::Type type() const
integration type
Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::NumericalIndefiniteIntegral ( const AbsFunction &  function,
const size_t  index,
const double  a,
const Points points,
const GaudiMath::Integration::Limit  limit = GaudiMath::Integration::VariableHighLimit,
const double  epsabs = 1e-9,
const double  epsrel = 1.e-6,
const size_t  size = 1000 
)

standard constructor

The function, created with this constructor evaluates following indefinite integral:

\[ {\mathcal{F}}_i \left(x_1, \dots , x_{i-1}, x_i , x_{i+1}, \dots , x_n \right) = \int\limits_{a}^{x_i} f \left(x_1, \dots , x_{i-1}, \hat{x}_i , x_{i+1}, \dots , x_n \right) \, {\mathrm{d}} \hat{x}_i \]

for value of limit = VariableHighLimit and the integral

\[ {\mathcal{F}}_i \left(x_1, \dots , x_{i-1}, x_i , x_{i+1}, \dots , x_n \right) = \int\limits_{x_i}^{a} f \left(x_1, \dots , x_{i-1}, \hat{x}_i , x_{i+1}, \dots , x_n \right) \, {\mathrm{d}} \hat{x}_i \]

for value of limit = VariableLowLimit

The integrand is assumed to have a known discontinuities

  • The GSL routine gsl_integration_qagp is used for integration
Parameters
functionthe base function
indexthe variable index
aintegration limit
limitflag to distinguisch low variable limit from high variable limit
pointslist of known function singularities
epsabsabsolute precision for integration
epsrelrelative precision for integration
functionthe base function
indexthe variable index
aintegration limit
limitflag to distinguisch low variable limit from high variable limit
pointslist of known function singularities
epsabsabsolute precision for integration
epsrelrelative precision for integration

Definition at line 133 of file NumericalIndefiniteIntegral.cpp.

141  : AbsFunction ()
142  , m_function ( function.clone() )
143  , m_DIM ( function.dimensionality() )
144  , m_index ( index )
145  , m_a ( a )
146  , m_limit ( limit )
150  , m_points ( points )
151  , m_pdata ( 0 )
152  , m_epsabs ( epsabs )
153  , m_epsrel ( epsrel )
154  //
155  , m_result ( GSL_NEGINF )
156  , m_error ( GSL_POSINF )
157  //
158  , m_size ( size )
159  , m_ws ( 0 )
160  , m_argument ( function.dimensionality() )
161  {
162  if ( m_index >= m_DIM )
163  { Exception("::constructor: invalid variable index") ; }
164  m_pdata = new double[ 2 + m_points.size() ] ;
165  m_points.push_back( a ) ;
166  std::sort( m_points.begin() , m_points.end() ) ;
167  m_points.erase ( std::unique( m_points.begin () ,
168  m_points.end () ) , m_points.end() );
169  }
StatusCode Exception(const std::string &message, const StatusCode &sc=StatusCode::FAILURE) const
GaudiMath::Integration::Limit limit() const
integration limit
virtual unsigned int dimensionality() const
dimensionality of the problem
Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::NumericalIndefiniteIntegral ( const AbsFunction &  function,
const size_t  index,
const GaudiMath::Integration::Limit  limit = GaudiMath::Integration::VariableHighLimit,
const double  epsabs = 1e-9,
const double  epsrel = 1.e-6,
const size_t  size = 1000 
)

standard constructor The function, created with this constructor evaluates following indefinite integral:

standard constructor the integral limt is assumed to be infinity

\[ {\mathcal{F}}_i \left(x_1, \dots , x_{i-1}, x_i , x_{i+1}, \dots , x_n \right) = \int\limits_{-\infty}^{x_i} f \left(x_1, \dots , x_{i-1}, \hat{x}_i , x_{i+1}, \dots , x_n \right) \, {\mathrm{d}} \hat{x}_i \]

for value of limit = VariableHighLimit and the integral

\[ {\mathcal{F}}_i \left(x_1, \dots , x_{i-1}, x_i , x_{i+1}, \dots , x_n \right) = \int\limits_{x_i}^{+\infty} f \left(x_1, \dots , x_{i-1}, \hat{x}_i , x_{i+1}, \dots , x_n \right) \, {\mathrm{d}} \hat{x}_i \]

for value of limit = VariableLowLimit

  • The GSL routines gsl_integration_qagil and gsl_integration_qagiu are used for adapive integration
Parameters
functionthe base function
indexthe variable index
limitflag to distinguisch low variable limit from high variable limit
singularitieslist of known function singularities
functionthe base function
indexthe variable index
limitflag to distinguisch low variable limit from high variable limit

Definition at line 181 of file NumericalIndefiniteIntegral.cpp.

187  : AbsFunction ()
188  , m_function ( function.clone() )
189  , m_DIM ( function.dimensionality() )
190  , m_index ( index )
191  , m_a ( GSL_NEGINF ) // should not be used!
192  , m_limit ( limit )
196  , m_points ( )
197  , m_pdata ( 0 )
198  , m_epsabs ( epsabs )
199  , m_epsrel ( epsrel )
200  , m_result ( GSL_NEGINF )
201  , m_error ( GSL_POSINF )
202  , m_size ( size )
203  , m_ws ( 0 )
204  , m_argument ( function.dimensionality() )
205  {
206  if ( m_index >= m_DIM )
207  { Exception("::constructor: invalid variable index") ; }
208  }
StatusCode Exception(const std::string &message, const StatusCode &sc=StatusCode::FAILURE) const
GaudiMath::Integration::Limit limit() const
integration limit
virtual unsigned int dimensionality() const
dimensionality of the problem
Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::NumericalIndefiniteIntegral ( const NumericalIndefiniteIntegral right)

copy constructor

Definition at line 216 of file NumericalIndefiniteIntegral.cpp.

217  : AbsFunction ()
218  , m_function ( right.m_function->clone() )
219  , m_DIM ( right.m_DIM )
220  , m_index ( right.m_index )
221  , m_a ( right.m_a )
222  , m_limit ( right.m_limit )
223  , m_type ( right.m_type )
224  , m_category ( right.m_category )
225  , m_rule ( right.m_rule )
226  , m_points ( right.m_points )
227  , m_pdata ( 0 ) // attention
228  , m_epsabs ( right.m_epsabs )
229  , m_epsrel ( right.m_epsrel )
230  , m_result ( GSL_NEGINF )
231  , m_error ( GSL_POSINF )
232  , m_size ( right.m_size )
233  , m_ws ( 0 )
234  , m_argument ( right.m_argument )
235  {
236  m_pdata = new double[ 2 + m_points.size() ] ; // attention!
237  }
Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::~NumericalIndefiniteIntegral ( )
virtual

destructor

Definition at line 244 of file NumericalIndefiniteIntegral.cpp.

245  {
246  if( 0 != m_ws )
247  {
248  gsl_integration_workspace_free ( m_ws->ws ) ;
249  delete m_ws ;
250  m_ws = 0 ;
251  }
252  if ( 0 != m_pdata ) { delete m_pdata ; m_pdata = 0 ; }
253  if ( 0 != m_function ) { delete m_function ; m_function = 0 ; }
254  }
Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::NumericalIndefiniteIntegral ( )
private
Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::NumericalIndefiniteIntegral ( const AbsFunction &  function,
const size_t  index,
const double  a,
const GaudiMath::Integration::Limit  limit = GaudiMath::Integration::VariableHighLimit,
const GaudiMath::Integration::Type  type = GaudiMath::Integration::Adaptive,
const GaudiMath::Integration::KronrodRule  rule = GaudiMath::Integration::Default,
const double  epsabs = 1e-10,
const double  epsrel = 1.e-7,
const size_t  size = 1000 
)

From CLHEP/GenericFunctions.

Standard constructor The function, created with this constructor evaluates following indefinite integral:

\[ {\mathcal{F}}_i \left(x_1, \dots , x_{i-1}, x_i , x_{i+1}, \dots , x_n \right) = \int\limits_{a}^{x_i} f \left(x_1, \dots , x_{i-1}, \hat{x}_i , x_{i+1}, \dots , x_n \right) \, {\mathrm{d}} \hat{x}_i \]

for value of limit = VariableHighLimit and the integral

\[ {\mathcal{F}}_i \left(x_1, \dots , x_{i-1}, x_i , x_{i+1}, \dots , x_n \right) = \int\limits_{x_i}^{a} f \left(x_1, \dots , x_{i-1}, \hat{x}_i , x_{i+1}, \dots , x_n \right) \, {\mathrm{d}} \hat{x}_i \]

for value of limit = VariableLowLimit

If function contains singularities, the type = Type::AdaptiveSingular need to be used

For faster integration of smooth function non-adaptive integration can be used: type = Type::NonAdaptive need to be used

For adaptive integration one can specify the order of Gauss-Kronrad integration rule rule = KronrodRule::Gauss15 The higher-order rules give better accuracy for smooth functions, while lower-order rules save the time when the function contains local difficulties, such as discontinuites.

  • The GSL routine gsl_integration_qng is used for type = Type:NonAdaptive :
  • The GSL routine gsl_integration_qag is used for type = Type:Adaptive :
  • The GSL routine gsl_integration_qags is used for type = Type:AdaptiveSingular :
Parameters
functionthe base function
indexthe variable index
aintegration limit
limitflag to distinguisch low variable limit from high variable limit
typethe integration type (adaptive, non-adaptive or adaptive for singular functions
keyGauss-Kronrad integration rule
epsabsabsolute precision for integration
epsrelrelative precision for integration
limbisection limit
Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::NumericalIndefiniteIntegral ( const AbsFunction &  function,
const size_t  index,
const double  a,
const Points points,
const GaudiMath::Integration::Limit  limit = GaudiMath::Integration::VariableHighLimit,
const double  epsabs = 1e-9,
const double  epsrel = 1.e-6,
const size_t  size = 1000 
)

standard constructor

The function, created with this constructor evaluates following indefinite integral:

\[ {\mathcal{F}}_i \left(x_1, \dots , x_{i-1}, x_i , x_{i+1}, \dots , x_n \right) = \int\limits_{a}^{x_i} f \left(x_1, \dots , x_{i-1}, \hat{x}_i , x_{i+1}, \dots , x_n \right) \, {\mathrm{d}} \hat{x}_i \]

for value of limit = VariableHighLimit and the integral

\[ {\mathcal{F}}_i \left(x_1, \dots , x_{i-1}, x_i , x_{i+1}, \dots , x_n \right) = \int\limits_{x_i}^{a} f \left(x_1, \dots , x_{i-1}, \hat{x}_i , x_{i+1}, \dots , x_n \right) \, {\mathrm{d}} \hat{x}_i \]

for value of limit = VariableLowLimit

The integrand is assumed to have a known discontinuities

  • The GSL routine gsl_integration_qagp is used for integration
Parameters
functionthe base function
indexthe variable index
aintegration limit
limitflag to distinguisch low variable limit from high variable limit
pointslist of known function singularities
epsabsabsolute precision for integration
epsrelrelative precision for integration
Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::NumericalIndefiniteIntegral ( const AbsFunction &  function,
const size_t  index,
const GaudiMath::Integration::Limit  limit = GaudiMath::Integration::VariableHighLimit,
const double  epsabs = 1e-9,
const double  epsrel = 1.e-6,
const size_t  size = 1000 
)

standard constructor The function, created with this constructor evaluates following indefinite integral:

\[ {\mathcal{F}}_i \left(x_1, \dots , x_{i-1}, x_i , x_{i+1}, \dots , x_n \right) = \int\limits_{-\infty}^{x_i} f \left(x_1, \dots , x_{i-1}, \hat{x}_i , x_{i+1}, \dots , x_n \right) \, {\mathrm{d}} \hat{x}_i \]

for value of limit = VariableHighLimit and the integral

\[ {\mathcal{F}}_i \left(x_1, \dots , x_{i-1}, x_i , x_{i+1}, \dots , x_n \right) = \int\limits_{x_i}^{+\infty} f \left(x_1, \dots , x_{i-1}, \hat{x}_i , x_{i+1}, \dots , x_n \right) \, {\mathrm{d}} \hat{x}_i \]

for value of limit = VariableLowLimit

  • The GSL routines gsl_integration_qagil and gsl_integration_qagiu are used for adapive integration
Parameters
functionthe base function
indexthe variable index
limitflag to distinguisch low variable limit from high variable limit
singularitieslist of known function singularities
Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::NumericalIndefiniteIntegral ( const NumericalIndefiniteIntegral )

copy constructor

virtual Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::~NumericalIndefiniteIntegral ( )
virtual

destructor

Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::NumericalIndefiniteIntegral ( )
private

Member Function Documentation

double Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::a ( ) const
inline

integration limit

Definition at line 296 of file NumericalIndefiniteIntegral.h.

double Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::a ( ) const
inline

integration limit

Definition at line 296 of file NumericalIndefiniteIntegral.h.

NumericalIndefiniteIntegral::_Workspace * Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::allocate ( ) const
protected

allocate the integration workspace

Definition at line 361 of file NumericalIndefiniteIntegral.cpp.

362  {
363  if ( 0 != m_ws ) { return m_ws; }
364  gsl_integration_workspace* aux =
365  gsl_integration_workspace_alloc( size () );
366  if ( 0 == aux ) { Exception ( "allocate()::invalid workspace" ) ; };
367  m_ws = new _Workspace() ;
368  m_ws->ws = aux ;
369  return m_ws ;
370  }
StatusCode Exception(const std::string &message, const StatusCode &sc=StatusCode::FAILURE) const
_Workspace* Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::allocate ( ) const
protected
GaudiMath::Integration::Category Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::category ( ) const
inline

integration category

Definition at line 320 of file NumericalIndefiniteIntegral.h.

GaudiMath::Integration::Category Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::category ( ) const
inline

integration category

Definition at line 320 of file NumericalIndefiniteIntegral.h.

virtual unsigned int Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::dimensionality ( ) const
inlinevirtual

dimensionality of the problem

Definition at line 278 of file NumericalIndefiniteIntegral.h.

virtual unsigned int Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::dimensionality ( ) const
inlinevirtual

dimensionality of the problem

Definition at line 278 of file NumericalIndefiniteIntegral.h.

double Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::epsabs ( ) const
inline

absolute precision

Definition at line 300 of file NumericalIndefiniteIntegral.h.

double Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::epsabs ( ) const
inline

absolute precision

Definition at line 300 of file NumericalIndefiniteIntegral.h.

double Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::epsrel ( ) const
inline

relatiove precision

Definition at line 302 of file NumericalIndefiniteIntegral.h.

double Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::epsrel ( ) const
inline

relatiove precision

Definition at line 302 of file NumericalIndefiniteIntegral.h.

double Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::error ( ) const
inline

evaluate of previous error

Definition at line 307 of file NumericalIndefiniteIntegral.h.

double Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::error ( ) const
inline

evaluate of previous error

Definition at line 307 of file NumericalIndefiniteIntegral.h.

StatusCode Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::Exception ( const std::string &  message,
const StatusCode sc = StatusCode::FAILURE 
) const
protected

Definition at line 261 of file NumericalIndefiniteIntegral.cpp.

263  {
264  throw GaudiException( "NumericalIndefiniteIntegral::" + message ,
265  "*GaudiMath*" , sc ) ;
266  return sc ;
267  }
Define general base for Gaudi exception.
StatusCode Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::Exception ( const std::string &  message,
const StatusCode sc = StatusCode::FAILURE 
) const
protected
const AbsFunction& Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::function ( ) const
inline

accessor to the function itself

Definition at line 294 of file NumericalIndefiniteIntegral.h.

const AbsFunction& Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::function ( ) const
inline

accessor to the function itself

Definition at line 294 of file NumericalIndefiniteIntegral.h.

virtual bool Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::hasAnalyticDerivative ( ) const
inlinevirtual

Does this function have an analytic derivative?

Definition at line 286 of file NumericalIndefiniteIntegral.h.

286 { return true ;}
virtual bool Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::hasAnalyticDerivative ( ) const
inlinevirtual

Does this function have an analytic derivative?

Definition at line 286 of file NumericalIndefiniteIntegral.h.

286 { return true ;}
GaudiMath::Integration::Limit Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::limit ( ) const
inline

integration limit

Definition at line 314 of file NumericalIndefiniteIntegral.h.

GaudiMath::Integration::Limit Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::limit ( ) const
inline

integration limit

Definition at line 314 of file NumericalIndefiniteIntegral.h.

double Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::operator() ( double  argument) const
virtual

Function value.

evaluate the function

Definition at line 274 of file NumericalIndefiniteIntegral.cpp.

275  {
276  // reset the result and the error
277  m_result = GSL_NEGINF ;
278  m_error = GSL_POSINF ;
279 
280  // check the argument
281  if( 1 != m_DIM ) { Exception ( "operator(): invalid argument size " ) ; };
282 
283  m_argument[0] = argument ;
284  return (*this) ( m_argument );
285  }
StatusCode Exception(const std::string &message, const StatusCode &sc=StatusCode::FAILURE) const
virtual double Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::operator() ( double  argument) const
virtual

Function value.

double Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::operator() ( const Argument &  argument) const
virtual

Function value.

evaluate the function

Definition at line 314 of file NumericalIndefiniteIntegral.cpp.

315  {
316  // reset the result and the error
317  m_result = GSL_NEGINF ;
318  m_error = GSL_POSINF ;
319 
320  // check the argument
321  if( argument.dimension() != m_DIM )
322  { Exception ( "operator(): invalid argument size " ) ; };
323 
324  // copy the argument
325  {for( size_t i = 0 ; i < m_DIM ; ++i ){ m_argument[i] = argument[i];}}
326 
327  // create the helper object
328  GSL_Helper helper( *m_function , m_argument , m_index );
329 
330  // use GSL to evaluate the numerical derivative
331  gsl_function F ;
332  F.function = &GSL_Adaptor ;
333  F.params = &helper ;
334  _Function F1 ;
335  F1.fn = &F ;
336 
338  { return QAGI ( &F1 ) ; } // RETURN
340  { return QAGP ( &F1 ) ; } // RETURN
341  else if ( GaudiMath::Integration::Finite == category () )
343  { return QNG ( &F1 ) ; } // RETURN
344  else if ( GaudiMath::Integration::Adaptive == type () )
345  { return QAG ( &F1 ) ; } // RETURN
347  { return QAGS ( &F1 ) ; } // RETURN
348  else
349  { Exception ( "::operator(): invalid type " ); }
350  else
351  { Exception ( "::operator(): invalid category " ); }
352 
353  return 0 ;
354  }
StatusCode Exception(const std::string &message, const StatusCode &sc=StatusCode::FAILURE) const
GaudiMath::Integration::Category category() const
integration category
double GSL_Adaptor(double x, void *params)
Definition: Helpers.cpp:38
GaudiMath::Integration::Type type() const
integration type
list i
Definition: ana.py:128
virtual double Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::operator() ( const Argument &  argument) const
virtual

Function value.

NumericalIndefiniteIntegral& Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::operator= ( const NumericalIndefiniteIntegral )
private
NumericalIndefiniteIntegral& Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::operator= ( const NumericalIndefiniteIntegral )
private
Genfun::Derivative Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::partial ( unsigned int  index) const
virtual

Derivatives.

Definition at line 292 of file NumericalIndefiniteIntegral.cpp.

293  {
294  if ( idx >= m_DIM )
295  { Exception ( "::partial(i): invalid variable index " ) ; };
296  if ( idx != m_index )
297  {
298  const AbsFunction& aux = NumericalDerivative( *this , idx ) ;
299  return Genfun::FunctionNoop( &aux ) ;
300  }
302  {
303  const AbsFunction& aux = -1 * function() ;
304  return Genfun::FunctionNoop( &aux ) ;
305  }
306  const AbsFunction& aux = function() ;
307  return Genfun::FunctionNoop( &aux ) ;
308  }
StatusCode Exception(const std::string &message, const StatusCode &sc=StatusCode::FAILURE) const
GaudiMath::Integration::Limit limit() const
integration limit
virtual Genfun::Derivative Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::partial ( unsigned int  index) const
virtual

Derivatives.

const Points& Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::points ( ) const
inline

known singularities

Definition at line 298 of file NumericalIndefiniteIntegral.h.

const Points& Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::points ( ) const
inline

known singularities

Definition at line 298 of file NumericalIndefiniteIntegral.h.

double Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::QAG ( _Function fun) const
protected

Definition at line 507 of file NumericalIndefiniteIntegral.cpp.

508  {
509  if( 0 == F ) { Exception("QAG::invalid function") ; }
510 
511  const double x = m_argument[m_index] ;
512  if ( m_a == x )
513  {
514  m_result = 0 ;
515  m_error = 0 ; // EXACT !
516  return m_result ;
517  }
518 
519  // allocate workspace
520  if( 0 == ws () ) { allocate () ; }
521 
522  // integration limits
523  const double a = std::min ( m_a , x ) ;
524  const double b = std::max ( m_a , x ) ;
525 
526  int ierror =
527  gsl_integration_qag ( F->fn ,
528  a , b ,
529  m_epsabs , m_epsrel ,
530  size () , (int) rule() , ws ()->ws ,
531  &m_result , &m_error );
532 
533  if( ierror ) { gsl_error( "NumericalIndefiniteIntegral::QAG " ,
534  __FILE__ , __LINE__ , ierror ) ; }
535 
536  // sign
538  && x < m_a ) { m_result *= -1 ; }
540  && x > m_a ) { m_result *= -1 ; }
541 
542  return m_result ;
543  }
StatusCode Exception(const std::string &message, const StatusCode &sc=StatusCode::FAILURE) const
GaudiMath::Integration::Limit limit() const
integration limit
GaudiMath::Integration::KronrodRule rule() const
integration rule
_Workspace * allocate() const
allocate the integration workspace
#define min(a, b)
double Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::QAG ( _Function fun) const
protected
double Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::QAGI ( _Function fun) const
protected

Definition at line 376 of file NumericalIndefiniteIntegral.cpp.

377  {
378  // check the argument
379  if( 0 == F ) { Exception("::QAGI: invalid function"); }
380 
381  const double x = m_argument[m_index] ;
382 
383  // allocate workspace
384  if( 0 == ws() ) { allocate() ; }
385 
386  int ierror = 0 ;
387  switch ( limit() )
388  {
390  ierror = gsl_integration_qagiu ( F->fn , x ,
391  m_epsabs , m_epsrel ,
392  size () , ws()->ws ,
393  &m_result , &m_error ) ; break ;
395  ierror = gsl_integration_qagil ( F->fn , x ,
396  m_epsabs , m_epsrel ,
397  size () , ws()->ws ,
398  &m_result , &m_error ) ; break ;
399  default :
400  Exception ( "::QAGI: invalid mode" ) ;
401  };
402 
403  if( ierror ) { gsl_error( "NumericalIndefiniteIntegral::QAGI" ,
404  __FILE__ , __LINE__ , ierror ) ;}
405 
406  return m_result ;
407  }
StatusCode Exception(const std::string &message, const StatusCode &sc=StatusCode::FAILURE) const
GaudiMath::Integration::Limit limit() const
integration limit
_Workspace * allocate() const
allocate the integration workspace
double Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::QAGI ( _Function fun) const
protected
double Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::QAGP ( _Function fun) const
protected
double Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::QAGP ( _Function fun) const
protected

Definition at line 413 of file NumericalIndefiniteIntegral.cpp.

414  {
415  if( 0 == F ) { Exception("QAGP::invalid function") ; }
416 
417  const double x = m_argument[m_index] ;
418  if ( m_a == x )
419  {
420  m_result = 0 ;
421  m_error = 0 ; // EXACT !
422  return m_result ;
423  }
424 
425  // no known singular points ?
426  if( points().empty() ) { return QAGS( F ) ; }
427 
428  // integration limits
429  const double a = std::min ( m_a , x ) ;
430  const double b = std::max ( m_a , x ) ;
431 
432  // "active" singular points
433  Points::const_iterator lower =
434  std::lower_bound ( points().begin() , points().end() , a ) ;
435  Points::const_iterator upper =
436  std::upper_bound ( points().begin() , points().end() , b ) ;
437 
438  Points pnts ( upper - lower ) ;
439  std::copy( lower , upper , pnts.begin() );
440  if ( *lower != a ) { pnts.insert( pnts.begin () , a ) ; }
441  if ( *upper != b ) { pnts.insert( pnts.end () , b ) ; }
442  std::copy( pnts.begin() , pnts.end() , m_pdata );
443  const size_t npts = pnts.size() ;
444 
445  // use GSL
446  int ierror =
447  gsl_integration_qagp ( F->fn ,
448  m_pdata , npts ,
449  m_epsabs , m_epsrel ,
450  size () , ws()->ws ,
451  &m_result , &m_error ) ;
452 
453  if( ierror ) { gsl_error( "NumericalIndefiniteIntegral::QAGI " ,
454  __FILE__ , __LINE__ , ierror ) ; }
455 
456  // sign
458  && x < m_a ) { m_result *= -1 ; }
460  && x > m_a ) { m_result *= -1 ; }
461 
462  return m_result ;
463  }
StatusCode Exception(const std::string &message, const StatusCode &sc=StatusCode::FAILURE) const
GaudiMath::Integration::Limit limit() const
integration limit
tuple end
Definition: IOTest.py:101
#define min(a, b)
std::vector< double > Points
typedef for vector of singular points
double Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::QAGS ( _Function fun) const
protected

Definition at line 549 of file NumericalIndefiniteIntegral.cpp.

550  {
551  if( 0 == F ) { Exception("QAG::invalid function") ; }
552 
553  const double x = m_argument[m_index] ;
554  if ( m_a == x )
555  {
556  m_result = 0 ;
557  m_error = 0 ; // EXACT !
558  return m_result ;
559  }
560 
561  // allocate workspace
562  if( 0 == ws () ) { allocate () ; }
563 
564  // integration limits
565  const double a = std::min ( m_a , x ) ;
566  const double b = std::max ( m_a , x ) ;
567 
568  int ierror =
569  gsl_integration_qags ( F->fn ,
570  a , b ,
571  m_epsabs , m_epsrel ,
572  size () , ws()->ws ,
573  &m_result , &m_error );
574 
575  if( ierror ) { gsl_error( "NumericalIndefiniteIntegral::QAGS " ,
576  __FILE__ , __LINE__ , ierror ) ; }
577 
578  // sign
580  && x < m_a ) { m_result *= -1 ; }
582  && x > m_a ) { m_result *= -1 ; }
583 
584  return m_result ;
585  }
StatusCode Exception(const std::string &message, const StatusCode &sc=StatusCode::FAILURE) const
GaudiMath::Integration::Limit limit() const
integration limit
_Workspace * allocate() const
allocate the integration workspace
#define min(a, b)
double Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::QAGS ( _Function fun) const
protected
double Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::QNG ( _Function fun) const
protected
double Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::QNG ( _Function fun) const
protected

Definition at line 469 of file NumericalIndefiniteIntegral.cpp.

470  {
471  if( 0 == F ) { Exception("QNG::invalid function") ; }
472 
473  const double x = m_argument[m_index] ;
474  if ( m_a == x )
475  {
476  m_result = 0 ;
477  m_error = 0 ; // EXACT !
478  return m_result ;
479  }
480 
481  // integration limits
482  const double a = std::min ( m_a , x ) ;
483  const double b = std::max ( m_a , x ) ;
484 
485  size_t neval = 0 ;
486  int ierror =
487  gsl_integration_qng ( F->fn ,
488  a , b ,
489  m_epsabs , m_epsrel ,
490  &m_result , &m_error , &neval ) ;
491 
492  if( ierror ) { gsl_error( "NumericalIndefiniteIntegral::QNG " ,
493  __FILE__ , __LINE__ , ierror ) ; }
494 
495  // sign
497  && x < m_a ) { m_result *= -1 ; }
499  && x > m_a ) { m_result *= -1 ; }
500 
501  return m_result ;
502  }
StatusCode Exception(const std::string &message, const StatusCode &sc=StatusCode::FAILURE) const
GaudiMath::Integration::Limit limit() const
integration limit
#define min(a, b)
double Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::result ( ) const
inline
double Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::result ( ) const
inline
GaudiMath::Integration::KronrodRule Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::rule ( ) const
inline

integration rule

Definition at line 323 of file NumericalIndefiniteIntegral.h.

323 { return m_rule ; }
GaudiMath::Integration::KronrodRule Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::rule ( ) const
inline

integration rule

Definition at line 323 of file NumericalIndefiniteIntegral.h.

323 { return m_rule ; }
size_t Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::size ( ) const
inline
size_t Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::size ( ) const
inline
GaudiMath::Integration::Type Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::type ( ) const
inline

integration type

Definition at line 317 of file NumericalIndefiniteIntegral.h.

GaudiMath::Integration::Type Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::type ( ) const
inline

integration type

Definition at line 317 of file NumericalIndefiniteIntegral.h.

_Workspace* Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::ws ( ) const
inlineprotected
_Workspace* Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::ws ( ) const
inlineprotected

Member Data Documentation

double Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::m_a
private

Definition at line 363 of file NumericalIndefiniteIntegral.h.

Argument Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::m_argument
mutableprivate

Definition at line 382 of file NumericalIndefiniteIntegral.h.

GaudiMath::Integration::Category Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::m_category
private

Definition at line 367 of file NumericalIndefiniteIntegral.h.

size_t Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::m_DIM
private

Definition at line 360 of file NumericalIndefiniteIntegral.h.

double Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::m_epsabs
private

Definition at line 373 of file NumericalIndefiniteIntegral.h.

double Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::m_epsrel
private

Definition at line 374 of file NumericalIndefiniteIntegral.h.

double Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::m_error
mutableprivate

Definition at line 377 of file NumericalIndefiniteIntegral.h.

const AbsFunction * Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::m_function
private

Definition at line 359 of file NumericalIndefiniteIntegral.h.

size_t Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::m_index
private

Definition at line 361 of file NumericalIndefiniteIntegral.h.

GaudiMath::Integration::Limit Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::m_limit
private

Definition at line 365 of file NumericalIndefiniteIntegral.h.

double * Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::m_pdata
private

Definition at line 371 of file NumericalIndefiniteIntegral.h.

Points Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::m_points
private

Definition at line 370 of file NumericalIndefiniteIntegral.h.

double Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::m_result
mutableprivate

Definition at line 376 of file NumericalIndefiniteIntegral.h.

GaudiMath::Integration::KronrodRule Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::m_rule
private

Definition at line 368 of file NumericalIndefiniteIntegral.h.

size_t Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::m_size
private

Definition at line 379 of file NumericalIndefiniteIntegral.h.

GaudiMath::Integration::Type Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::m_type
private

Definition at line 366 of file NumericalIndefiniteIntegral.h.

_Workspace * Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::m_ws
mutableprivate

Definition at line 380 of file NumericalIndefiniteIntegral.h.


The documentation for this class was generated from the following files: