ROOT logo
// @(#)root/mathcore:$Id: GaussLegendreIntegrator.h 22728 2008-03-19 10:05:41Z moneta $
// Authors: David Gonzalez Maline    01/2008 

/**********************************************************************
 *                                                                    *
 * Copyright (c) 2006 , LCG ROOT MathLib Team                         *
 *                                                                    *
 *                                                                    *
 **********************************************************************/

// Header file for GaussIntegrator
// 
// Created by: David Gonzalez Maline  : Wed Jan 16 2008
// 

#ifndef ROOT_Math_GaussLegendreIntegrator
#define ROOT_Math_GaussLegendreIntegrator

#include <Math/IFunction.h>
#include <Math/VirtualIntegrator.h>

namespace ROOT {
namespace Math {

//___________________________________________________________________________________________
/**
   User class for performing function integration. 

   It will use the Gauss-Legendre Method for function integration in a given interval. 
   This class is implemented from TF1::Integral().

   @ingroup Integration
  
 */

class GaussLegendreIntegrator: public VirtualIntegratorOneDim {
public:

   /** Basic contructor of GaussLegendreIntegrator. 
       \@param num Number of desired points to calculate the integration.
       \@param eps Desired relative error.
   */
   GaussLegendreIntegrator(int num = 10 ,double eps=1e-12);

   /** Default Destructor */
   virtual ~GaussLegendreIntegrator();
   
   /** Set the number of points used in the calculation of the
       integral */
   void SetNumberPoints(int num);

   /** Returns the arrays x and w containing the abscissa and weight of
       the Gauss-Legendre n-point quadrature formula.
       
       Gauss-Legendre: W(x)=1 -1<x<1 
                       (j+1)P_{j+1} = (2j+1)xP_j-jP_{j-1}
   */
   void GetWeightVectors(double *x, double *w);

   // Implementing VirtualIntegrator Interface

   /** Set the desired relative Error. */
   void SetRelTolerance (double);

   /** Absolute Tolerance is not used in this class. */
   void SetAbsTolerance (double);

   /** Returns the result of the last integral calculation. */
   double Result () const;

   /** Return the estimate of the absolute Error of the last Integral calculation. */
   double Error () const;

   /** This method is not implemented. */
   int Status () const;

   // Implementing VirtualIntegratorOneDim Interface

   /** Gauss-Legendre integral, see CalcGaussLegendreSamplingPoints. */
   double Integral (double a, double b);

   /** Set integration function (flag control if function must be copied inside).
       \@param f Function to be used in the calculations.
       \@param copy Indicates whether the function has to be copied.
   */
   void SetFunction (const IGenFunction &, bool copy=false);

   /** This method is not implemented. */
   double Integral ();

   /** This method is not implemented. */
   double IntegralUp (double a);

   /**This method is not implemented. */
   double IntegralLow (double b);

   /** This method is not implemented. */
   double Integral (const std::vector< double > &pts);

   /** This method is not implemented. */
   double IntegralCauchy (double a, double b, double c);   

private:
   // Middle functions

   /** 
      Type: unsafe but fast interface filling the arrays x and w (static method)
     
      Given the number of sampling points this routine fills the arrays x and w
      of length num, containing the abscissa and weight of the Gauss-Legendre
      n-point quadrature formula.
     
      Gauss-Legendre: W(x)=1  -1<x<1
                      (j+1)P_{j+1} = (2j+1)xP_j-jP_{j-1}
     
      num is the number of sampling points (>0)
      x and w are arrays of size num
      eps is the relative precision
     
      If num<=0 or eps<=0 no action is done.
     
      Reference: Numerical Recipes in C, Second Edition
   */
   void CalcGaussLegendreSamplingPoints();

protected:
   int fNum;                         // Number of points used in the stimation of the integral.
   double* fX;                       // Abscisa of the points used.
   double* fW;                       // Weights of the points used.
   double fEpsilon;                  // Desired relative error.
   bool fUsedOnce;                   // Bool value to check if the function was at least called once.
   double fLastResult;               // Result from the last stimation.
   double fLastError;                // Error from the last stimation.
   const IGenFunction* fFunction;    // Pointer to function used.
   bool fFunctionCopied;             // Bool value to check if the function was copied when set.

};

} // end namespace Math
   
} // end namespace ROOT

