Thu 22 Sep 2011 08:12:00 PM UTC, original submission:
A working note...
The new B-spline routine gsl_bspline_knots_greville was added in
r4750, r4751, r4752, r4753, r4754, and r4755. It aims to provide the best B-spline basis to best approximate a given target set of Greville abscissae. The crux of the implementation is minimizing ||Ax-b||_2 for A describing the mapping from breakpoints to the Greville abscissae. It's just least squares.
Having worked with code a bit, I goofed and failed to include the constraint that breakpoints be strictly increasing. As of r4755 the implementation works for "benign" breakpoint requests but produces broken knot vectors for more challenging ones.
The correct implementation would minimize ||Ax-b||_2 subject to Cx>=d where C describes the difference between adjacent breakpoints and d is strictly positive (and likely double-precision epsilon). That falls into the classical "linear least squares with linear inequality constraints" camp and is covered by Lawson and Hanson in Chapter 23 of "Solving least squares problems" published by SIAM.
I need to spend some time investigating the right way to solve such a problem in the context of the GSL (either by implementing classical techniques or reformulating the problem for another constrained solve approach).
In the meantime, I do not wish to release a partially working implementation. I am removing gsl_bspline_knots_greville from the NEWS file and commenting out its mention in the documentation. I will add a link to this bug in the source code.
Once this bug is fixed, the NEWS entry should again be
I apologize for the partial-but-incomplete feature,
Rhys
|