626 const unsigned n = 8;
627 const double xgk[8] = {
628 0.991455371120812639206854697526329,
629 0.949107912342758524526189684047851,
630 0.864864423359769072789712788640926,
631 0.741531185599394439863864773280788,
632 0.586087235467691130294144838258730,
633 0.405845151377397166906606412076961,
634 0.207784955007898467600689403773245,
635 0.000000000000000000000000000000000
639 static const double wg[4] = {
640 0.129484966168869693270611432679082,
641 0.279705391489276667901467771423780,
642 0.381830050505118944950369775488975,
643 0.417959183673469387755102040816327
645 static const double wgk[8] = {
646 0.022935322010529224963732008058970,
647 0.063092092629978553290700663189204,
648 0.104790010322250183839876322541518,
649 0.140653259715525918745189590510238,
650 0.169004726639267902826583426598550,
651 0.190350578064785409913256402421014,
652 0.204432940075298892414161999234649,
653 0.209482141084727828012999174891714
655 unsigned j, k, iR, npts = 0;
661 for (iR = 0; iR < nR; ++iR) {
662 const double center = R[iR].
h.
data[0];
663 const double halfwidth = R[iR].
h.
data[1];
665 pts[npts++] = center;
667 for (j = 0; j < (n - 1) / 2; ++j) {
669 double w = halfwidth * xgk[j2];
670 pts[npts++] = center - w;
671 pts[npts++] = center + w;
673 for (j = 0; j < n/2; ++j) {
675 double w = halfwidth * xgk[j2];
676 pts[npts++] = center - w;
677 pts[npts++] = center + w;
683 f(1, npts, pts, fdata, fdim, vals);
685 for (k = 0; k < fdim; ++k) {
686 for (iR = 0; iR < nR; ++iR) {
687 const double halfwidth = R[iR].
h.
data[1];
688 double result_gauss = vals[0] * wg[n/2 - 1];
689 double result_kronrod = vals[0] * wgk[n - 1];
690 double result_abs = fabs(result_kronrod);
691 double result_asc, mean, err;
695 for (j = 0; j < (n - 1) / 2; ++j) {
697 double v = vals[npts] + vals[npts+1];
698 result_gauss += wg[j] * v;
699 result_kronrod += wgk[j2] * v;
700 result_abs += wgk[j2] * (fabs(vals[npts])
701 + fabs(vals[npts+1]));
704 for (j = 0; j < n/2; ++j) {
706 result_kronrod += wgk[j2] * (vals[npts] + vals[npts+1]);
707 result_abs += wgk[j2] * (fabs(vals[npts])
708 + fabs(vals[npts+1]));
713 R[iR].
ee[k].
val = result_kronrod * halfwidth;
719 mean = result_kronrod * 0.5;
720 result_asc = wgk[n - 1] * fabs(vals[0] - mean);
722 for (j = 0; j < (n - 1) / 2; ++j) {
724 result_asc += wgk[j2] * (fabs(vals[npts]-mean)
725 + fabs(vals[npts+1]-mean));
728 for (j = 0; j < n/2; ++j) {
730 result_asc += wgk[j2] * (fabs(vals[npts]-mean)
731 + fabs(vals[npts+1]-mean));
734 err = fabs(result_kronrod - result_gauss) * halfwidth;
735 result_abs *= halfwidth;
736 result_asc *= halfwidth;
737 if (result_asc != 0 && err != 0) {
738 double scale = pow((200 * err / result_asc), 1.5);
739 err = (scale < 1) ? result_asc * scale : result_asc;
741 if (result_abs > DBL_MIN / (50 * DBL_EPSILON)) {
742 double min_err = 50 * DBL_EPSILON * result_abs;
743 if (min_err > err) err = min_err;
745 R[iR].
ee[k].
err = err;
#define SUCCESS
Definition: cubature.c:109
unsigned splitDim
Definition: cubature.c:187
double * vals
Definition: cubature.c:237
static int alloc_rule_pts(rule *r, unsigned num_regions)
Definition: cubature.c:251
double * pts
Definition: cubature.c:236
double err
Definition: cubature.c:116
double val
Definition: cubature.c:116
hypercube h
Definition: cubature.c:186
#define FAILURE
Definition: cubature.c:110
esterr * ee
Definition: cubature.c:189
double * data
Definition: cubature.c:135