diff options
Diffstat (limited to 'gsl-1.9/doc/bspline.texi')
-rw-r--r-- | gsl-1.9/doc/bspline.texi | 158 |
1 files changed, 158 insertions, 0 deletions
diff --git a/gsl-1.9/doc/bspline.texi b/gsl-1.9/doc/bspline.texi new file mode 100644 index 0000000..718e280 --- /dev/null +++ b/gsl-1.9/doc/bspline.texi @@ -0,0 +1,158 @@ +@cindex basis splines, B-splines +@cindex splines, basis + +This chapter describes functions for the computation of smoothing +basis splines (B-splines). The header file @file{gsl_bspline.h} +contains prototypes for the bspline functions and related declarations. + +@menu +* Overview of B-splines:: +* Initializing the B-splines solver:: +* Constructing the knots vector:: +* Evaluation of B-spline basis functions:: +* Example programs for B-splines:: +* References and Further Reading:: +@end menu + +@node Overview of B-splines +@section Overview +@cindex basis splines, 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 @dfn{breakpoints}. These breakpoints +are then converted to @dfn{knots} by imposing various continuity +and smoothness conditions at each interface. Given a nondecreasing +knot vector @math{t = \{t_0, t_1, \dots, t_{n+k-1}\}}, the +@math{n} basis splines of order @math{k} are defined by +@tex +\beforedisplay +$$ +B_{i,1}(x) = \left\{\matrix{1, & t_i \le x < t_{i+1}\cr + 0, & else}\right. +$$ +$$ +B_{i,k}(x) = \left[(x - t_i)/(t_{i+k-1} - t_i)\right] B_{i,k-1}(x) + + \left[(t_{i+k} - x)/(t_{i+k} - t_{i+1})\right] B_{i+1,k-1}(x) +$$ +\afterdisplay +@end tex +@ifinfo + +@example +B_(i,1)(x) = (1, t_i <= x < t_(i+1) + (0, else +B_(i,k)(x) = [(x - t_i)/(t_(i+k-1) - t_i)] B_(i,k-1)(x) + [(t_(i+k) - x)/(t_(i+k) - t_(i+1))] B_(i+1,k-1)(x) +@end example + +@end ifinfo +for @math{i = 0, \dots, n-1}. The common case of cubic B-splines +is given by @math{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 @math{[a,b]} then +the B-spline basis functions form a complete set on that interval. +Therefore we can expand a smoothing function as +@tex +\beforedisplay +$$ +f(x) = \sum_{i=0}^{n-1} c_i B_{i,k}(x) +$$ +\afterdisplay +@end tex +@ifinfo + +@example +f(x) = \sum_i c_i B_(i,k)(x) +@end example + +@end ifinfo +given enough @math{(x_j, f(x_j))} data pairs. The @math{c_i} can +be readily obtained from a least-squares fit. + +@node Initializing the B-splines solver +@section Initializing the B-splines solver +@cindex basis splines, initializing + +@deftypefun {gsl_bspline_workspace *} gsl_bspline_alloc (const size_t @var{k}, const size_t @var{nbreak}) +This function allocates a workspace for computing B-splines of order +@var{k}. The number of breakpoints is given by @var{nbreak}. This +leads to @math{n = nbreak + k - 2} basis functions. Cubic B-splines +are specified by @math{k = 4}. The size of the workspace is +@math{O(5k + nbreak)}. +@end deftypefun + +@deftypefun void gsl_bspline_free (gsl_bspline_workspace * @var{w}) +This function frees the memory associated with the workspace @var{w}. +@end deftypefun + +@node Constructing the knots vector +@section Constructing the knots vector +@cindex knots + +@deftypefun int gsl_bspline_knots (const gsl_vector * @var{breakpts}, gsl_bspline_workspace * @var{w}) +This function computes the knots associated with the given breakpoints +and stores them internally in @code{w->knots}. +@end deftypefun + +@deftypefun int gsl_bspline_knots_uniform (const double a, const double b, gsl_bspline_workspace * @var{w}) +This function assumes uniformly spaced breakpoints on @math{[a,b]} +and constructs the corresponding knot vector using the previously +specified @var{nbreak} parameter. The knots are stored in +@code{w->knots}. +@end deftypefun + +@node Evaluation of B-spline basis functions +@section Evaluation of B-splines +@cindex basis splines, evaluation + +@deftypefun int gsl_bspline_eval (const double @var{x}, gsl_vector * @var{B}, gsl_bspline_workspace * @var{w}) +This function evaluates all B-spline basis functions at the position +@var{x} and stores them in @var{B}, so that the @math{i}th element +of @var{B} is @math{B_i(x)}. @var{B} must be of length +@math{n = nbreak + k - 2}. This value is also stored in @code{w->n}. +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. +@end deftypefun + +@node Example programs for B-splines +@section Example programs for B-splines +@cindex basis splines, examples + +The following program computes a linear least squares fit to data using +cubic B-spline basis functions with uniform breakpoints. The data is +generated from the curve @math{y(x) = \cos{(x)} \exp{(-0.1 x)}} on +@math{[0, 15]} with gaussian noise added. + +@example +@verbatiminclude examples/bspline.c +@end example + +The output can be plotted with @sc{gnu} @code{graph}. + +@example +$ ./a.out > bspline.dat +$ graph -T ps -X x -Y y -x 0 15 -y -1 1.3 < bspline.dat > bspline.ps +@end example + +@iftex +@sp 1 +@center @image{bspline,3.4in} +@end iftex + +@node References and Further Reading +@section References and Further Reading + +Further information on the algorithms described in this section can be +found in the following book, + +@itemize @asis +C. de Boor, @cite{A Practical Guide to Splines} (1978), Springer-Verlag, +ISBN 0-387-90356-9. +@end itemize + +@noindent +A large collection of B-spline routines is available in the +@sc{pppack} library available at @uref{http://www.netlib.org/pppack}. |