#endif /* ROOT_Math_GaussLegendreIntegrator */
 GaussLegendreIntegrator.h:1
 GaussLegendreIntegrator.h:2
 GaussLegendreIntegrator.h:3
 GaussLegendreIntegrator.h:4
 GaussLegendreIntegrator.h:5
 GaussLegendreIntegrator.h:6
 GaussLegendreIntegrator.h:7
 GaussLegendreIntegrator.h:8
 GaussLegendreIntegrator.h:9
 GaussLegendreIntegrator.h:10
 GaussLegendreIntegrator.h:11
 GaussLegendreIntegrator.h:12
 GaussLegendreIntegrator.h:13
 GaussLegendreIntegrator.h:14
 GaussLegendreIntegrator.h:15
 GaussLegendreIntegrator.h:16
 GaussLegendreIntegrator.h:17
 GaussLegendreIntegrator.h:18
 GaussLegendreIntegrator.h:19
 GaussLegendreIntegrator.h:20
 GaussLegendreIntegrator.h:21
 GaussLegendreIntegrator.h:22
 GaussLegendreIntegrator.h:23
 GaussLegendreIntegrator.h:24
 GaussLegendreIntegrator.h:25
 GaussLegendreIntegrator.h:26
 GaussLegendreIntegrator.h:27
 GaussLegendreIntegrator.h:28
 GaussLegendreIntegrator.h:29
 GaussLegendreIntegrator.h:30
 GaussLegendreIntegrator.h:31
 GaussLegendreIntegrator.h:32
 GaussLegendreIntegrator.h:33
 GaussLegendreIntegrator.h:34
 GaussLegendreIntegrator.h:35
 GaussLegendreIntegrator.h:36
 GaussLegendreIntegrator.h:37
 GaussLegendreIntegrator.h:38
 GaussLegendreIntegrator.h:39
 GaussLegendreIntegrator.h:40
 GaussLegendreIntegrator.h:41
 GaussLegendreIntegrator.h:42
 GaussLegendreIntegrator.h:43
 GaussLegendreIntegrator.h:44
 GaussLegendreIntegrator.h:45
 GaussLegendreIntegrator.h:46
 GaussLegendreIntegrator.h:47
 GaussLegendreIntegrator.h:48
 GaussLegendreIntegrator.h:49
 GaussLegendreIntegrator.h:50
 GaussLegendreIntegrator.h:51
 GaussLegendreIntegrator.h:52
 GaussLegendreIntegrator.h:53
 GaussLegendreIntegrator.h:54
 GaussLegendreIntegrator.h:55
 GaussLegendreIntegrator.h:56
 GaussLegendreIntegrator.h:57
 GaussLegendreIntegrator.h:58
 GaussLegendreIntegrator.h:59
 GaussLegendreIntegrator.h:60
 GaussLegendreIntegrator.h:61
 GaussLegendreIntegrator.h:62
 GaussLegendreIntegrator.h:63
 GaussLegendreIntegrator.h:64
 GaussLegendreIntegrator.h:65
 GaussLegendreIntegrator.h:66
 GaussLegendreIntegrator.h:67
 GaussLegendreIntegrator.h:68
 GaussLegendreIntegrator.h:69
 GaussLegendreIntegrator.h:70
 GaussLegendreIntegrator.h:71
 GaussLegendreIntegrator.h:72
 GaussLegendreIntegrator.h:73
 GaussLegendreIntegrator.h:74
 GaussLegendreIntegrator.h:75
 GaussLegendreIntegrator.h:76
 GaussLegendreIntegrator.h:77
 GaussLegendreIntegrator.h:78
 GaussLegendreIntegrator.h:79
 GaussLegendreIntegrator.h:80
 GaussLegendreIntegrator.h:81
 GaussLegendreIntegrator.h:82
 GaussLegendreIntegrator.h:83
 GaussLegendreIntegrator.h:84
 GaussLegendreIntegrator.h:85
 GaussLegendreIntegrator.h:86
 GaussLegendreIntegrator.h:87
 GaussLegendreIntegrator.h:88
 GaussLegendreIntegrator.h:89
 GaussLegendreIntegrator.h:90
 GaussLegendreIntegrator.h:91
 GaussLegendreIntegrator.h:92
 GaussLegendreIntegrator.h:93
 GaussLegendreIntegrator.h:94
 GaussLegendreIntegrator.h:95
 GaussLegendreIntegrator.h:96
 GaussLegendreIntegrator.h:97
 GaussLegendreIntegrator.h:98
 GaussLegendreIntegrator.h:99
 GaussLegendreIntegrator.h:100
 GaussLegendreIntegrator.h:101
 GaussLegendreIntegrator.h:102
 GaussLegendreIntegrator.h:103
 GaussLegendreIntegrator.h:104
 GaussLegendreIntegrator.h:105
 GaussLegendreIntegrator.h:106
 GaussLegendreIntegrator.h:107
 GaussLegendreIntegrator.h:108
 GaussLegendreIntegrator.h:109
 GaussLegendreIntegrator.h:110
 GaussLegendreIntegrator.h:111
 GaussLegendreIntegrator.h:112
 GaussLegendreIntegrator.h:113
 GaussLegendreIntegrator.h:114
 GaussLegendreIntegrator.h:115
 GaussLegendreIntegrator.h:116
 GaussLegendreIntegrator.h:117
 GaussLegendreIntegrator.h:118
 GaussLegendreIntegrator.h:119
 GaussLegendreIntegrator.h:120
 GaussLegendreIntegrator.h:121
 GaussLegendreIntegrator.h:122
 GaussLegendreIntegrator.h:123
 GaussLegendreIntegrator.h:124
 GaussLegendreIntegrator.h:125
 GaussLegendreIntegrator.h:126
 GaussLegendreIntegrator.h:127
 GaussLegendreIntegrator.h:128
 GaussLegendreIntegrator.h:129
 GaussLegendreIntegrator.h:130
 GaussLegendreIntegrator.h:131
 GaussLegendreIntegrator.h:132
 GaussLegendreIntegrator.h:133
 GaussLegendreIntegrator.h:134
 GaussLegendreIntegrator.h:135
 GaussLegendreIntegrator.h:136
 GaussLegendreIntegrator.h:137
 GaussLegendreIntegrator.h:138
 GaussLegendreIntegrator.h:139
 GaussLegendreIntegrator.h:140
 GaussLegendreIntegrator.h:141
 GaussLegendreIntegrator.h:142
 GaussLegendreIntegrator.h:143