Logo ROOT  
Reference Guide
 
Loading...
Searching...
No Matches
GaussLegendreIntegrator.cxx
Go to the documentation of this file.
1// @(#)root/mathcore:$Id$
2// Authors: David Gonzalez Maline 01/2008
3
4/**********************************************************************
5 * *
6 * Copyright (c) 2006 , LCG ROOT MathLib Team *
7 * *
8 * *
9 **********************************************************************/
10
12#include "Math/Error.h"
13#include "Math/IFunction.h"
14#include "Math/IFunctionfwd.h"
16#include <cmath>
17#include <cstring>
18#include <algorithm>
19
20namespace ROOT {
21namespace Math {
22
24 GaussIntegrator(eps, eps)
25{
26 // Basic constructor
27 fNum = num;
28 fX = nullptr;
29 fW = nullptr;
30
32}
33
35{
36 // Default destructor
37
38
39 delete [] fX;
40 delete [] fW;
41}
42
44{
45 // Set the number of points used in the calculation of the integral
46
47 fNum = num;
49}
50
51void GaussLegendreIntegrator::GetWeightVectors(double *x, double *w) const
52{
53 // Returns the arrays x and w.
54
55 std::copy(fX,fX+fNum, x);
56 std::copy(fW,fW+fNum, w);
57}
58
59
61{
62 // Gauss-Legendre integral, see CalcGaussLegendreSamplingPoints.
63
64 if (fNum<=0 || fX == nullptr || fW == nullptr)
65 return 0;
66
67 fUsedOnce = true;
68
69 const double a0 = (b + a)/2;
70 const double b0 = (b - a)/2;
71
72 double xx[1];
73
74 double result = 0.0;
75 for (int i=0; i<fNum; i++)
76 {
77 xx[0] = a0 + b0*fX[i];
78 result += fW[i] * (*function)(xx);
79 }
80
82 return fLastResult;
83}
84
85
87{
88 // Set the desired relative Error.
89 fEpsRel = eps;
91}
92
94{ MATH_WARN_MSG("ROOT::Math::GaussLegendreIntegrator", "There is no Absolute Tolerance!"); }
95
96
97
99{
100 // Given the number of sampling points this routine fills the
101 // arrays x and w.
102
103 if (fNum<=0 || fEpsRel<=0)
104 return;
105
106 if ( fX )
107 delete [] fX;
108
109 if ( fW )
110 delete [] fW;
111
112 fX = new double[fNum];
113 fW = new double[fNum];
114
115 // The roots of symmetric is the interval, so we only have to find half of them
116 const unsigned int m = (fNum+1)/2;
117
118 double z, pp, p1,p2, p3;
119
120 // Loop over the desired roots
121 for (unsigned int i=0; i<m; i++) {
122 z = std::cos(3.14159265358979323846*(i+0.75)/(fNum+0.5));
123
124 // Starting with the above approximation to the i-th root, we enter
125 // the main loop of refinement by Newton's method
126 do {
127 p1=1.0;
128 p2=0.0;
129
130 // Loop up the recurrence relation to get the Legendre
131 // polynomial evaluated at z
132 for (int j=0; j<fNum; j++)
133 {
134 p3 = p2;
135 p2 = p1;
136 p1 = ((2.0*j+1.0)*z*p2-j*p3)/(j+1.0);
137 }
138 // p1 is now the desired Legendre polynomial. We next compute pp, its
139 // derivative, by a standard relation involving also p2, the polynomial
140 // of one lower order
141 pp = fNum*(z*p1-p2)/(z*z-1.0);
142 // Newton's method
143 z -= p1/pp;
144
145 } while (std::fabs(p1/pp) > fEpsRel);
146
147 // Put root and its symmetric counterpart
148 fX[i] = -z;
149 fX[fNum-i-1] = z;
150
151 // Compute the weight and put its symmetric counterpart
152 fW[i] = 2.0/((1.0-z*z)*pp*pp);
153 fW[fNum-i-1] = fW[i];
154 }
155}
156
159 opt.SetAbsTolerance(0);
161 opt.SetWKSize(0);
162 opt.SetNPoints(fNum);
163 opt.SetIntegrator("GaussLegendre");
164 return opt;
165}
166
168{
169 // set integration options
170// std::cout << "fEpsilon = " << fEpsilon << std::endl;
171// std::cout << opt.RelTolerance() << " abs " << opt.AbsTolerance() << std::endl;
172 //double tol = opt.RelTolerance(); fEpsilon = tol;
173 fEpsRel = opt.RelTolerance();
174// std::cout << "fEpsilon = " << fEpsilon << std::endl;
175 fNum = opt.NPoints();
176 if (fNum <= 7) MATH_WARN_MSGVAL("GaussLegendreIntegrator::SetOptions","setting a low number of points ",fNum);
178}
179
180} // end namespace Math
181} // end namespace ROOT
#define MATH_WARN_MSG(loc, str)
Definition Error.h:80
#define MATH_WARN_MSGVAL(loc, txt, x)
Definition Error.h:105
#define b(i)
Definition RSha256.hxx:100
#define a(i)
Definition RSha256.hxx:99
RooAbsReal & function()
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t result
void SetAbsTolerance(double tol)
non-static methods for setting options
double RelTolerance() const
absolute tolerance
void SetRelTolerance(double tol)
set the relative tolerance
void SetWKSize(unsigned int size)
set workspace size
User class for performing function integration.
bool fUsedOnce
Bool value to check if the function was at least called once.
double fLastResult
Result from the last estimation.
double fEpsRel
Relative error.
void SetAbsTolerance(double) override
This method is not implemented.
void GetWeightVectors(double *x, double *w) const
Returns the arrays x and w containing the abscissa and weight of the Gauss-Legendre n-point quadratur...
ROOT::Math::IntegratorOneDimOptions Options() const override
get the option used for the integration
GaussLegendreIntegrator(int num=10, double eps=1e-12)
Basic constructor of GaussLegendreIntegrator.
void SetRelTolerance(double) override
Set the desired relative Error.
~GaussLegendreIntegrator() override
Default Destructor.
void CalcGaussLegendreSamplingPoints()
Type: unsafe but fast interface filling the arrays x and w (static method)
double * fX
Abscisa of the points used.
void SetOptions(const ROOT::Math::IntegratorOneDimOptions &opt) override
set the options (should be re-implemented by derived classes -if more options than tolerance exist
void SetNumberPoints(int num)
Set the number of points used in the calculation of the integral.
double DoIntegral(double a, double b, const IGenFunction *func) override
Integration surrogate method.
int fNum
Number of points used in the estimation of the integral.
double * fW
Weights of the points used.
Interface (abstract class) for generic functions objects of one-dimension Provides a method to evalua...
Definition IFunction.h:112
Numerical one dimensional integration options.
void SetIntegrator(const char *name)
set 1D integrator name
void SetNPoints(unsigned int n)
Set number of points for active integration rule.
unsigned int NPoints() const
Number of points used by current integration rule.
Double_t x[n]
Definition legend1.C:17
Namespace for new Math classes and functions.
tbb::task_arena is an alias of tbb::interface7::task_arena, which doesn't allow to forward declare tb...
TMarker m
Definition textangle.C:8