Cubic spline data smoother.
Algorithm 642 collected algorithms from ACM. Algorithm appeared in Acm-Trans. Math. Software, vol.12, no. 2, Jun., 1986, p. 150.
Translated from fortran by a combination of f2c and RHL.
538 int const n =
x.size();
539 double const ratio = 2.0;
540 double const tau = 1.618033989;
541 double avdf, avar, stat[6];
542 double p, q, delta, r1, r2, r3, r4;
543 double gf1, gf2, gf3, gf4, avh, err;
558 r[0] = &scratch[0] + 1;
559 r[1] = r[0] + (n + 2);
560 r[2] = r[1] + (n + 2);
562 t[0] = r[2] + (n + 2);
563 t[1] = t[0] + (n + 2);
564 double *u = t[1] + (n + 2);
565 double *v = u + (n + 2);
571 avdf = spint1(&
x[0], &avh, &f[0], &sdf[0], n,
y, c, r, t);
580 gf1 = spfit1(&
x[0], avh, &sdf[0], n, r1, &p, &q, avar, stat,
y, c, r, t, u, v);
585 gf2 = spfit1(&
x[0], avh, &sdf[0], n, r2, &p, &q, avar, stat,
y, c, r, t, u, v);
588 gf1 = spfit1(&
x[0], avh, &sdf[0], n, r1, &p, &q, avar, stat,
y, c, r, t, u, v);
609 gf3 = spfit1(&
x[0], avh, &sdf[0], n, r3, &p, &q, avar, stat,
y, c, r, t, u, v);
623 if (p > 0 && q > 0) {
627 delta = (r2 - r1) / tau;
630 gf3 = spfit1(&
x[0], avh, &sdf[0], n, r3, &p, &q, avar, stat,
y, c, r, t, u, v);
631 gf4 = spfit1(&
x[0], avh, &sdf[0], n, r4, &p, &q, avar, stat,
y, c, r, t, u, v);
643 gf3 = spfit1(&
x[0], avh, &sdf[0], n, r3, &p, &q, avar, stat,
y, c, r, t, u, v);
651 gf4 = spfit1(&
x[0], avh, &sdf[0], n, r4, &p, &q, avar, stat,
y, c, r, t, u, v);
654 err = (r2 - r1) / (r1 + r2);
655 }
while (err * err + 1 > 1 && err > 1e-6);
658 gf1 = spfit1(&
x[0], avh, &sdf[0], n, r1, &p, &q, avar, stat,
y, c, r, t, u, v);
664 spcof1(&
x[0], avh, &f[0], &sdf[0], n, p, q,
y, c, u, v);
666 stat[2] /= avdf * avdf;
667 stat[3] /= avdf * avdf;
668 stat[4] /= avdf * avdf;
672 if (errs !=
nullptr) {
673 sperr1(&
x[0], avh, &sdf[0], n, r, p, avar, errs);
678 if (chisq !=
nullptr) {
679 *chisq = n * stat[4];
void _allocateSpline(int const nknot)
Allocate the storage a Spline needs.
std::vector< std::vector< double > > _coeffs