1 #ifndef ROMBINTSOLVER_H
2 #define ROMBINTSOLVER_H 1
8 #include <streamlog/streamlog.h>
18 #define NSTEPSMAX_R 20
20 #define FCE(x) (_pTemplate->*_fce)(x)
72 double Integrate(
double endPointA,
double endPointB);
129 for (n=0; n<_nStepsMax; n++) {
130 R[n][0] = TrapezRuleInt(n);
136 for (m=1; m<=n; m++) {
137 for (m4=1, i=0; i<(2*
m); i++) m4<<=1;
138 R[n][
m] = R[n][m-1] + (R[n][m-1] - R[n-1][m-1])/(m4 - 1);
146 if ((n>=_nStepsMin)&&((fabs(R[n][n] - R[n][n-1])/R[n][n])<_eps))
return R[n][n];
153 streamlog_out(WARNING) <<
"Warning - Too many steps in Romberg integr., required "
154 <<
"precision wasn't achieved" << std::endl;
165 static double trapSum = 0;
166 double x, h, h2, subSum;
171 trapSum = 0.5 * (_b - _a) * (
FCE(_a)+
FCE(_b));
179 for (iN=1, i=0; i<n; i++) iN<<=1;
187 for (subSum=0, i=0; i<(iN/2); i++, x+=h2) subSum +=
FCE(x);
190 trapSum = 0.5*trapSum + subSum*h;
200 #endif // ROMBINTSOLVER_H
int _nStepsMin
Minimum number of integration steps permitted (Avoid spurious early convergence!) ...
double TrapezRuleInt(int n)
This method returns a definite integral of function fce in interval (a,b) and is based on classical e...
double _b
Right integration endpoint.
RombIntSolver(double(T::*fce)(double), T *pTemplate)
Constructor - sets function to be integrated.
Double precision Romberg integration solver (Template class represents class whose method is to be in...
RombIntSolver(double(T::*fce)(double), T *pTemplate, float eps)
Constructor - sets function to be integrated and integration precision.
~RombIntSolver()
Destructor.
T * _pTemplate
Pointer to the template class.
float _eps
Total integration precision (Caution: Don't overestimate this value!)
int _nStepsMax
Maximum number of integration steps permitted.
double _a
Left integration endpoint.
double(T::* _fce)(double)
Relative pointer to an integrated function.
double Integrate(double endPointA, double endPointB)
This method returns a definite integral of function fce calculated in interval (a,b) using so-called Romberg algorithm.