64 ClassImp(RooAdaptiveGaussKronrodIntegrator1D);
68 struct gsl_function_struct
70 double (*
function) (
double x,
void * params);
73 typedef struct gsl_function_struct gsl_function ;
74 #define GSL_FN_EVAL(F,x) (*((F)->function))(x,(F)->params)
91 gsl_integration_workspace;
93 gsl_integration_workspace *
94 gsl_integration_workspace_alloc (
const size_t n);
97 gsl_integration_workspace_free (gsl_integration_workspace * w);
99 int gsl_integration_qag (
const gsl_function * f,
101 double epsabs,
double epsrel,
size_t limit,
103 gsl_integration_workspace * workspace,
104 double *result,
double *abserr);
107 gsl_integration_qags (
const gsl_function *f,
109 double epsabs,
double epsrel,
size_t limit,
110 gsl_integration_workspace * workspace,
111 double * result,
double * abserr) ;
114 gsl_integration_qagi (gsl_function * f,
115 double epsabs,
double epsrel,
size_t limit,
116 gsl_integration_workspace * workspace,
117 double *result,
double *abserr) ;
120 gsl_integration_qagil (gsl_function * f,
122 double epsabs,
double epsrel,
size_t limit,
123 gsl_integration_workspace * workspace,
124 double *result,
double *abserr) ;
127 gsl_integration_qagiu (gsl_function * f,
129 double epsabs,
double epsrel,
size_t limit,
130 gsl_integration_workspace * workspace,
131 double *result,
double *abserr) ;
139 namespace RooFit_internal {
140 struct Roo_internal_AGKInteg1D :
public RooAdaptiveGaussKronrodIntegrator1D {
142 static void registerIntegrator()
144 auto &intFactory = RooNumIntFactory::instance();
145 RooAdaptiveGaussKronrodIntegrator1D::registerIntegrator(intFactory);
149 struct Roo_reg_AGKInteg1D {
150 Roo_reg_AGKInteg1D() { Roo_internal_AGKInteg1D::registerIntegrator(); }
153 static Roo_reg_AGKInteg1D instance;
158 void RooAdaptiveGaussKronrodIntegrator1D::registerIntegrator(RooNumIntFactory& fact)
160 RooRealVar maxSeg(
"maxSeg",
"maximum number of segments", 100);
161 RooCategory method(
"method",
"Integration method for each segment");
162 method.defineType(
"WynnEpsilon", 0);
163 method.defineType(
"15Points", 1);
164 method.defineType(
"21Points", 2);
165 method.defineType(
"31Points", 3);
166 method.defineType(
"41Points", 4);
167 method.defineType(
"51Points", 5);
168 method.defineType(
"61Points", 6);
170 fact.storeProtoIntegrator(
new RooAdaptiveGaussKronrodIntegrator1D(), RooArgSet(maxSeg, method));
171 oocoutI((TObject*)
nullptr,Integration) <<
"RooAdaptiveGaussKronrodIntegrator1D has been registered " << std::endl;
178 RooAdaptiveGaussKronrodIntegrator1D::RooAdaptiveGaussKronrodIntegrator1D() : _x(0), _workspace(0)
188 RooAdaptiveGaussKronrodIntegrator1D::RooAdaptiveGaussKronrodIntegrator1D(
const RooAbsFunc&
function,
189 const RooNumIntConfig& config) :
190 RooAbsIntegrator(function),
191 _epsAbs(config.epsRel()),
192 _epsRel(config.epsAbs()),
196 const RooArgSet& confSet = config.getConfigSection(IsA()->GetName()) ;
197 _maxSeg = (Int_t) confSet.getRealValue(
"maxSeg",100) ;
198 _methodKey = confSet.getCatIndex(
"method",2) ;
200 _useIntegrandLimits= kTRUE;
201 _valid= initialize();
209 RooAdaptiveGaussKronrodIntegrator1D::RooAdaptiveGaussKronrodIntegrator1D(
const RooAbsFunc&
function,
210 Double_t xmin, Double_t xmax,
211 const RooNumIntConfig& config) :
212 RooAbsIntegrator(function),
213 _epsAbs(config.epsRel()),
214 _epsRel(config.epsAbs()),
220 const RooArgSet& confSet = config.getConfigSection(IsA()->GetName()) ;
221 _maxSeg = (Int_t) confSet.getRealValue(
"maxSeg",100) ;
222 _methodKey = confSet.getCatIndex(
"method",2) ;
224 _useIntegrandLimits= kFALSE;
225 _valid= initialize();
233 RooAbsIntegrator* RooAdaptiveGaussKronrodIntegrator1D::clone(
const RooAbsFunc&
function,
const RooNumIntConfig& config)
const
235 return new RooAdaptiveGaussKronrodIntegrator1D(
function,config) ;
243 Bool_t RooAdaptiveGaussKronrodIntegrator1D::initialize()
246 _x =
new Double_t[_function->getDimension()] ;
247 _workspace = gsl_integration_workspace_alloc (_maxSeg) ;
249 return checkLimits();
257 RooAdaptiveGaussKronrodIntegrator1D::~RooAdaptiveGaussKronrodIntegrator1D()
260 gsl_integration_workspace_free ((gsl_integration_workspace*) _workspace) ;
274 Bool_t RooAdaptiveGaussKronrodIntegrator1D::setLimits(Double_t* xmin, Double_t* xmax)
276 if(_useIntegrandLimits) {
277 coutE(Integration) <<
"RooAdaptiveGaussKronrodIntegrator1D::setLimits: cannot override integrand's limits" << endl;
283 return checkLimits();
292 Bool_t RooAdaptiveGaussKronrodIntegrator1D::checkLimits()
const
294 if(_useIntegrandLimits) {
295 assert(0 != integrand() && integrand()->isValid());
296 _xmin= integrand()->getMinLimit(0);
297 _xmax= integrand()->getMaxLimit(0);
301 Bool_t infLo= RooNumber::isInfinite(_xmin);
302 Bool_t infHi= RooNumber::isInfinite(_xmax);
304 if (!infLo && !infHi) {
305 _domainType = Closed ;
306 }
else if (infLo && infHi) {
308 }
else if (infLo && !infHi) {
309 _domainType = OpenLo ;
311 _domainType = OpenHi ;
323 double RooAdaptiveGaussKronrodIntegrator1D_GSL_GlueFunction(
double x,
void *data)
325 RooAdaptiveGaussKronrodIntegrator1D* instance = (RooAdaptiveGaussKronrodIntegrator1D*) data ;
326 return instance->integrand(instance->xvec(x)) ;
334 Double_t RooAdaptiveGaussKronrodIntegrator1D::integral(
const Double_t *yvec)
340 UInt_t i ;
for (i=0 ; i<_function->getDimension()-1 ; i++) {
347 F.function = &RooAdaptiveGaussKronrodIntegrator1D_GSL_GlueFunction ;
351 double result, error;
354 switch(_domainType) {
357 gsl_integration_qags (&F, _xmin, _xmax, _epsAbs, _epsRel, _maxSeg, (gsl_integration_workspace*)_workspace,&result, &error);
359 gsl_integration_qag (&F, _xmin, _xmax, _epsAbs, _epsRel, _maxSeg, _methodKey, (gsl_integration_workspace*)_workspace,&result, &error);
363 gsl_integration_qagil (&F, _xmax, _epsAbs, _epsRel, _maxSeg, (gsl_integration_workspace*)_workspace,&result, &error);
366 gsl_integration_qagiu (&F, _xmin, _epsAbs, _epsRel, _maxSeg, (gsl_integration_workspace*)_workspace,&result, &error);
369 gsl_integration_qagi (&F, _epsAbs, _epsRel, _maxSeg, (gsl_integration_workspace*)_workspace,&result, &error);
400 #define GSL_SUCCESS 0
403 #define GSL_EBADTOL 13
405 #define GSL_ERROR(a,b) oocoutE((TObject*)0,Integration) << "RooAdaptiveGaussKronrodIntegrator1D::integral() ERROR: " << a << endl ; return b ;
406 #define GSL_DBL_MIN 2.2250738585072014e-308
407 #define GSL_DBL_MAX 1.7976931348623157e+308
408 #define GSL_DBL_EPSILON 2.2204460492503131e-16
411 #define GSL_EMAXITER 3
413 #define GSL_EFAILED 5
414 #define GSL_EDIVERGE 6
417 #define GSL_ERROR_VAL(reason, gsl_errno, value) return value ;
419 #define GSL_MAX(a,b) ((a) > (b) ? (a) : (b))
421 GSL_MAX_DBL (
double a,
double b)
423 return GSL_MAX (a, b);
426 double gsl_coerce_double (
const double x);
429 gsl_coerce_double (
const double x)
435 #define GSL_COERCE_DBL(x) (gsl_coerce_double(x))
446 typedef void gsl_integration_rule (
const gsl_function * f,
448 double *result,
double *abserr,
449 double *defabs,
double *resabs);
451 void gsl_integration_qk15 (
const gsl_function * f,
double a,
double b,
452 double *result,
double *abserr,
453 double *resabs,
double *resasc);
455 void gsl_integration_qk21 (
const gsl_function * f,
double a,
double b,
456 double *result,
double *abserr,
457 double *resabs,
double *resasc);
459 void gsl_integration_qk31 (
const gsl_function * f,
double a,
double b,
460 double *result,
double *abserr,
461 double *resabs,
double *resasc);
463 void gsl_integration_qk41 (
const gsl_function * f,
double a,
double b,
464 double *result,
double *abserr,
465 double *resabs,
double *resasc);
467 void gsl_integration_qk51 (
const gsl_function * f,
double a,
double b,
468 double *result,
double *abserr,
469 double *resabs,
double *resasc);
471 void gsl_integration_qk61 (
const gsl_function * f,
double a,
double b,
472 double *result,
double *abserr,
473 double *resabs,
double *resasc);
475 void gsl_integration_qcheb (gsl_function * f,
double a,
double b,
476 double *cheb12,
double *cheb24);
483 GSL_INTEG_GAUSS15 = 1,
484 GSL_INTEG_GAUSS21 = 2,
485 GSL_INTEG_GAUSS31 = 3,
486 GSL_INTEG_GAUSS41 = 4,
487 GSL_INTEG_GAUSS51 = 5,
488 GSL_INTEG_GAUSS61 = 6
493 gsl_integration_qk (
const int n,
const double xgk[],
494 const double wg[],
const double wgk[],
495 double fv1[],
double fv2[],
496 const gsl_function *f,
double a,
double b,
497 double * result,
double * abserr,
498 double * resabs,
double * resasc);
501 int gsl_integration_qag (
const gsl_function * f,
503 double epsabs,
double epsrel,
size_t limit,
505 gsl_integration_workspace * workspace,
506 double *result,
double *abserr);
511 void initialise (gsl_integration_workspace * workspace,
double a,
double b);
514 void initialise (gsl_integration_workspace * workspace,
double a,
double b)
517 workspace->nrmax = 0;
519 workspace->alist[0] = a;
520 workspace->blist[0] = b;
521 workspace->rlist[0] = 0.0;
522 workspace->elist[0] = 0.0;
523 workspace->order[0] = 0;
524 workspace->level[0] = 0;
526 workspace->maximum_level = 0;
531 void set_initial_result (gsl_integration_workspace * workspace,
532 double result,
double error);
535 void set_initial_result (gsl_integration_workspace * workspace,
536 double result,
double error)
539 workspace->rlist[0] = result;
540 workspace->elist[0] = error;
545 qpsrt (gsl_integration_workspace * workspace);
548 void qpsrt (gsl_integration_workspace * workspace)
550 const size_t last = workspace->size - 1;
551 const size_t limit = workspace->limit;
553 double * elist = workspace->elist;
554 size_t * order = workspace->order;
560 size_t i_nrmax = workspace->nrmax;
561 size_t i_maxerr = order[i_nrmax] ;
569 workspace->i = i_maxerr ;
573 errmax = elist[i_maxerr] ;
580 while (i_nrmax > 0 && errmax > elist[order[i_nrmax - 1]])
582 order[i_nrmax] = order[i_nrmax - 1] ;
590 if(last < (limit/2 + 2))
596 top = limit - last + 1;
607 while (i < top && errmax < elist[order[i]])
609 order[i-1] = order[i] ;
613 order[i-1] = i_maxerr ;
617 errmin = elist[last] ;
621 while (k > i - 2 && errmin >= elist[order[k]])
623 order[k+1] = order[k] ;
631 i_maxerr = order[i_nrmax] ;
633 workspace->i = i_maxerr ;
634 workspace->nrmax = i_nrmax ;
641 void update (gsl_integration_workspace * workspace,
642 double a1,
double b1,
double area1,
double error1,
643 double a2,
double b2,
double area2,
double error2);
646 retrieve (
const gsl_integration_workspace * workspace,
647 double * a,
double * b,
double * r,
double * e);
652 void update (gsl_integration_workspace * workspace,
653 double a1,
double b1,
double area1,
double error1,
654 double a2,
double b2,
double area2,
double error2)
656 double * alist = workspace->alist ;
657 double * blist = workspace->blist ;
658 double * rlist = workspace->rlist ;
659 double * elist = workspace->elist ;
660 size_t * level = workspace->level ;
662 const size_t i_max = workspace->i ;
663 const size_t i_new = workspace->size ;
665 const size_t new_level = workspace->level[i_max] + 1;
672 rlist[i_max] = area2;
673 elist[i_max] = error2;
674 level[i_max] = new_level;
678 rlist[i_new] = area1;
679 elist[i_new] = error1;
680 level[i_new] = new_level;
685 rlist[i_max] = area1;
686 elist[i_max] = error1;
687 level[i_max] = new_level;
691 rlist[i_new] = area2;
692 elist[i_new] = error2;
693 level[i_new] = new_level;
698 if (new_level > workspace->maximum_level)
700 workspace->maximum_level = new_level;
707 retrieve (
const gsl_integration_workspace * workspace,
708 double * a,
double * b,
double * r,
double * e)
710 const size_t i = workspace->i;
711 double * alist = workspace->alist;
712 double * blist = workspace->blist;
713 double * rlist = workspace->rlist;
714 double * elist = workspace->elist;
723 sum_results (
const gsl_integration_workspace * workspace);
726 sum_results (
const gsl_integration_workspace * workspace)
728 const double *
const rlist = workspace->rlist ;
729 const size_t n = workspace->size;
732 double result_sum = 0;
734 for (k = 0; k < n; k++)
736 result_sum += rlist[k];
743 subinterval_too_small (
double a1,
double a2,
double b2);
746 subinterval_too_small (
double a1,
double a2,
double b2)
748 const double e = GSL_DBL_EPSILON;
749 const double u = GSL_DBL_MIN;
751 double tmp = (1 + 100 * e) * (fabs (a2) + 1000 * u);
753 int status = fabs (a1) <= tmp && fabs (b2) <= tmp;
760 qag (
const gsl_function *f,
761 const double a,
const double b,
762 const double epsabs,
const double epsrel,
764 gsl_integration_workspace * workspace,
765 double * result,
double * abserr,
766 gsl_integration_rule * q) ;
769 gsl_integration_qag (
const gsl_function *f,
771 double epsabs,
double epsrel,
size_t limit,
773 gsl_integration_workspace * workspace,
774 double * result,
double * abserr)
777 gsl_integration_rule * integration_rule = gsl_integration_qk15 ;
779 if (key < GSL_INTEG_GAUSS15)
781 key = GSL_INTEG_GAUSS15 ;
783 else if (key > GSL_INTEG_GAUSS61)
785 key = GSL_INTEG_GAUSS61 ;
790 case GSL_INTEG_GAUSS15:
791 integration_rule = gsl_integration_qk15 ;
793 case GSL_INTEG_GAUSS21:
794 integration_rule = gsl_integration_qk21 ;
796 case GSL_INTEG_GAUSS31:
797 integration_rule = gsl_integration_qk31 ;
799 case GSL_INTEG_GAUSS41:
800 integration_rule = gsl_integration_qk41 ;
802 case GSL_INTEG_GAUSS51:
803 integration_rule = gsl_integration_qk51 ;
805 case GSL_INTEG_GAUSS61:
806 integration_rule = gsl_integration_qk61 ;
810 status = qag (f, a, b, epsabs, epsrel, limit,
819 qag (
const gsl_function * f,
820 const double a,
const double b,
821 const double epsabs,
const double epsrel,
823 gsl_integration_workspace * workspace,
824 double *result,
double *abserr,
825 gsl_integration_rule * q)
828 double result0, abserr0, resabs0, resasc0;
830 size_t iteration = 0;
831 int roundoff_type1 = 0, roundoff_type2 = 0, error_type = 0;
837 initialise (workspace, a, b);
842 if (limit > workspace->limit)
844 GSL_ERROR (
"iteration limit exceeds available workspace", GSL_EINVAL) ;
847 if (epsabs <= 0 && (epsrel < 50 * GSL_DBL_EPSILON || epsrel < 0.5e-28))
849 GSL_ERROR (
"tolerance cannot be acheived with given epsabs and epsrel",
855 q (f, a, b, &result0, &abserr0, &resabs0, &resasc0);
857 set_initial_result (workspace, result0, abserr0);
861 tolerance = GSL_MAX_DBL (epsabs, epsrel * fabs (result0));
865 round_off = GSL_COERCE_DBL (50 * GSL_DBL_EPSILON * resabs0);
867 if (abserr0 <= round_off && abserr0 > tolerance)
872 GSL_ERROR (
"cannot reach tolerance because of roundoff error "
873 "on first attempt", GSL_EROUND);
875 else if ((abserr0 <= tolerance && abserr0 != resasc0) || abserr0 == 0.0)
887 GSL_ERROR (
"a maximum of one iteration was insufficient", GSL_EMAXITER);
897 double a1, b1, a2, b2;
898 double a_i, b_i, r_i, e_i;
899 double area1 = 0, area2 = 0, area12 = 0;
900 double error1 = 0, error2 = 0, error12 = 0;
901 double resasc1, resasc2;
902 double resabs1, resabs2;
906 retrieve (workspace, &a_i, &b_i, &r_i, &e_i);
909 b1 = 0.5 * (a_i + b_i);
913 q (f, a1, b1, &area1, &error1, &resabs1, &resasc1);
914 q (f, a2, b2, &area2, &error2, &resabs2, &resasc2);
916 area12 = area1 + area2;
917 error12 = error1 + error2;
919 errsum += (error12 - e_i);
920 area += area12 - r_i;
922 if (resasc1 != error1 && resasc2 != error2)
924 double delta = r_i - area12;
926 if (fabs (delta) <= 1.0e-5 * fabs (area12) && error12 >= 0.99 * e_i)
930 if (iteration >= 10 && error12 > e_i)
936 tolerance = GSL_MAX_DBL (epsabs, epsrel * fabs (area));
938 if (errsum > tolerance)
940 if (roundoff_type1 >= 6 || roundoff_type2 >= 20)
948 if (subinterval_too_small (a1, a2, b2))
954 update (workspace, a1, b1, area1, error1, a2, b2, area2, error2);
956 retrieve (workspace, &a_i, &b_i, &r_i, &e_i);
961 while (iteration < limit && !error_type && errsum > tolerance);
963 *result = sum_results (workspace);
966 if (errsum <= tolerance)
970 else if (error_type == 2)
972 GSL_ERROR (
"roundoff error prevents tolerance from being achieved",
975 else if (error_type == 3)
977 GSL_ERROR (
"bad integrand behavior found in the integration interval",
980 else if (iteration == limit)
982 GSL_ERROR (
"maximum number of subdivisions reached", GSL_EMAXITER);
985 GSL_ERROR (
"could not integrate function", GSL_EFAILED);
990 static double rescale_error (
double err,
const double result_abs,
const double result_asc) ;
993 rescale_error (
double err,
const double result_abs,
const double result_asc)
997 if (result_asc != 0 && err != 0)
999 double scale = TMath::Power((200 * err / result_asc), 1.5) ;
1003 err = result_asc * scale ;
1010 if (result_abs > GSL_DBL_MIN / (50 * GSL_DBL_EPSILON))
1012 double min_err = 50 * GSL_DBL_EPSILON * result_abs ;
1025 gsl_integration_qk (
const int n,
1026 const double xgk[],
const double wg[],
const double wgk[],
1027 double fv1[],
double fv2[],
1028 const gsl_function * f,
double a,
double b,
1029 double *result,
double *abserr,
1030 double *resabs,
double *resasc)
1033 const double center = 0.5 * (a + b);
1034 const double half_length = 0.5 * (b - a);
1035 const double abs_half_length = fabs (half_length);
1036 const double f_center = GSL_FN_EVAL (f, center);
1038 double result_gauss = 0;
1039 double result_kronrod = f_center * wgk[n - 1];
1041 double result_abs = fabs (result_kronrod);
1042 double result_asc = 0;
1043 double mean = 0, err = 0;
1049 result_gauss = f_center * wg[n / 2 - 1];
1052 for (j = 0; j < (n - 1) / 2; j++)
1054 const int jtw = j * 2 + 1;
1055 const double abscissa = half_length * xgk[jtw];
1056 const double fval1 = GSL_FN_EVAL (f, center - abscissa);
1057 const double fval2 = GSL_FN_EVAL (f, center + abscissa);
1058 const double fsum = fval1 + fval2;
1061 result_gauss += wg[j] * fsum;
1062 result_kronrod += wgk[jtw] * fsum;
1063 result_abs += wgk[jtw] * (fabs (fval1) + fabs (fval2));
1066 for (j = 0; j < n / 2; j++)
1069 const double abscissa = half_length * xgk[jtwm1];
1070 const double fval1 = GSL_FN_EVAL (f, center - abscissa);
1071 const double fval2 = GSL_FN_EVAL (f, center + abscissa);
1074 result_kronrod += wgk[jtwm1] * (fval1 + fval2);
1075 result_abs += wgk[jtwm1] * (fabs (fval1) + fabs (fval2));
1078 mean = result_kronrod * 0.5;
1080 result_asc = wgk[n - 1] * fabs (f_center - mean);
1082 for (j = 0; j < n - 1; j++)
1084 result_asc += wgk[j] * (fabs (fv1[j] - mean) + fabs (fv2[j] - mean));
1089 err = (result_kronrod - result_gauss) * half_length;
1091 result_kronrod *= half_length;
1092 result_abs *= abs_half_length;
1093 result_asc *= abs_half_length;
1095 *result = result_kronrod;
1096 *resabs = result_abs;
1097 *resasc = result_asc;
1098 *abserr = rescale_error (err, result_abs, result_asc);
1106 static const double xgkA[8] =
1108 0.991455371120812639206854697526329,
1109 0.949107912342758524526189684047851,
1110 0.864864423359769072789712788640926,
1111 0.741531185599394439863864773280788,
1112 0.586087235467691130294144838258730,
1113 0.405845151377397166906606412076961,
1114 0.207784955007898467600689403773245,
1115 0.000000000000000000000000000000000
1121 static const double wgA[4] =
1123 0.129484966168869693270611432679082,
1124 0.279705391489276667901467771423780,
1125 0.381830050505118944950369775488975,
1126 0.417959183673469387755102040816327
1129 static const double wgkA[8] =
1131 0.022935322010529224963732008058970,
1132 0.063092092629978553290700663189204,
1133 0.104790010322250183839876322541518,
1134 0.140653259715525918745189590510238,
1135 0.169004726639267902826583426598550,
1136 0.190350578064785409913256402421014,
1137 0.204432940075298892414161999234649,
1138 0.209482141084727828012999174891714
1142 gsl_integration_qk15 (
const gsl_function * f,
double a,
double b,
1143 double *result,
double *abserr,
1144 double *resabs,
double *resasc)
1146 double fv1[8], fv2[8];
1148 gsl_integration_qk (8, xgkA, wgA, wgkA, fv1, fv2, f, a, b, result, abserr, resabs, resasc);
1155 static const double xgkB[11] =
1157 0.995657163025808080735527280689003,
1158 0.973906528517171720077964012084452,
1159 0.930157491355708226001207180059508,
1160 0.865063366688984510732096688423493,
1161 0.780817726586416897063717578345042,
1162 0.679409568299024406234327365114874,
1163 0.562757134668604683339000099272694,
1164 0.433395394129247190799265943165784,
1165 0.294392862701460198131126603103866,
1166 0.148874338981631210884826001129720,
1167 0.000000000000000000000000000000000
1173 static const double wgB[5] =
1175 0.066671344308688137593568809893332,
1176 0.149451349150580593145776339657697,
1177 0.219086362515982043995534934228163,
1178 0.269266719309996355091226921569469,
1179 0.295524224714752870173892994651338
1182 static const double wgkB[11] =
1184 0.011694638867371874278064396062192,
1185 0.032558162307964727478818972459390,
1186 0.054755896574351996031381300244580,
1187 0.075039674810919952767043140916190,
1188 0.093125454583697605535065465083366,
1189 0.109387158802297641899210590325805,
1190 0.123491976262065851077958109831074,
1191 0.134709217311473325928054001771707,
1192 0.142775938577060080797094273138717,
1193 0.147739104901338491374841515972068,
1194 0.149445554002916905664936468389821
1199 gsl_integration_qk21 (
const gsl_function * f,
double a,
double b,
1200 double *result,
double *abserr,
1201 double *resabs,
double *resasc)
1203 double fv1[11], fv2[11];
1205 gsl_integration_qk (11, xgkB, wgB, wgkB, fv1, fv2, f, a, b, result, abserr, resabs, resasc);
1212 static const double xgkC[16] =
1214 0.998002298693397060285172840152271,
1215 0.987992518020485428489565718586613,
1216 0.967739075679139134257347978784337,
1217 0.937273392400705904307758947710209,
1218 0.897264532344081900882509656454496,
1219 0.848206583410427216200648320774217,
1220 0.790418501442465932967649294817947,
1221 0.724417731360170047416186054613938,
1222 0.650996741297416970533735895313275,
1223 0.570972172608538847537226737253911,
1224 0.485081863640239680693655740232351,
1225 0.394151347077563369897207370981045,
1226 0.299180007153168812166780024266389,
1227 0.201194093997434522300628303394596,
1228 0.101142066918717499027074231447392,
1229 0.000000000000000000000000000000000
1235 static const double wgC[8] =
1237 0.030753241996117268354628393577204,
1238 0.070366047488108124709267416450667,
1239 0.107159220467171935011869546685869,
1240 0.139570677926154314447804794511028,
1241 0.166269205816993933553200860481209,
1242 0.186161000015562211026800561866423,
1243 0.198431485327111576456118326443839,
1244 0.202578241925561272880620199967519
1247 static const double wgkC[16] =
1249 0.005377479872923348987792051430128,
1250 0.015007947329316122538374763075807,
1251 0.025460847326715320186874001019653,
1252 0.035346360791375846222037948478360,
1253 0.044589751324764876608227299373280,
1254 0.053481524690928087265343147239430,
1255 0.062009567800670640285139230960803,
1256 0.069854121318728258709520077099147,
1257 0.076849680757720378894432777482659,
1258 0.083080502823133021038289247286104,
1259 0.088564443056211770647275443693774,
1260 0.093126598170825321225486872747346,
1261 0.096642726983623678505179907627589,
1262 0.099173598721791959332393173484603,
1263 0.100769845523875595044946662617570,
1264 0.101330007014791549017374792767493
1268 gsl_integration_qk31 (
const gsl_function * f,
double a,
double b,
1269 double *result,
double *abserr,
1270 double *resabs,
double *resasc)
1272 double fv1[16], fv2[16];
1274 gsl_integration_qk (16, xgkC, wgC, wgkC, fv1, fv2, f, a, b, result, abserr, resabs, resasc);
1281 static const double xgkD[21] =
1283 0.998859031588277663838315576545863,
1284 0.993128599185094924786122388471320,
1285 0.981507877450250259193342994720217,
1286 0.963971927277913791267666131197277,
1287 0.940822633831754753519982722212443,
1288 0.912234428251325905867752441203298,
1289 0.878276811252281976077442995113078,
1290 0.839116971822218823394529061701521,
1291 0.795041428837551198350638833272788,
1292 0.746331906460150792614305070355642,
1293 0.693237656334751384805490711845932,
1294 0.636053680726515025452836696226286,
1295 0.575140446819710315342946036586425,
1296 0.510867001950827098004364050955251,
1297 0.443593175238725103199992213492640,
1298 0.373706088715419560672548177024927,
1299 0.301627868114913004320555356858592,
1300 0.227785851141645078080496195368575,
1301 0.152605465240922675505220241022678,
1302 0.076526521133497333754640409398838,
1303 0.000000000000000000000000000000000
1309 static const double wgD[11] =
1311 0.017614007139152118311861962351853,
1312 0.040601429800386941331039952274932,
1313 0.062672048334109063569506535187042,
1314 0.083276741576704748724758143222046,
1315 0.101930119817240435036750135480350,
1316 0.118194531961518417312377377711382,
1317 0.131688638449176626898494499748163,
1318 0.142096109318382051329298325067165,
1319 0.149172986472603746787828737001969,
1320 0.152753387130725850698084331955098
1323 static const double wgkD[21] =
1325 0.003073583718520531501218293246031,
1326 0.008600269855642942198661787950102,
1327 0.014626169256971252983787960308868,
1328 0.020388373461266523598010231432755,
1329 0.025882133604951158834505067096153,
1330 0.031287306777032798958543119323801,
1331 0.036600169758200798030557240707211,
1332 0.041668873327973686263788305936895,
1333 0.046434821867497674720231880926108,
1334 0.050944573923728691932707670050345,
1335 0.055195105348285994744832372419777,
1336 0.059111400880639572374967220648594,
1337 0.062653237554781168025870122174255,
1338 0.065834597133618422111563556969398,
1339 0.068648672928521619345623411885368,
1340 0.071054423553444068305790361723210,
1341 0.073030690332786667495189417658913,
1342 0.074582875400499188986581418362488,
1343 0.075704497684556674659542775376617,
1344 0.076377867672080736705502835038061,
1345 0.076600711917999656445049901530102
1349 gsl_integration_qk41 (
const gsl_function * f,
double a,
double b,
1350 double *result,
double *abserr,
1351 double *resabs,
double *resasc)
1353 double fv1[21], fv2[21];
1355 gsl_integration_qk (21, xgkD, wgD, wgkD, fv1, fv2, f, a, b, result, abserr, resabs, resasc);
1362 static const double xgkE[26] =
1364 0.999262104992609834193457486540341,
1365 0.995556969790498097908784946893902,
1366 0.988035794534077247637331014577406,
1367 0.976663921459517511498315386479594,
1368 0.961614986425842512418130033660167,
1369 0.942974571228974339414011169658471,
1370 0.920747115281701561746346084546331,
1371 0.894991997878275368851042006782805,
1372 0.865847065293275595448996969588340,
1373 0.833442628760834001421021108693570,
1374 0.797873797998500059410410904994307,
1375 0.759259263037357630577282865204361,
1376 0.717766406813084388186654079773298,
1377 0.673566368473468364485120633247622,
1378 0.626810099010317412788122681624518,
1379 0.577662930241222967723689841612654,
1380 0.526325284334719182599623778158010,
1381 0.473002731445714960522182115009192,
1382 0.417885382193037748851814394594572,
1383 0.361172305809387837735821730127641,
1384 0.303089538931107830167478909980339,
1385 0.243866883720988432045190362797452,
1386 0.183718939421048892015969888759528,
1387 0.122864692610710396387359818808037,
1388 0.061544483005685078886546392366797,
1389 0.000000000000000000000000000000000
1395 static const double wgE[13] =
1397 0.011393798501026287947902964113235,
1398 0.026354986615032137261901815295299,
1399 0.040939156701306312655623487711646,
1400 0.054904695975835191925936891540473,
1401 0.068038333812356917207187185656708,
1402 0.080140700335001018013234959669111,
1403 0.091028261982963649811497220702892,
1404 0.100535949067050644202206890392686,
1405 0.108519624474263653116093957050117,
1406 0.114858259145711648339325545869556,
1407 0.119455763535784772228178126512901,
1408 0.122242442990310041688959518945852,
1409 0.123176053726715451203902873079050
1412 static const double wgkE[26] =
1414 0.001987383892330315926507851882843,
1415 0.005561932135356713758040236901066,
1416 0.009473973386174151607207710523655,
1417 0.013236229195571674813656405846976,
1418 0.016847817709128298231516667536336,
1419 0.020435371145882835456568292235939,
1420 0.024009945606953216220092489164881,
1421 0.027475317587851737802948455517811,
1422 0.030792300167387488891109020215229,
1423 0.034002130274329337836748795229551,
1424 0.037116271483415543560330625367620,
1425 0.040083825504032382074839284467076,
1426 0.042872845020170049476895792439495,
1427 0.045502913049921788909870584752660,
1428 0.047982537138836713906392255756915,
1429 0.050277679080715671963325259433440,
1430 0.052362885806407475864366712137873,
1431 0.054251129888545490144543370459876,
1432 0.055950811220412317308240686382747,
1433 0.057437116361567832853582693939506,
1434 0.058689680022394207961974175856788,
1435 0.059720340324174059979099291932562,
1436 0.060539455376045862945360267517565,
1437 0.061128509717053048305859030416293,
1438 0.061471189871425316661544131965264,
1439 0.061580818067832935078759824240066
1445 gsl_integration_qk51 (
const gsl_function * f,
double a,
double b,
1446 double *result,
double *abserr,
1447 double *resabs,
double *resasc)
1449 double fv1[26], fv2[26];
1451 gsl_integration_qk (26, xgkE, wgE, wgkE, fv1, fv2, f, a, b, result, abserr, resabs, resasc);
1458 static const double xgkF[31] =
1460 0.999484410050490637571325895705811,
1461 0.996893484074649540271630050918695,
1462 0.991630996870404594858628366109486,
1463 0.983668123279747209970032581605663,
1464 0.973116322501126268374693868423707,
1465 0.960021864968307512216871025581798,
1466 0.944374444748559979415831324037439,
1467 0.926200047429274325879324277080474,
1468 0.905573307699907798546522558925958,
1469 0.882560535792052681543116462530226,
1470 0.857205233546061098958658510658944,
1471 0.829565762382768397442898119732502,
1472 0.799727835821839083013668942322683,
1473 0.767777432104826194917977340974503,
1474 0.733790062453226804726171131369528,
1475 0.697850494793315796932292388026640,
1476 0.660061064126626961370053668149271,
1477 0.620526182989242861140477556431189,
1478 0.579345235826361691756024932172540,
1479 0.536624148142019899264169793311073,
1480 0.492480467861778574993693061207709,
1481 0.447033769538089176780609900322854,
1482 0.400401254830394392535476211542661,
1483 0.352704725530878113471037207089374,
1484 0.304073202273625077372677107199257,
1485 0.254636926167889846439805129817805,
1486 0.204525116682309891438957671002025,
1487 0.153869913608583546963794672743256,
1488 0.102806937966737030147096751318001,
1489 0.051471842555317695833025213166723,
1490 0.000000000000000000000000000000000
1496 static const double wgF[15] =
1498 0.007968192496166605615465883474674,
1499 0.018466468311090959142302131912047,
1500 0.028784707883323369349719179611292,
1501 0.038799192569627049596801936446348,
1502 0.048402672830594052902938140422808,
1503 0.057493156217619066481721689402056,
1504 0.065974229882180495128128515115962,
1505 0.073755974737705206268243850022191,
1506 0.080755895229420215354694938460530,
1507 0.086899787201082979802387530715126,
1508 0.092122522237786128717632707087619,
1509 0.096368737174644259639468626351810,
1510 0.099593420586795267062780282103569,
1511 0.101762389748405504596428952168554,
1512 0.102852652893558840341285636705415
1515 static const double wgkF[31] =
1517 0.001389013698677007624551591226760,
1518 0.003890461127099884051267201844516,
1519 0.006630703915931292173319826369750,
1520 0.009273279659517763428441146892024,
1521 0.011823015253496341742232898853251,
1522 0.014369729507045804812451432443580,
1523 0.016920889189053272627572289420322,
1524 0.019414141193942381173408951050128,
1525 0.021828035821609192297167485738339,
1526 0.024191162078080601365686370725232,
1527 0.026509954882333101610601709335075,
1528 0.028754048765041292843978785354334,
1529 0.030907257562387762472884252943092,
1530 0.032981447057483726031814191016854,
1531 0.034979338028060024137499670731468,
1532 0.036882364651821229223911065617136,
1533 0.038678945624727592950348651532281,
1534 0.040374538951535959111995279752468,
1535 0.041969810215164246147147541285970,
1536 0.043452539701356069316831728117073,
1537 0.044814800133162663192355551616723,
1538 0.046059238271006988116271735559374,
1539 0.047185546569299153945261478181099,
1540 0.048185861757087129140779492298305,
1541 0.049055434555029778887528165367238,
1542 0.049795683427074206357811569379942,
1543 0.050405921402782346840893085653585,
1544 0.050881795898749606492297473049805,
1545 0.051221547849258772170656282604944,
1546 0.051426128537459025933862879215781,
1547 0.051494729429451567558340433647099
1551 gsl_integration_qk61 (
const gsl_function * f,
double a,
double b,
1552 double *result,
double *abserr,
1553 double *resabs,
double *resasc)
1555 double fv1[31], fv2[31];
1557 gsl_integration_qk (31, xgkF, wgF, wgkF, fv1, fv2, f, a, b, result, abserr, resabs, resasc);
1560 gsl_integration_workspace*
1561 gsl_integration_workspace_alloc (
const size_t n)
1563 gsl_integration_workspace* w ;
1567 GSL_ERROR_VAL (
"workspace length n must be positive integer",
1571 w = (gsl_integration_workspace *)
1572 malloc (
sizeof (gsl_integration_workspace));
1576 GSL_ERROR_VAL (
"failed to allocate space for workspace struct",
1580 w->alist = (
double *) malloc (n *
sizeof (
double));
1586 GSL_ERROR_VAL (
"failed to allocate space for alist ranges",
1590 w->blist = (
double *) malloc (n *
sizeof (
double));
1597 GSL_ERROR_VAL (
"failed to allocate space for blist ranges",
1601 w->rlist = (
double *) malloc (n *
sizeof (
double));
1609 GSL_ERROR_VAL (
"failed to allocate space for rlist ranges",
1614 w->elist = (
double *) malloc (n *
sizeof (
double));
1623 GSL_ERROR_VAL (
"failed to allocate space for elist ranges",
1627 w->order = (
size_t *) malloc (n *
sizeof (
size_t));
1637 GSL_ERROR_VAL (
"failed to allocate space for order ranges",
1641 w->level = (
size_t *) malloc (n *
sizeof (
size_t));
1652 GSL_ERROR_VAL (
"failed to allocate space for order ranges",
1658 w->maximum_level = 0 ;
1664 gsl_integration_workspace_free (gsl_integration_workspace * w)
1679 reset_nrmax (gsl_integration_workspace * workspace);
1682 reset_nrmax (gsl_integration_workspace * workspace)
1684 workspace->nrmax = 0;
1685 workspace->i = workspace->order[0] ;
1695 increase_nrmax (gsl_integration_workspace * workspace);
1698 increase_nrmax (gsl_integration_workspace * workspace)
1701 int id = workspace->nrmax;
1704 const size_t * level = workspace->level;
1705 const size_t * order = workspace->order;
1707 size_t limit = workspace->limit ;
1708 size_t last = workspace->size - 1 ;
1710 if (last > (1 + limit / 2))
1712 jupbnd = limit + 1 - last;
1719 for (k =
id; k <= jupbnd; k++)
1721 size_t i_max = order[workspace->nrmax];
1723 workspace->i = i_max ;
1725 if (level[i_max] < workspace->maximum_level)
1737 large_interval (gsl_integration_workspace * workspace)
1739 size_t i = workspace->i ;
1740 const size_t * level = workspace->level;
1742 if (level[i] < workspace->maximum_level)
1754 struct extrapolation_table
1763 initialise_table (
struct extrapolation_table *table);
1766 append_table (
struct extrapolation_table *table,
double y);
1769 initialise_table (
struct extrapolation_table *table)
1776 initialise_table (
struct extrapolation_table *table,
double y)
1779 table->rlist2[0] = y;
1784 append_table (
struct extrapolation_table *table,
double y)
1788 table->rlist2[n] = y;
1798 qelg (
struct extrapolation_table *table,
double *result,
double *abserr);
1801 qelg (
struct extrapolation_table *table,
double *result,
double *abserr)
1803 double *epstab = table->rlist2;
1804 double *res3la = table->res3la;
1805 const size_t n = table->n - 1;
1807 const double current = epstab[n];
1809 double absolute = GSL_DBL_MAX;
1810 double relative = 5 * GSL_DBL_EPSILON * fabs (current);
1812 const size_t newelm = n / 2;
1813 const size_t n_orig = n;
1817 const size_t nres_orig = table->nres;
1820 *abserr = GSL_DBL_MAX;
1825 *abserr = GSL_MAX_DBL (absolute, relative);
1829 epstab[n + 2] = epstab[n];
1830 epstab[n] = GSL_DBL_MAX;
1832 for (i = 0; i < newelm; i++)
1834 double res = epstab[n - 2 * i + 2];
1835 double e0 = epstab[n - 2 * i - 2];
1836 double e1 = epstab[n - 2 * i - 1];
1839 double e1abs = fabs (e1);
1840 double delta2 = e2 - e1;
1841 double err2 = fabs (delta2);
1842 double tol2 = GSL_MAX_DBL (fabs (e2), e1abs) * GSL_DBL_EPSILON;
1843 double delta3 = e1 - e0;
1844 double err3 = fabs (delta3);
1845 double tol3 = GSL_MAX_DBL (e1abs, fabs (e0)) * GSL_DBL_EPSILON;
1847 double e3, delta1, err1, tol1, ss;
1849 if (err2 <= tol2 && err3 <= tol3)
1855 absolute = err2 + err3;
1856 relative = 5 * GSL_DBL_EPSILON * fabs (res);
1857 *abserr = GSL_MAX_DBL (absolute, relative);
1861 e3 = epstab[n - 2 * i];
1862 epstab[n - 2 * i] = e1;
1864 err1 = fabs (delta1);
1865 tol1 = GSL_MAX_DBL (e1abs, fabs (e3)) * GSL_DBL_EPSILON;
1870 if (err1 <= tol1 || err2 <= tol2 || err3 <= tol3)
1876 ss = (1 / delta1 + 1 / delta2) - 1 / delta3;
1882 if (fabs (ss * e1) <= 0.0001)
1892 epstab[n - 2 * i] = res;
1895 const double error = err2 + fabs (res - e2) + err3;
1897 if (error <= *abserr)
1908 const size_t limexp = 50 - 1;
1910 if (n_final == limexp)
1912 n_final = 2 * (limexp / 2);
1916 if (n_orig % 2 == 1)
1918 for (i = 0; i <= newelm; i++)
1920 epstab[1 + i * 2] = epstab[i * 2 + 3];
1925 for (i = 0; i <= newelm; i++)
1927 epstab[i * 2] = epstab[i * 2 + 2];
1931 if (n_orig != n_final)
1933 for (i = 0; i <= n_final; i++)
1935 epstab[i] = epstab[n_orig - n_final + i];
1939 table->n = n_final + 1;
1943 res3la[nres_orig] = *result;
1944 *abserr = GSL_DBL_MAX;
1948 *abserr = (fabs (*result - res3la[2]) + fabs (*result - res3la[1])
1949 + fabs (*result - res3la[0]));
1951 res3la[0] = res3la[1];
1952 res3la[1] = res3la[2];
1953 res3la[2] = *result;
1962 table->nres = nres_orig + 1;
1964 *abserr = GSL_MAX_DBL (*abserr, 5 * GSL_DBL_EPSILON * fabs (*result));
1975 test_positivity (
double result,
double resabs);
1978 test_positivity (
double result,
double resabs)
1980 int status = (fabs (result) >= (1 - 50 * GSL_DBL_EPSILON) * resabs);
1985 static int qags (
const gsl_function * f,
const double a,
const double
1986 b,
const double epsabs,
const double epsrel,
const size_t limit,
1987 gsl_integration_workspace * workspace,
double *result,
double *abserr,
1988 gsl_integration_rule * q);
1991 gsl_integration_qags (
const gsl_function *f,
1993 double epsabs,
double epsrel,
size_t limit,
1994 gsl_integration_workspace * workspace,
1995 double * result,
double * abserr)
1997 int status = qags (f, a, b, epsabs, epsrel, limit,
2000 &gsl_integration_qk21) ;
2011 static double i_transform (
double t,
void *params);
2014 gsl_integration_qagi (gsl_function * f,
2015 double epsabs,
double epsrel,
size_t limit,
2016 gsl_integration_workspace * workspace,
2017 double *result,
double *abserr)
2021 gsl_function f_transform;
2023 f_transform.function = &i_transform;
2024 f_transform.params = f;
2026 status = qags (&f_transform, 0.0, 1.0,
2027 epsabs, epsrel, limit,
2030 &gsl_integration_qk15);
2036 i_transform (
double t,
void *params)
2038 gsl_function *f = (gsl_function *) params;
2039 double x = (1 - t) / t;
2040 double y = GSL_FN_EVAL (f, x) + GSL_FN_EVAL (f, -x);
2052 struct il_params {
double b ; gsl_function * f ; } ;
2054 static double il_transform (
double t,
void *params);
2057 gsl_integration_qagil (gsl_function * f,
2059 double epsabs,
double epsrel,
size_t limit,
2060 gsl_integration_workspace * workspace,
2061 double *result,
double *abserr)
2065 gsl_function f_transform;
2066 struct il_params transform_params ;
2068 transform_params.b = b ;
2069 transform_params.f = f ;
2071 f_transform.function = &il_transform;
2072 f_transform.params = &transform_params;
2074 status = qags (&f_transform, 0.0, 1.0,
2075 epsabs, epsrel, limit,
2078 &gsl_integration_qk15);
2084 il_transform (
double t,
void *params)
2086 struct il_params *p = (
struct il_params *) params;
2088 gsl_function * f = p->f;
2089 double x = b - (1 - t) / t;
2090 double y = GSL_FN_EVAL (f, x);
2101 struct iu_params {
double a ; gsl_function * f ; } ;
2103 static double iu_transform (
double t,
void *params);
2106 gsl_integration_qagiu (gsl_function * f,
2108 double epsabs,
double epsrel,
size_t limit,
2109 gsl_integration_workspace * workspace,
2110 double *result,
double *abserr)
2114 gsl_function f_transform;
2115 struct iu_params transform_params ;
2117 transform_params.a = a ;
2118 transform_params.f = f ;
2120 f_transform.function = &iu_transform;
2121 f_transform.params = &transform_params;
2123 status = qags (&f_transform, 0.0, 1.0,
2124 epsabs, epsrel, limit,
2127 &gsl_integration_qk15);
2133 iu_transform (
double t,
void *params)
2135 struct iu_params *p = (
struct iu_params *) params;
2137 gsl_function * f = p->f;
2138 double x = a + (1 - t) / t;
2139 double y = GSL_FN_EVAL (f, x);
2146 qags (
const gsl_function * f,
2147 const double a,
const double b,
2148 const double epsabs,
const double epsrel,
2150 gsl_integration_workspace * workspace,
2151 double *result,
double *abserr,
2152 gsl_integration_rule * q)
2154 double area, errsum;
2155 double res_ext, err_ext;
2156 double result0, abserr0, resabs0, resasc0;
2160 double error_over_large_intervals = 0;
2161 double reseps = 0, abseps = 0, correc = 0;
2163 int roundoff_type1 = 0, roundoff_type2 = 0, roundoff_type3 = 0;
2164 int error_type = 0, error_type2 = 0;
2166 size_t iteration = 0;
2168 int positive_integrand = 0;
2169 int extrapolate = 0;
2170 int disallow_extrapolation = 0;
2172 struct extrapolation_table table;
2176 initialise (workspace, a, b);
2181 if (limit > workspace->limit)
2183 GSL_ERROR (
"iteration limit exceeds available workspace", GSL_EINVAL) ;
2188 if (epsabs <= 0 && (epsrel < 50 * GSL_DBL_EPSILON || epsrel < 0.5e-28))
2190 GSL_ERROR (
"tolerance cannot be acheived with given epsabs and epsrel",
2196 q (f, a, b, &result0, &abserr0, &resabs0, &resasc0);
2198 set_initial_result (workspace, result0, abserr0);
2200 tolerance = GSL_MAX_DBL (epsabs, epsrel * fabs (result0));
2202 if (abserr0 <= 100 * GSL_DBL_EPSILON * resabs0 && abserr0 > tolerance)
2207 GSL_ERROR (
"cannot reach tolerance because of roundoff error"
2208 "on first attempt", GSL_EROUND);
2210 else if ((abserr0 <= tolerance && abserr0 != resasc0) || abserr0 == 0.0)
2217 else if (limit == 1)
2222 GSL_ERROR (
"a maximum of one iteration was insufficient", GSL_EMAXITER);
2227 initialise_table (&table);
2228 append_table (&table, result0);
2234 err_ext = GSL_DBL_MAX;
2236 positive_integrand = test_positivity (result0, resabs0);
2242 size_t current_level;
2243 double a1, b1, a2, b2;
2244 double a_i, b_i, r_i, e_i;
2245 double area1 = 0, area2 = 0, area12 = 0;
2246 double error1 = 0, error2 = 0, error12 = 0;
2247 double resasc1, resasc2;
2248 double resabs1, resabs2;
2253 retrieve (workspace, &a_i, &b_i, &r_i, &e_i);
2255 current_level = workspace->level[workspace->i] + 1;
2258 b1 = 0.5 * (a_i + b_i);
2264 q (f, a1, b1, &area1, &error1, &resabs1, &resasc1);
2265 q (f, a2, b2, &area2, &error2, &resabs2, &resasc2);
2267 area12 = area1 + area2;
2268 error12 = error1 + error2;
2278 errsum = errsum + error12 - e_i;
2279 area = area + area12 - r_i;
2281 tolerance = GSL_MAX_DBL (epsabs, epsrel * fabs (area));
2283 if (resasc1 != error1 && resasc2 != error2)
2285 double delta = r_i - area12;
2287 if (fabs (delta) <= 1.0e-5 * fabs (area12) && error12 >= 0.99 * e_i)
2298 if (iteration > 10 && error12 > e_i)
2306 if (roundoff_type1 + roundoff_type2 >= 10 || roundoff_type3 >= 20)
2311 if (roundoff_type2 >= 5)
2319 if (subinterval_too_small (a1, a2, b2))
2326 update (workspace, a1, b1, area1, error1, a2, b2, area2, error2);
2328 if (errsum <= tolerance)
2330 goto compute_result;
2338 if (iteration >= limit - 1)
2346 error_over_large_intervals = errsum;
2348 append_table (&table, area);
2352 if (disallow_extrapolation)
2357 error_over_large_intervals += -last_e_i;
2359 if (current_level < workspace->maximum_level)
2361 error_over_large_intervals += error12;
2369 if (large_interval (workspace))
2373 workspace->nrmax = 1;
2376 if (!error_type2 && error_over_large_intervals > ertest)
2378 if (increase_nrmax (workspace))
2384 append_table (&table, area);
2386 qelg (&table, &reseps, &abseps);
2390 if (ktmin > 5 && err_ext < 0.001 * errsum)
2395 if (abseps < err_ext)
2400 correc = error_over_large_intervals;
2401 ertest = GSL_MAX_DBL (epsabs, epsrel * fabs (reseps));
2402 if (err_ext <= ertest)
2410 disallow_extrapolation = 1;
2413 if (error_type == 5)
2420 reset_nrmax (workspace);
2422 error_over_large_intervals = errsum;
2425 while (iteration < limit);
2430 if (err_ext == GSL_DBL_MAX)
2431 goto compute_result;
2433 if (error_type || error_type2)
2443 if (res_ext != 0.0 && area != 0.0)
2445 if (err_ext / fabs (res_ext) > errsum / fabs (area))
2446 goto compute_result;
2448 else if (err_ext > errsum)
2450 goto compute_result;
2452 else if (area == 0.0)
2461 double max_area = GSL_MAX_DBL (fabs (res_ext), fabs (area));
2463 if (!positive_integrand && max_area < 0.01 * resabs0)
2468 double ratio = res_ext / area;
2470 if (ratio < 0.01 || ratio > 100.0 || errsum > fabs (area))
2478 *result = sum_results (workspace);
2488 if (error_type == 0)
2492 else if (error_type == 1)
2494 GSL_ERROR (
"number of iterations was insufficient", GSL_EMAXITER);
2496 else if (error_type == 2)
2498 GSL_ERROR (
"cannot reach tolerance because of roundoff error",
2501 else if (error_type == 3)
2503 GSL_ERROR (
"bad integrand behavior found in the integration interval",
2506 else if (error_type == 4)
2508 GSL_ERROR (
"roundoff error detected in the extrapolation table",
2511 else if (error_type == 5)
2513 GSL_ERROR (
"integral is divergent, or slowly convergent",
2517 GSL_ERROR (
"could not integrate function", GSL_EFAILED);