Basis Splines¶ ↑
This chapter describes functions for the computation of smoothing basis splines (B-splines). This is only for GSL-1.9 or later.
Overview¶ ↑
B-splines are commonly used as basis functions to fit smoothing curves to large data sets. To do this, the abscissa axis is broken up into some number of intervals, where the endpoints of each interval are called breakpoints. These breakpoints are then converted to knots by imposing various continuity and smoothness conditions at each interface. Given a nondecreasing knot vector t = {t_0, t_1, dots, t_{n+k-1, the n basis splines of order k are defined by for i = 0, dots, n-1. The common case of cubic B-splines is given by k = 4. The above recurrence relation can be evaluated in a numerically stable way by the de Boor algorithm.
If we define appropriate knots on an interval [a,b] then the B-spline basis functions form a complete set on that interval. Therefore we can expand a smoothing function as given enough (x_j, f(x_j)) data pairs. The c_i can be readily obtained from a least-squares fit.
Initializing the B-splines solver¶ ↑
-
GSL::BSpline.alloc(k, nbreak)
This method creates a workspace for computing B-splines of order
k
. The number of breakpoints is given bynbreak
. This leads ton = nbreak + k - 2
basis functions. Cubic B-splines are specified byk = 4
. The size of the workspace isO(5k + nbreak)
.
Constructing the knots vector¶ ↑
-
GSL::BSpline#knots(breakpts)
This method computes the knots associated with the given breakpoints
breakpts
and returns the knots as aGSL::Vector::View
object.
-
GSL::BSpline#knots_uniform(a, b)
This method assumes uniformly spaced breakpoints on [
a,b
] and constructs the corresponding knot vector using the previously specifiednbreak
parameter.
Evaluation of B-splines¶ ↑
-
GSL::BSpline#eval(x[, B])
This method evaluates all B-spline basis functions at the position
x
and stores them inB
(if given), so that the ith element ofB
isB_i(x)
.B
must be of lengthn = nbreak + k - 2
. IfB
is not given, a newly created vector is returned.It is far more efficient to compute all of the basis functions at once than to compute them individually, due to the nature of the defining recurrence relation.