summaryrefslogtreecommitdiff
path: root/gsl-1.9/doc/gsl-ref.info-4
diff options
context:
space:
mode:
Diffstat (limited to 'gsl-1.9/doc/gsl-ref.info-4')
-rw-r--r--gsl-1.9/doc/gsl-ref.info-44426
1 files changed, 4426 insertions, 0 deletions
diff --git a/gsl-1.9/doc/gsl-ref.info-4 b/gsl-1.9/doc/gsl-ref.info-4
new file mode 100644
index 0000000..cedfd25
--- /dev/null
+++ b/gsl-1.9/doc/gsl-ref.info-4
@@ -0,0 +1,4426 @@
+This is gsl-ref.info, produced by makeinfo version 4.8 from
+gsl-ref.texi.
+
+INFO-DIR-SECTION Scientific software
+START-INFO-DIR-ENTRY
+* gsl-ref: (gsl-ref). GNU Scientific Library - Reference
+END-INFO-DIR-ENTRY
+
+ Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+2005, 2006, 2007 The GSL Team.
+
+ Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.2 or
+any later version published by the Free Software Foundation; with the
+Invariant Sections being "GNU General Public License" and "Free Software
+Needs Free Documentation", the Front-Cover text being "A GNU Manual",
+and with the Back-Cover Text being (a) (see below). A copy of the
+license is included in the section entitled "GNU Free Documentation
+License".
+
+ (a) The Back-Cover Text is: "You have freedom to copy and modify this
+GNU Manual, like GNU software."
+
+
+File: gsl-ref.info, Node: Linear fitting without a constant term, Next: Multi-parameter fitting, Prev: Linear regression, Up: Least-Squares Fitting
+
+36.3 Linear fitting without a constant term
+===========================================
+
+The functions described in this section can be used to perform
+least-squares fits to a straight line model without a constant term, Y
+= c_1 X.
+
+ -- Function: int gsl_fit_mul (const double * X, const size_t XSTRIDE,
+ const double * Y, const size_t YSTRIDE, size_t N, double *
+ C1, double * COV11, double * SUMSQ)
+ This function computes the best-fit linear regression coefficient
+ C1 of the model Y = c_1 X for the datasets (X, Y), two vectors of
+ length N with strides XSTRIDE and YSTRIDE. The errors on Y are
+ assumed unknown so the variance of the parameter C1 is estimated
+ from the scatter of the points around the best-fit line and
+ returned via the parameter COV11. The sum of squares of the
+ residuals from the best-fit line is returned in SUMSQ.
+
+ -- Function: int gsl_fit_wmul (const double * X, const size_t XSTRIDE,
+ const double * W, const size_t WSTRIDE, const double * Y,
+ const size_t YSTRIDE, size_t N, double * C1, double * COV11,
+ double * SUMSQ)
+ This function computes the best-fit linear regression coefficient
+ C1 of the model Y = c_1 X for the weighted datasets (X, Y), two
+ vectors of length N with strides XSTRIDE and YSTRIDE. The vector
+ W, of length N and stride WSTRIDE, specifies the weight of each
+ datapoint. The weight is the reciprocal of the variance for each
+ datapoint in Y.
+
+ The variance of the parameter C1 is computed using the weights and
+ returned via the parameter COV11. The weighted sum of squares of
+ the residuals from the best-fit line, \chi^2, is returned in CHISQ.
+
+ -- Function: int gsl_fit_mul_est (double X, double C1, double C11,
+ double * Y, double * Y_ERR)
+ This function uses the best-fit linear regression coefficient C1
+ and its covariance COV11 to compute the fitted function Y and its
+ standard deviation Y_ERR for the model Y = c_1 X at the point X.
+
+
+File: gsl-ref.info, Node: Multi-parameter fitting, Next: Fitting Examples, Prev: Linear fitting without a constant term, Up: Least-Squares Fitting
+
+36.4 Multi-parameter fitting
+============================
+
+The functions described in this section perform least-squares fits to a
+general linear model, y = X c where y is a vector of n observations, X
+is an n by p matrix of predictor variables, and the elements of the
+vector c are the p unknown best-fit parameters which are to be
+estimated. The chi-squared value is given by \chi^2 = \sum_i w_i (y_i
+- \sum_j X_{ij} c_j)^2.
+
+ This formulation can be used for fits to any number of functions
+and/or variables by preparing the n-by-p matrix X appropriately. For
+example, to fit to a p-th order polynomial in X, use the following
+matrix,
+
+ X_{ij} = x_i^j
+
+where the index i runs over the observations and the index j runs from
+0 to p-1.
+
+ To fit to a set of p sinusoidal functions with fixed frequencies
+\omega_1, \omega_2, ..., \omega_p, use,
+
+ X_{ij} = sin(\omega_j x_i)
+
+To fit to p independent variables x_1, x_2, ..., x_p, use,
+
+ X_{ij} = x_j(i)
+
+where x_j(i) is the i-th value of the predictor variable x_j.
+
+ The functions described in this section are declared in the header
+file `gsl_multifit.h'.
+
+ The solution of the general linear least-squares system requires an
+additional working space for intermediate results, such as the singular
+value decomposition of the matrix X.
+
+ -- Function: gsl_multifit_linear_workspace * gsl_multifit_linear_alloc
+ (size_t N, size_t P)
+ This function allocates a workspace for fitting a model to N
+ observations using P parameters.
+
+ -- Function: void gsl_multifit_linear_free
+ (gsl_multifit_linear_workspace * WORK)
+ This function frees the memory associated with the workspace W.
+
+ -- Function: int gsl_multifit_linear (const gsl_matrix * X, const
+ gsl_vector * Y, gsl_vector * C, gsl_matrix * COV, double *
+ CHISQ, gsl_multifit_linear_workspace * WORK)
+ -- Function: int gsl_multifit_linear_svd (const gsl_matrix * X, const
+ gsl_vector * Y, double TOL, size_t * RANK, gsl_vector * C,
+ gsl_matrix * COV, double * CHISQ,
+ gsl_multifit_linear_workspace * WORK)
+ These functions compute the best-fit parameters C of the model y =
+ X c for the observations Y and the matrix of predictor variables
+ X. The variance-covariance matrix of the model parameters COV is
+ estimated from the scatter of the observations about the best-fit.
+ The sum of squares of the residuals from the best-fit, \chi^2, is
+ returned in CHISQ.
+
+ The best-fit is found by singular value decomposition of the matrix
+ X using the preallocated workspace provided in WORK. The modified
+ Golub-Reinsch SVD algorithm is used, with column scaling to
+ improve the accuracy of the singular values. Any components which
+ have zero singular value (to machine precision) are discarded from
+ the fit. In the second form of the function the components are
+ discarded if the ratio of singular values s_i/s_0 falls below the
+ user-specified tolerance TOL, and the effective rank is returned
+ in RANK.
+
+ -- Function: int gsl_multifit_wlinear (const gsl_matrix * X, const
+ gsl_vector * W, const gsl_vector * Y, gsl_vector * C,
+ gsl_matrix * COV, double * CHISQ,
+ gsl_multifit_linear_workspace * WORK)
+ -- Function: int gsl_multifit_wlinear_svd (const gsl_matrix * X, const
+ gsl_vector * W, const gsl_vector * Y, double TOL, size_t *
+ RANK, gsl_vector * C, gsl_matrix * COV, double * CHISQ,
+ gsl_multifit_linear_workspace * WORK)
+ This function computes the best-fit parameters C of the weighted
+ model y = X c for the observations Y with weights W and the matrix
+ of predictor variables X. The covariance matrix of the model
+ parameters COV is computed with the given weights. The weighted
+ sum of squares of the residuals from the best-fit, \chi^2, is
+ returned in CHISQ.
+
+ The best-fit is found by singular value decomposition of the matrix
+ X using the preallocated workspace provided in WORK. Any
+ components which have zero singular value (to machine precision)
+ are discarded from the fit. In the second form of the function the
+ components are discarded if the ratio of singular values s_i/s_0
+ falls below the user-specified tolerance TOL, and the effective
+ rank is returned in RANK.
+
+ -- Function: int gsl_multifit_linear_est (const gsl_vector * X, const
+ gsl_vector * C, const gsl_matrix * COV, double * Y, double *
+ Y_ERR)
+ This function uses the best-fit multilinear regression coefficients
+ C and their covariance matrix COV to compute the fitted function
+ value Y and its standard deviation Y_ERR for the model y = x.c at
+ the point X.
+
+
+File: gsl-ref.info, Node: Fitting Examples, Next: Fitting References and Further Reading, Prev: Multi-parameter fitting, Up: Least-Squares Fitting
+
+36.5 Examples
+=============
+
+The following program computes a least squares straight-line fit to a
+simple dataset, and outputs the best-fit line and its associated one
+standard-deviation error bars.
+
+ #include <stdio.h>
+ #include <gsl/gsl_fit.h>
+
+ int
+ main (void)
+ {
+ int i, n = 4;
+ double x[4] = { 1970, 1980, 1990, 2000 };
+ double y[4] = { 12, 11, 14, 13 };
+ double w[4] = { 0.1, 0.2, 0.3, 0.4 };
+
+ double c0, c1, cov00, cov01, cov11, chisq;
+
+ gsl_fit_wlinear (x, 1, w, 1, y, 1, n,
+ &c0, &c1, &cov00, &cov01, &cov11,
+ &chisq);
+
+ printf ("# best fit: Y = %g + %g X\n", c0, c1);
+ printf ("# covariance matrix:\n");
+ printf ("# [ %g, %g\n# %g, %g]\n",
+ cov00, cov01, cov01, cov11);
+ printf ("# chisq = %g\n", chisq);
+
+ for (i = 0; i < n; i++)
+ printf ("data: %g %g %g\n",
+ x[i], y[i], 1/sqrt(w[i]));
+
+ printf ("\n");
+
+ for (i = -30; i < 130; i++)
+ {
+ double xf = x[0] + (i/100.0) * (x[n-1] - x[0]);
+ double yf, yf_err;
+
+ gsl_fit_linear_est (xf,
+ c0, c1,
+ cov00, cov01, cov11,
+ &yf, &yf_err);
+
+ printf ("fit: %g %g\n", xf, yf);
+ printf ("hi : %g %g\n", xf, yf + yf_err);
+ printf ("lo : %g %g\n", xf, yf - yf_err);
+ }
+ return 0;
+ }
+
+The following commands extract the data from the output of the program
+and display it using the GNU plotutils `graph' utility,
+
+ $ ./demo > tmp
+ $ more tmp
+ # best fit: Y = -106.6 + 0.06 X
+ # covariance matrix:
+ # [ 39602, -19.9
+ # -19.9, 0.01]
+ # chisq = 0.8
+
+ $ for n in data fit hi lo ;
+ do
+ grep "^$n" tmp | cut -d: -f2 > $n ;
+ done
+ $ graph -T X -X x -Y y -y 0 20 -m 0 -S 2 -Ie data
+ -S 0 -I a -m 1 fit -m 2 hi -m 2 lo
+
+ The next program performs a quadratic fit y = c_0 + c_1 x + c_2 x^2
+to a weighted dataset using the generalised linear fitting function
+`gsl_multifit_wlinear'. The model matrix X for a quadratic fit is
+given by,
+
+ X = [ 1 , x_0 , x_0^2 ;
+ 1 , x_1 , x_1^2 ;
+ 1 , x_2 , x_2^2 ;
+ ... , ... , ... ]
+
+where the column of ones corresponds to the constant term c_0. The two
+remaining columns corresponds to the terms c_1 x and c_2 x^2.
+
+ The program reads N lines of data in the format (X, Y, ERR) where
+ERR is the error (standard deviation) in the value Y.
+
+ #include <stdio.h>
+ #include <gsl/gsl_multifit.h>
+
+ int
+ main (int argc, char **argv)
+ {
+ int i, n;
+ double xi, yi, ei, chisq;
+ gsl_matrix *X, *cov;
+ gsl_vector *y, *w, *c;
+
+ if (argc != 2)
+ {
+ fprintf (stderr,"usage: fit n < data\n");
+ exit (-1);
+ }
+
+ n = atoi (argv[1]);
+
+ X = gsl_matrix_alloc (n, 3);
+ y = gsl_vector_alloc (n);
+ w = gsl_vector_alloc (n);
+
+ c = gsl_vector_alloc (3);
+ cov = gsl_matrix_alloc (3, 3);
+
+ for (i = 0; i < n; i++)
+ {
+ int count = fscanf (stdin, "%lg %lg %lg",
+ &xi, &yi, &ei);
+
+ if (count != 3)
+ {
+ fprintf (stderr, "error reading file\n");
+ exit (-1);
+ }
+
+ printf ("%g %g +/- %g\n", xi, yi, ei);
+
+ gsl_matrix_set (X, i, 0, 1.0);
+ gsl_matrix_set (X, i, 1, xi);
+ gsl_matrix_set (X, i, 2, xi*xi);
+
+ gsl_vector_set (y, i, yi);
+ gsl_vector_set (w, i, 1.0/(ei*ei));
+ }
+
+ {
+ gsl_multifit_linear_workspace * work
+ = gsl_multifit_linear_alloc (n, 3);
+ gsl_multifit_wlinear (X, w, y, c, cov,
+ &chisq, work);
+ gsl_multifit_linear_free (work);
+ }
+
+ #define C(i) (gsl_vector_get(c,(i)))
+ #define COV(i,j) (gsl_matrix_get(cov,(i),(j)))
+
+ {
+ printf ("# best fit: Y = %g + %g X + %g X^2\n",
+ C(0), C(1), C(2));
+
+ printf ("# covariance matrix:\n");
+ printf ("[ %+.5e, %+.5e, %+.5e \n",
+ COV(0,0), COV(0,1), COV(0,2));
+ printf (" %+.5e, %+.5e, %+.5e \n",
+ COV(1,0), COV(1,1), COV(1,2));
+ printf (" %+.5e, %+.5e, %+.5e ]\n",
+ COV(2,0), COV(2,1), COV(2,2));
+ printf ("# chisq = %g\n", chisq);
+ }
+
+ gsl_matrix_free (X);
+ gsl_vector_free (y);
+ gsl_vector_free (w);
+ gsl_vector_free (c);
+ gsl_matrix_free (cov);
+
+ return 0;
+ }
+
+A suitable set of data for fitting can be generated using the following
+program. It outputs a set of points with gaussian errors from the curve
+y = e^x in the region 0 < x < 2.
+
+ #include <stdio.h>
+ #include <math.h>
+ #include <gsl/gsl_randist.h>
+
+ int
+ main (void)
+ {
+ double x;
+ const gsl_rng_type * T;
+ gsl_rng * r;
+
+ gsl_rng_env_setup ();
+
+ T = gsl_rng_default;
+ r = gsl_rng_alloc (T);
+
+ for (x = 0.1; x < 2; x+= 0.1)
+ {
+ double y0 = exp (x);
+ double sigma = 0.1 * y0;
+ double dy = gsl_ran_gaussian (r, sigma);
+
+ printf ("%g %g %g\n", x, y0 + dy, sigma);
+ }
+
+ gsl_rng_free(r);
+
+ return 0;
+ }
+
+The data can be prepared by running the resulting executable program,
+
+ $ ./generate > exp.dat
+ $ more exp.dat
+ 0.1 0.97935 0.110517
+ 0.2 1.3359 0.12214
+ 0.3 1.52573 0.134986
+ 0.4 1.60318 0.149182
+ 0.5 1.81731 0.164872
+ 0.6 1.92475 0.182212
+ ....
+
+To fit the data use the previous program, with the number of data points
+given as the first argument. In this case there are 19 data points.
+
+ $ ./fit 19 < exp.dat
+ 0.1 0.97935 +/- 0.110517
+ 0.2 1.3359 +/- 0.12214
+ ...
+ # best fit: Y = 1.02318 + 0.956201 X + 0.876796 X^2
+ # covariance matrix:
+ [ +1.25612e-02, -3.64387e-02, +1.94389e-02
+ -3.64387e-02, +1.42339e-01, -8.48761e-02
+ +1.94389e-02, -8.48761e-02, +5.60243e-02 ]
+ # chisq = 23.0987
+
+The parameters of the quadratic fit match the coefficients of the
+expansion of e^x, taking into account the errors on the parameters and
+the O(x^3) difference between the exponential and quadratic functions
+for the larger values of x. The errors on the parameters are given by
+the square-root of the corresponding diagonal elements of the
+covariance matrix. The chi-squared per degree of freedom is 1.4,
+indicating a reasonable fit to the data.
+
+
+File: gsl-ref.info, Node: Fitting References and Further Reading, Prev: Fitting Examples, Up: Least-Squares Fitting
+
+36.6 References and Further Reading
+===================================
+
+A summary of formulas and techniques for least squares fitting can be
+found in the "Statistics" chapter of the Annual Review of Particle
+Physics prepared by the Particle Data Group,
+
+ `Review of Particle Properties', R.M. Barnett et al., Physical
+ Review D54, 1 (1996) `http://pdg.lbl.gov/'
+
+The Review of Particle Physics is available online at the website given
+above.
+
+ The tests used to prepare these routines are based on the NIST
+Statistical Reference Datasets. The datasets and their documentation are
+available from NIST at the following website,
+
+ `http://www.nist.gov/itl/div898/strd/index.html'.
+
+
+File: gsl-ref.info, Node: Nonlinear Least-Squares Fitting, Next: Basis Splines, Prev: Least-Squares Fitting, Up: Top
+
+37 Nonlinear Least-Squares Fitting
+**********************************
+
+This chapter describes functions for multidimensional nonlinear
+least-squares fitting. The library provides low level components for a
+variety of iterative solvers and convergence tests. These can be
+combined by the user to achieve the desired solution, with full access
+to the intermediate steps of the iteration. Each class of methods uses
+the same framework, so that you can switch between solvers at runtime
+without needing to recompile your program. Each instance of a solver
+keeps track of its own state, allowing the solvers to be used in
+multi-threaded programs.
+
+ The header file `gsl_multifit_nlin.h' contains prototypes for the
+multidimensional nonlinear fitting functions and related declarations.
+
+* Menu:
+
+* Overview of Nonlinear Least-Squares Fitting::
+* Initializing the Nonlinear Least-Squares Solver::
+* Providing the Function to be Minimized::
+* Iteration of the Minimization Algorithm::
+* Search Stopping Parameters for Minimization Algorithms::
+* Minimization Algorithms using Derivatives::
+* Minimization Algorithms without Derivatives::
+* Computing the covariance matrix of best fit parameters::
+* Example programs for Nonlinear Least-Squares Fitting::
+* References and Further Reading for Nonlinear Least-Squares Fitting::
+
+
+File: gsl-ref.info, Node: Overview of Nonlinear Least-Squares Fitting, Next: Initializing the Nonlinear Least-Squares Solver, Up: Nonlinear Least-Squares Fitting
+
+37.1 Overview
+=============
+
+The problem of multidimensional nonlinear least-squares fitting requires
+the minimization of the squared residuals of n functions, f_i, in p
+parameters, x_i,
+
+ \Phi(x) = (1/2) || F(x) ||^2
+ = (1/2) \sum_{i=1}^{n} f_i(x_1, ..., x_p)^2
+
+All algorithms proceed from an initial guess using the linearization,
+
+ \psi(p) = || F(x+p) || ~=~ || F(x) + J p ||
+
+where x is the initial point, p is the proposed step and J is the
+Jacobian matrix J_{ij} = d f_i / d x_j. Additional strategies are used
+to enlarge the region of convergence. These include requiring a
+decrease in the norm ||F|| on each step or using a trust region to
+avoid steps which fall outside the linear regime.
+
+ To perform a weighted least-squares fit of a nonlinear model Y(x,t)
+to data (t_i, y_i) with independent gaussian errors \sigma_i, use
+function components of the following form,
+
+ f_i = (Y(x, t_i) - y_i) / \sigma_i
+
+Note that the model parameters are denoted by x in this chapter since
+the non-linear least-squares algorithms are described geometrically
+(i.e. finding the minimum of a surface). The independent variable of
+any data to be fitted is denoted by t.
+
+ With the definition above the Jacobian is J_{ij} =(1 / \sigma_i) d
+Y_i / d x_j, where Y_i = Y(x,t_i).
+
+
+File: gsl-ref.info, Node: Initializing the Nonlinear Least-Squares Solver, Next: Providing the Function to be Minimized, Prev: Overview of Nonlinear Least-Squares Fitting, Up: Nonlinear Least-Squares Fitting
+
+37.2 Initializing the Solver
+============================
+
+ -- Function: gsl_multifit_fsolver * gsl_multifit_fsolver_alloc (const
+ gsl_multifit_fsolver_type * T, size_t N, size_t P)
+ This function returns a pointer to a newly allocated instance of a
+ solver of type T for N observations and P parameters. The number
+ of observations N must be greater than or equal to parameters P.
+
+ If there is insufficient memory to create the solver then the
+ function returns a null pointer and the error handler is invoked
+ with an error code of `GSL_ENOMEM'.
+
+ -- Function: gsl_multifit_fdfsolver * gsl_multifit_fdfsolver_alloc
+ (const gsl_multifit_fdfsolver_type * T, size_t N, size_t P)
+ This function returns a pointer to a newly allocated instance of a
+ derivative solver of type T for N observations and P parameters.
+ For example, the following code creates an instance of a
+ Levenberg-Marquardt solver for 100 data points and 3 parameters,
+
+ const gsl_multifit_fdfsolver_type * T
+ = gsl_multifit_fdfsolver_lmder;
+ gsl_multifit_fdfsolver * s
+ = gsl_multifit_fdfsolver_alloc (T, 100, 3);
+
+ The number of observations N must be greater than or equal to
+ parameters P.
+
+ If there is insufficient memory to create the solver then the
+ function returns a null pointer and the error handler is invoked
+ with an error code of `GSL_ENOMEM'.
+
+ -- Function: int gsl_multifit_fsolver_set (gsl_multifit_fsolver * S,
+ gsl_multifit_function * F, gsl_vector * X)
+ This function initializes, or reinitializes, an existing solver S
+ to use the function F and the initial guess X.
+
+ -- Function: int gsl_multifit_fdfsolver_set (gsl_multifit_fdfsolver *
+ S, gsl_multifit_function_fdf * FDF, gsl_vector * X)
+ This function initializes, or reinitializes, an existing solver S
+ to use the function and derivative FDF and the initial guess X.
+
+ -- Function: void gsl_multifit_fsolver_free (gsl_multifit_fsolver * S)
+ -- Function: void gsl_multifit_fdfsolver_free (gsl_multifit_fdfsolver
+ * S)
+ These functions free all the memory associated with the solver S.
+
+ -- Function: const char * gsl_multifit_fsolver_name (const
+ gsl_multifit_fsolver * S)
+ -- Function: const char * gsl_multifit_fdfsolver_name (const
+ gsl_multifit_fdfsolver * S)
+ These functions return a pointer to the name of the solver. For
+ example,
+
+ printf ("s is a '%s' solver\n",
+ gsl_multifit_fdfsolver_name (s));
+
+ would print something like `s is a 'lmder' solver'.
+
+
+File: gsl-ref.info, Node: Providing the Function to be Minimized, Next: Iteration of the Minimization Algorithm, Prev: Initializing the Nonlinear Least-Squares Solver, Up: Nonlinear Least-Squares Fitting
+
+37.3 Providing the Function to be Minimized
+===========================================
+
+You must provide n functions of p variables for the minimization
+algorithms to operate on. In order to allow for arbitrary parameters
+the functions are defined by the following data types:
+
+ -- Data Type: gsl_multifit_function
+ This data type defines a general system of functions with
+ arbitrary parameters.
+
+ `int (* f) (const gsl_vector * X, void * PARAMS, gsl_vector * F)'
+ this function should store the vector result f(x,params) in F
+ for argument X and arbitrary parameters PARAMS, returning an
+ appropriate error code if the function cannot be computed.
+
+ `size_t n'
+ the number of functions, i.e. the number of components of the
+ vector F.
+
+ `size_t p'
+ the number of independent variables, i.e. the number of
+ components of the vector X.
+
+ `void * params'
+ a pointer to the arbitrary parameters of the function.
+
+ -- Data Type: gsl_multifit_function_fdf
+ This data type defines a general system of functions with
+ arbitrary parameters and the corresponding Jacobian matrix of
+ derivatives,
+
+ `int (* f) (const gsl_vector * X, void * PARAMS, gsl_vector * F)'
+ this function should store the vector result f(x,params) in F
+ for argument X and arbitrary parameters PARAMS, returning an
+ appropriate error code if the function cannot be computed.
+
+ `int (* df) (const gsl_vector * X, void * PARAMS, gsl_matrix * J)'
+ this function should store the N-by-P matrix result J_ij = d
+ f_i(x,params) / d x_j in J for argument X and arbitrary
+ parameters PARAMS, returning an appropriate error code if the
+ function cannot be computed.
+
+ `int (* fdf) (const gsl_vector * X, void * PARAMS, gsl_vector * F, gsl_matrix * J)'
+ This function should set the values of the F and J as above,
+ for arguments X and arbitrary parameters PARAMS. This
+ function provides an optimization of the separate functions
+ for f(x) and J(x)--it is always faster to compute the
+ function and its derivative at the same time.
+
+ `size_t n'
+ the number of functions, i.e. the number of components of the
+ vector F.
+
+ `size_t p'
+ the number of independent variables, i.e. the number of
+ components of the vector X.
+
+ `void * params'
+ a pointer to the arbitrary parameters of the function.
+
+ Note that when fitting a non-linear model against experimental data,
+the data is passed to the functions above using the PARAMS argument and
+the trial best-fit parameters through the X argument.
+
+
+File: gsl-ref.info, Node: Iteration of the Minimization Algorithm, Next: Search Stopping Parameters for Minimization Algorithms, Prev: Providing the Function to be Minimized, Up: Nonlinear Least-Squares Fitting
+
+37.4 Iteration
+==============
+
+The following functions drive the iteration of each algorithm. Each
+function performs one iteration to update the state of any solver of the
+corresponding type. The same functions work for all solvers so that
+different methods can be substituted at runtime without modifications to
+the code.
+
+ -- Function: int gsl_multifit_fsolver_iterate (gsl_multifit_fsolver *
+ S)
+ -- Function: int gsl_multifit_fdfsolver_iterate
+ (gsl_multifit_fdfsolver * S)
+ These functions perform a single iteration of the solver S. If
+ the iteration encounters an unexpected problem then an error code
+ will be returned. The solver maintains a current estimate of the
+ best-fit parameters at all times.
+
+ The solver struct S contains the following entries, which can be
+used to track the progress of the solution:
+
+`gsl_vector * x'
+ The current position.
+
+`gsl_vector * f'
+ The function value at the current position.
+
+`gsl_vector * dx'
+ The difference between the current position and the previous
+ position, i.e. the last step, taken as a vector.
+
+`gsl_matrix * J'
+ The Jacobian matrix at the current position (for the
+ `gsl_multifit_fdfsolver' struct only)
+
+ The best-fit information also can be accessed with the following
+auxiliary functions,
+
+ -- Function: gsl_vector * gsl_multifit_fsolver_position (const
+ gsl_multifit_fsolver * S)
+ -- Function: gsl_vector * gsl_multifit_fdfsolver_position (const
+ gsl_multifit_fdfsolver * S)
+ These functions return the current position (i.e. best-fit
+ parameters) `s->x' of the solver S.
+
+
+File: gsl-ref.info, Node: Search Stopping Parameters for Minimization Algorithms, Next: Minimization Algorithms using Derivatives, Prev: Iteration of the Minimization Algorithm, Up: Nonlinear Least-Squares Fitting
+
+37.5 Search Stopping Parameters
+===============================
+
+A minimization procedure should stop when one of the following
+conditions is true:
+
+ * A minimum has been found to within the user-specified precision.
+
+ * A user-specified maximum number of iterations has been reached.
+
+ * An error has occurred.
+
+The handling of these conditions is under user control. The functions
+below allow the user to test the current estimate of the best-fit
+parameters in several standard ways.
+
+ -- Function: int gsl_multifit_test_delta (const gsl_vector * DX, const
+ gsl_vector * X, double EPSABS, double EPSREL)
+ This function tests for the convergence of the sequence by
+ comparing the last step DX with the absolute error EPSABS and
+ relative error EPSREL to the current position X. The test returns
+ `GSL_SUCCESS' if the following condition is achieved,
+
+ |dx_i| < epsabs + epsrel |x_i|
+
+ for each component of X and returns `GSL_CONTINUE' otherwise.
+
+ -- Function: int gsl_multifit_test_gradient (const gsl_vector * G,
+ double EPSABS)
+ This function tests the residual gradient G against the absolute
+ error bound EPSABS. Mathematically, the gradient should be
+ exactly zero at the minimum. The test returns `GSL_SUCCESS' if the
+ following condition is achieved,
+
+ \sum_i |g_i| < epsabs
+
+ and returns `GSL_CONTINUE' otherwise. This criterion is suitable
+ for situations where the precise location of the minimum, x, is
+ unimportant provided a value can be found where the gradient is
+ small enough.
+
+ -- Function: int gsl_multifit_gradient (const gsl_matrix * J, const
+ gsl_vector * F, gsl_vector * G)
+ This function computes the gradient G of \Phi(x) = (1/2)
+ ||F(x)||^2 from the Jacobian matrix J and the function values F,
+ using the formula g = J^T f.
+
+
+File: gsl-ref.info, Node: Minimization Algorithms using Derivatives, Next: Minimization Algorithms without Derivatives, Prev: Search Stopping Parameters for Minimization Algorithms, Up: Nonlinear Least-Squares Fitting
+
+37.6 Minimization Algorithms using Derivatives
+==============================================
+
+The minimization algorithms described in this section make use of both
+the function and its derivative. They require an initial guess for the
+location of the minimum. There is no absolute guarantee of
+convergence--the function must be suitable for this technique and the
+initial guess must be sufficiently close to the minimum for it to work.
+
+ -- Derivative Solver: gsl_multifit_fdfsolver_lmsder
+ This is a robust and efficient version of the Levenberg-Marquardt
+ algorithm as implemented in the scaled LMDER routine in MINPACK.
+ Minpack was written by Jorge J. More', Burton S. Garbow and
+ Kenneth E. Hillstrom.
+
+ The algorithm uses a generalized trust region to keep each step
+ under control. In order to be accepted a proposed new position x'
+ must satisfy the condition |D (x' - x)| < \delta, where D is a
+ diagonal scaling matrix and \delta is the size of the trust
+ region. The components of D are computed internally, using the
+ column norms of the Jacobian to estimate the sensitivity of the
+ residual to each component of x. This improves the behavior of the
+ algorithm for badly scaled functions.
+
+ On each iteration the algorithm attempts to minimize the linear
+ system |F + J p| subject to the constraint |D p| < \Delta. The
+ solution to this constrained linear system is found using the
+ Levenberg-Marquardt method.
+
+ The proposed step is now tested by evaluating the function at the
+ resulting point, x'. If the step reduces the norm of the function
+ sufficiently, and follows the predicted behavior of the function
+ within the trust region, then it is accepted and the size of the
+ trust region is increased. If the proposed step fails to improve
+ the solution, or differs significantly from the expected behavior
+ within the trust region, then the size of the trust region is
+ decreased and another trial step is computed.
+
+ The algorithm also monitors the progress of the solution and
+ returns an error if the changes in the solution are smaller than
+ the machine precision. The possible error codes are,
+
+ `GSL_ETOLF'
+ the decrease in the function falls below machine precision
+
+ `GSL_ETOLX'
+ the change in the position vector falls below machine
+ precision
+
+ `GSL_ETOLG'
+ the norm of the gradient, relative to the norm of the
+ function, falls below machine precision
+
+ These error codes indicate that further iterations will be
+ unlikely to change the solution from its current value.
+
+
+ -- Derivative Solver: gsl_multifit_fdfsolver_lmder
+ This is an unscaled version of the LMDER algorithm. The elements
+ of the diagonal scaling matrix D are set to 1. This algorithm may
+ be useful in circumstances where the scaled version of LMDER
+ converges too slowly, or the function is already scaled
+ appropriately.
+
+
+File: gsl-ref.info, Node: Minimization Algorithms without Derivatives, Next: Computing the covariance matrix of best fit parameters, Prev: Minimization Algorithms using Derivatives, Up: Nonlinear Least-Squares Fitting
+
+37.7 Minimization Algorithms without Derivatives
+================================================
+
+There are no algorithms implemented in this section at the moment.
+
+
+File: gsl-ref.info, Node: Computing the covariance matrix of best fit parameters, Next: Example programs for Nonlinear Least-Squares Fitting, Prev: Minimization Algorithms without Derivatives, Up: Nonlinear Least-Squares Fitting
+
+37.8 Computing the covariance matrix of best fit parameters
+===========================================================
+
+ -- Function: int gsl_multifit_covar (const gsl_matrix * J, double
+ EPSREL, gsl_matrix * COVAR)
+ This function uses the Jacobian matrix J to compute the covariance
+ matrix of the best-fit parameters, COVAR. The parameter EPSREL is
+ used to remove linear-dependent columns when J is rank deficient.
+
+ The covariance matrix is given by,
+
+ covar = (J^T J)^{-1}
+
+ and is computed by QR decomposition of J with column-pivoting. Any
+ columns of R which satisfy
+
+ |R_{kk}| <= epsrel |R_{11}|
+
+ are considered linearly-dependent and are excluded from the
+ covariance matrix (the corresponding rows and columns of the
+ covariance matrix are set to zero).
+
+ If the minimisation uses the weighted least-squares function f_i =
+ (Y(x, t_i) - y_i) / \sigma_i then the covariance matrix above
+ gives the statistical error on the best-fit parameters resulting
+ from the gaussian errors \sigma_i on the underlying data y_i.
+ This can be verified from the relation \delta f = J \delta c and
+ the fact that the fluctuations in f from the data y_i are
+ normalised by \sigma_i and so satisfy <\delta f \delta f^T> = I.
+
+ For an unweighted least-squares function f_i = (Y(x, t_i) - y_i)
+ the covariance matrix above should be multiplied by the variance
+ of the residuals about the best-fit \sigma^2 = \sum (y_i -
+ Y(x,t_i))^2 / (n-p) to give the variance-covariance matrix
+ \sigma^2 C. This estimates the statistical error on the best-fit
+ parameters from the scatter of the underlying data.
+
+ For more information about covariance matrices see *Note Fitting
+ Overview::.
+
+
+File: gsl-ref.info, Node: Example programs for Nonlinear Least-Squares Fitting, Next: References and Further Reading for Nonlinear Least-Squares Fitting, Prev: Computing the covariance matrix of best fit parameters, Up: Nonlinear Least-Squares Fitting
+
+37.9 Examples
+=============
+
+The following example program fits a weighted exponential model with
+background to experimental data, Y = A \exp(-\lambda t) + b. The first
+part of the program sets up the functions `expb_f' and `expb_df' to
+calculate the model and its Jacobian. The appropriate fitting function
+is given by,
+
+ f_i = ((A \exp(-\lambda t_i) + b) - y_i)/\sigma_i
+
+where we have chosen t_i = i. The Jacobian matrix J is the derivative
+of these functions with respect to the three parameters (A, \lambda,
+b). It is given by,
+
+ J_{ij} = d f_i / d x_j
+
+where x_0 = A, x_1 = \lambda and x_2 = b.
+
+ /* expfit.c -- model functions for exponential + background */
+
+ struct data {
+ size_t n;
+ double * y;
+ double * sigma;
+ };
+
+ int
+ expb_f (const gsl_vector * x, void *data,
+ gsl_vector * f)
+ {
+ size_t n = ((struct data *)data)->n;
+ double *y = ((struct data *)data)->y;
+ double *sigma = ((struct data *) data)->sigma;
+
+ double A = gsl_vector_get (x, 0);
+ double lambda = gsl_vector_get (x, 1);
+ double b = gsl_vector_get (x, 2);
+
+ size_t i;
+
+ for (i = 0; i < n; i++)
+ {
+ /* Model Yi = A * exp(-lambda * i) + b */
+ double t = i;
+ double Yi = A * exp (-lambda * t) + b;
+ gsl_vector_set (f, i, (Yi - y[i])/sigma[i]);
+ }
+
+ return GSL_SUCCESS;
+ }
+
+ int
+ expb_df (const gsl_vector * x, void *data,
+ gsl_matrix * J)
+ {
+ size_t n = ((struct data *)data)->n;
+ double *sigma = ((struct data *) data)->sigma;
+
+ double A = gsl_vector_get (x, 0);
+ double lambda = gsl_vector_get (x, 1);
+
+ size_t i;
+
+ for (i = 0; i < n; i++)
+ {
+ /* Jacobian matrix J(i,j) = dfi / dxj, */
+ /* where fi = (Yi - yi)/sigma[i], */
+ /* Yi = A * exp(-lambda * i) + b */
+ /* and the xj are the parameters (A,lambda,b) */
+ double t = i;
+ double s = sigma[i];
+ double e = exp(-lambda * t);
+ gsl_matrix_set (J, i, 0, e/s);
+ gsl_matrix_set (J, i, 1, -t * A * e/s);
+ gsl_matrix_set (J, i, 2, 1/s);
+ }
+ return GSL_SUCCESS;
+ }
+
+ int
+ expb_fdf (const gsl_vector * x, void *data,
+ gsl_vector * f, gsl_matrix * J)
+ {
+ expb_f (x, data, f);
+ expb_df (x, data, J);
+
+ return GSL_SUCCESS;
+ }
+
+The main part of the program sets up a Levenberg-Marquardt solver and
+some simulated random data. The data uses the known parameters
+(1.0,5.0,0.1) combined with gaussian noise (standard deviation = 0.1)
+over a range of 40 timesteps. The initial guess for the parameters is
+chosen as (0.0, 1.0, 0.0).
+
+ #include <stdlib.h>
+ #include <stdio.h>
+ #include <gsl/gsl_rng.h>
+ #include <gsl/gsl_randist.h>
+ #include <gsl/gsl_vector.h>
+ #include <gsl/gsl_blas.h>
+ #include <gsl/gsl_multifit_nlin.h>
+
+ #include "expfit.c"
+
+ #define N 40
+
+ void print_state (size_t iter, gsl_multifit_fdfsolver * s);
+
+ int
+ main (void)
+ {
+ const gsl_multifit_fdfsolver_type *T;
+ gsl_multifit_fdfsolver *s;
+ int status;
+ unsigned int i, iter = 0;
+ const size_t n = N;
+ const size_t p = 3;
+
+ gsl_matrix *covar = gsl_matrix_alloc (p, p);
+ double y[N], sigma[N];
+ struct data d = { n, y, sigma};
+ gsl_multifit_function_fdf f;
+ double x_init[3] = { 1.0, 0.0, 0.0 };
+ gsl_vector_view x = gsl_vector_view_array (x_init, p);
+ const gsl_rng_type * type;
+ gsl_rng * r;
+
+ gsl_rng_env_setup();
+
+ type = gsl_rng_default;
+ r = gsl_rng_alloc (type);
+
+ f.f = &expb_f;
+ f.df = &expb_df;
+ f.fdf = &expb_fdf;
+ f.n = n;
+ f.p = p;
+ f.params = &d;
+
+ /* This is the data to be fitted */
+
+ for (i = 0; i < n; i++)
+ {
+ double t = i;
+ y[i] = 1.0 + 5 * exp (-0.1 * t)
+ + gsl_ran_gaussian (r, 0.1);
+ sigma[i] = 0.1;
+ printf ("data: %u %g %g\n", i, y[i], sigma[i]);
+ };
+
+ T = gsl_multifit_fdfsolver_lmsder;
+ s = gsl_multifit_fdfsolver_alloc (T, n, p);
+ gsl_multifit_fdfsolver_set (s, &f, &x.vector);
+
+ print_state (iter, s);
+
+ do
+ {
+ iter++;
+ status = gsl_multifit_fdfsolver_iterate (s);
+
+ printf ("status = %s\n", gsl_strerror (status));
+
+ print_state (iter, s);
+
+ if (status)
+ break;
+
+ status = gsl_multifit_test_delta (s->dx, s->x,
+ 1e-4, 1e-4);
+ }
+ while (status == GSL_CONTINUE && iter < 500);
+
+ gsl_multifit_covar (s->J, 0.0, covar);
+
+ #define FIT(i) gsl_vector_get(s->x, i)
+ #define ERR(i) sqrt(gsl_matrix_get(covar,i,i))
+
+ {
+ double chi = gsl_blas_dnrm2(s->f);
+ double dof = n - p;
+ double c = GSL_MAX_DBL(1, chi / sqrt(dof));
+
+ printf("chisq/dof = %g\n", pow(chi, 2.0) / dof);
+
+ printf ("A = %.5f +/- %.5f\n", FIT(0), c*ERR(0));
+ printf ("lambda = %.5f +/- %.5f\n", FIT(1), c*ERR(1));
+ printf ("b = %.5f +/- %.5f\n", FIT(2), c*ERR(2));
+ }
+
+ printf ("status = %s\n", gsl_strerror (status));
+
+ gsl_multifit_fdfsolver_free (s);
+ gsl_matrix_free (covar);
+ gsl_rng_free (r);
+ return 0;
+ }
+
+ void
+ print_state (size_t iter, gsl_multifit_fdfsolver * s)
+ {
+ printf ("iter: %3u x = % 15.8f % 15.8f % 15.8f "
+ "|f(x)| = %g\n",
+ iter,
+ gsl_vector_get (s->x, 0),
+ gsl_vector_get (s->x, 1),
+ gsl_vector_get (s->x, 2),
+ gsl_blas_dnrm2 (s->f));
+ }
+
+The iteration terminates when the change in x is smaller than 0.0001, as
+both an absolute and relative change. Here are the results of running
+the program:
+
+ iter: 0 x=1.00000000 0.00000000 0.00000000 |f(x)|=117.349
+ status=success
+ iter: 1 x=1.64659312 0.01814772 0.64659312 |f(x)|=76.4578
+ status=success
+ iter: 2 x=2.85876037 0.08092095 1.44796363 |f(x)|=37.6838
+ status=success
+ iter: 3 x=4.94899512 0.11942928 1.09457665 |f(x)|=9.58079
+ status=success
+ iter: 4 x=5.02175572 0.10287787 1.03388354 |f(x)|=5.63049
+ status=success
+ iter: 5 x=5.04520433 0.10405523 1.01941607 |f(x)|=5.44398
+ status=success
+ iter: 6 x=5.04535782 0.10404906 1.01924871 |f(x)|=5.44397
+ chisq/dof = 0.800996
+ A = 5.04536 +/- 0.06028
+ lambda = 0.10405 +/- 0.00316
+ b = 1.01925 +/- 0.03782
+ status = success
+
+The approximate values of the parameters are found correctly, and the
+chi-squared value indicates a good fit (the chi-squared per degree of
+freedom is approximately 1). In this case the errors on the parameters
+can be estimated from the square roots of the diagonal elements of the
+covariance matrix.
+
+ If the chi-squared value shows a poor fit (i.e. chi^2/dof >> 1) then
+the error estimates obtained from the covariance matrix will be too
+small. In the example program the error estimates are multiplied by
+\sqrt{\chi^2/dof} in this case, a common way of increasing the errors
+for a poor fit. Note that a poor fit will result from the use an
+inappropriate model, and the scaled error estimates may then be outside
+the range of validity for gaussian errors.
+
+
+File: gsl-ref.info, Node: References and Further Reading for Nonlinear Least-Squares Fitting, Prev: Example programs for Nonlinear Least-Squares Fitting, Up: Nonlinear Least-Squares Fitting
+
+37.10 References and Further Reading
+====================================
+
+The MINPACK algorithm is described in the following article,
+
+ J.J. More', `The Levenberg-Marquardt Algorithm: Implementation and
+ Theory', Lecture Notes in Mathematics, v630 (1978), ed G. Watson.
+
+The following paper is also relevant to the algorithms described in this
+section,
+
+ J.J. More', B.S. Garbow, K.E. Hillstrom, "Testing Unconstrained
+ Optimization Software", ACM Transactions on Mathematical Software,
+ Vol 7, No 1 (1981), p 17-41.
+
+
+File: gsl-ref.info, Node: Basis Splines, Next: Physical Constants, Prev: Nonlinear Least-Squares Fitting, Up: Top
+
+38 Basis Splines
+****************
+
+This chapter describes functions for the computation of smoothing basis
+splines (B-splines). The header 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::
+
+
+File: gsl-ref.info, Node: Overview of B-splines, Next: Initializing the B-splines solver, Up: Basis Splines
+
+38.1 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
+
+ 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)
+
+ 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
+
+ f(x) = \sum_i c_i B_(i,k)(x)
+
+ given enough (x_j, f(x_j)) data pairs. The c_i can be readily
+obtained from a least-squares fit.
+
+
+File: gsl-ref.info, Node: Initializing the B-splines solver, Next: Constructing the knots vector, Prev: Overview of B-splines, Up: Basis Splines
+
+38.2 Initializing the B-splines solver
+======================================
+
+ -- Function: gsl_bspline_workspace * gsl_bspline_alloc (const size_t
+ K, const size_t NBREAK)
+ This function allocates a workspace for computing B-splines of
+ order K. The number of breakpoints is given by NBREAK. This leads
+ to n = nbreak + k - 2 basis functions. Cubic B-splines are
+ specified by k = 4. The size of the workspace is O(5k + nbreak).
+
+ -- Function: void gsl_bspline_free (gsl_bspline_workspace * W)
+ This function frees the memory associated with the workspace W.
+
+
+File: gsl-ref.info, Node: Constructing the knots vector, Next: Evaluation of B-spline basis functions, Prev: Initializing the B-splines solver, Up: Basis Splines
+
+38.3 Constructing the knots vector
+==================================
+
+ -- Function: int gsl_bspline_knots (const gsl_vector * BREAKPTS,
+ gsl_bspline_workspace * W)
+ This function computes the knots associated with the given
+ breakpoints and stores them internally in `w->knots'.
+
+ -- Function: int gsl_bspline_knots_uniform (const double a, const
+ double b, gsl_bspline_workspace * W)
+ This function assumes uniformly spaced breakpoints on [a,b] and
+ constructs the corresponding knot vector using the previously
+ specified NBREAK parameter. The knots are stored in `w->knots'.
+
+
+File: gsl-ref.info, Node: Evaluation of B-spline basis functions, Next: Example programs for B-splines, Prev: Constructing the knots vector, Up: Basis Splines
+
+38.4 Evaluation of B-splines
+============================
+
+ -- Function: int gsl_bspline_eval (const double X, gsl_vector * B,
+ gsl_bspline_workspace * W)
+ This function evaluates all B-spline basis functions at the
+ position X and stores them in B, so that the ith element of B is
+ B_i(x). B must be of length n = nbreak + k - 2. This value is also
+ stored in `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.
+
+
+File: gsl-ref.info, Node: Example programs for B-splines, Next: References and Further Reading, Prev: Evaluation of B-spline basis functions, Up: Basis Splines
+
+38.5 Example programs for B-splines
+===================================
+
+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 y(x) = \cos(x) \exp(-0.1 x) on [0, 15] with
+gaussian noise added.
+
+ #include <stdio.h>
+ #include <stdlib.h>
+ #include <math.h>
+ #include <gsl/gsl_bspline.h>
+ #include <gsl/gsl_multifit.h>
+ #include <gsl/gsl_rng.h>
+ #include <gsl/gsl_randist.h>
+
+ /* number of data points to fit */
+ #define N 200
+
+ /* number of fit coefficients */
+ #define NCOEFFS 8
+
+ /* nbreak = ncoeffs + 2 - k = ncoeffs - 2 since k = 4 */
+ #define NBREAK (NCOEFFS - 2)
+
+ int
+ main (void)
+ {
+ const size_t n = N;
+ const size_t ncoeffs = NCOEFFS;
+ const size_t nbreak = NBREAK;
+ size_t i, j;
+ gsl_bspline_workspace *bw;
+ gsl_vector *B;
+ double dy;
+ gsl_rng *r;
+ gsl_vector *c, *w;
+ gsl_vector *x, *y;
+ gsl_matrix *X, *cov;
+ gsl_multifit_linear_workspace *mw;
+ double chisq;
+
+ gsl_rng_env_setup();
+ r = gsl_rng_alloc(gsl_rng_default);
+
+ /* allocate a cubic bspline workspace (k = 4) */
+ bw = gsl_bspline_alloc(4, nbreak);
+ B = gsl_vector_alloc(ncoeffs);
+
+ x = gsl_vector_alloc(n);
+ y = gsl_vector_alloc(n);
+ X = gsl_matrix_alloc(n, ncoeffs);
+ c = gsl_vector_alloc(ncoeffs);
+ w = gsl_vector_alloc(n);
+ cov = gsl_matrix_alloc(ncoeffs, ncoeffs);
+ mw = gsl_multifit_linear_alloc(n, ncoeffs);
+
+ printf("#m=0,S=0\n");
+ /* this is the data to be fitted */
+ for (i = 0; i < n; ++i)
+ {
+ double sigma;
+ double xi = (15.0/(N-1)) * i;
+ double yi = cos(xi) * exp(-0.1 * xi);
+
+ sigma = 0.1;
+ dy = gsl_ran_gaussian(r, sigma);
+ yi += dy;
+
+ gsl_vector_set(x, i, xi);
+ gsl_vector_set(y, i, yi);
+ gsl_vector_set(w, i, 1.0 / (sigma*sigma));
+
+ printf("%f %f\n", xi, yi);
+ }
+
+ /* use uniform breakpoints on [0, 15] */
+ gsl_bspline_knots_uniform(0.0, 15.0, bw);
+
+ /* construct the fit matrix X */
+ for (i = 0; i < n; ++i)
+ {
+ double xi = gsl_vector_get(x, i);
+
+ /* compute B_j(xi) for all j */
+ gsl_bspline_eval(xi, B, bw);
+
+ /* fill in row i of X */
+ for (j = 0; j < ncoeffs; ++j)
+ {
+ double Bj = gsl_vector_get(B, j);
+ gsl_matrix_set(X, i, j, Bj);
+ }
+ }
+
+ /* do the fit */
+ gsl_multifit_wlinear(X, w, y, c, cov, &chisq, mw);
+
+ /* output the smoothed curve */
+ {
+ double xi, yi, yerr;
+
+ printf("#m=1,S=0\n");
+ for (xi = 0.0; xi < 15.0; xi += 0.1)
+ {
+ gsl_bspline_eval(xi, B, bw);
+ gsl_multifit_linear_est(B, c, cov, &yi, &yerr);
+ printf("%f %f\n", xi, yi);
+ }
+ }
+
+ gsl_rng_free(r);
+ gsl_bspline_free(bw);
+ gsl_vector_free(B);
+ gsl_vector_free(x);
+ gsl_vector_free(y);
+ gsl_matrix_free(X);
+ gsl_vector_free(c);
+ gsl_vector_free(w);
+ gsl_matrix_free(cov);
+ gsl_multifit_linear_free(mw);
+
+ return 0;
+ } /* main() */
+
+ The output can be plotted with GNU `graph'.
+
+ $ ./a.out > bspline.dat
+ $ graph -T ps -X x -Y y -x 0 15 -y -1 1.3 < bspline.dat > bspline.ps
+
+
+File: gsl-ref.info, Node: References and Further Reading, Prev: Example programs for B-splines, Up: Basis Splines
+
+38.6 References and Further Reading
+===================================
+
+Further information on the algorithms described in this section can be
+found in the following book,
+
+ C. de Boor, `A Practical Guide to Splines' (1978), Springer-Verlag,
+ ISBN 0-387-90356-9.
+
+A large collection of B-spline routines is available in the PPPACK
+library available at `http://www.netlib.org/pppack'.
+
+
+File: gsl-ref.info, Node: Physical Constants, Next: IEEE floating-point arithmetic, Prev: Basis Splines, Up: Top
+
+39 Physical Constants
+*********************
+
+This chapter describes macros for the values of physical constants, such
+as the speed of light, c, and gravitational constant, G. The values
+are available in different unit systems, including the standard MKSA
+system (meters, kilograms, seconds, amperes) and the CGSM system
+(centimeters, grams, seconds, gauss), which is commonly used in
+Astronomy.
+
+ The definitions of constants in the MKSA system are available in the
+file `gsl_const_mksa.h'. The constants in the CGSM system are defined
+in `gsl_const_cgsm.h'. Dimensionless constants, such as the fine
+structure constant, which are pure numbers are defined in
+`gsl_const_num.h'.
+
+* Menu:
+
+* Fundamental Constants::
+* Astronomy and Astrophysics::
+* Atomic and Nuclear Physics::
+* Measurement of Time::
+* Imperial Units ::
+* Speed and Nautical Units::
+* Printers Units::
+* Volume Area and Length::
+* Mass and Weight ::
+* Thermal Energy and Power::
+* Pressure::
+* Viscosity::
+* Light and Illumination::
+* Radioactivity::
+* Force and Energy::
+* Prefixes::
+* Physical Constant Examples::
+* Physical Constant References and Further Reading::
+
+ The full list of constants is described briefly below. Consult the
+header files themselves for the values of the constants used in the
+library.
+
+
+File: gsl-ref.info, Node: Fundamental Constants, Next: Astronomy and Astrophysics, Up: Physical Constants
+
+39.1 Fundamental Constants
+==========================
+
+`GSL_CONST_MKSA_SPEED_OF_LIGHT'
+ The speed of light in vacuum, c.
+
+`GSL_CONST_MKSA_VACUUM_PERMEABILITY'
+ The permeability of free space, \mu_0. This constant is defined in
+ the MKSA system only.
+
+`GSL_CONST_MKSA_VACUUM_PERMITTIVITY'
+ The permittivity of free space, \epsilon_0. This constant is
+ defined in the MKSA system only.
+
+`GSL_CONST_MKSA_PLANCKS_CONSTANT_H'
+ Planck's constant, h.
+
+`GSL_CONST_MKSA_PLANCKS_CONSTANT_HBAR'
+ Planck's constant divided by 2\pi, \hbar.
+
+`GSL_CONST_NUM_AVOGADRO'
+ Avogadro's number, N_a.
+
+`GSL_CONST_MKSA_FARADAY'
+ The molar charge of 1 Faraday.
+
+`GSL_CONST_MKSA_BOLTZMANN'
+ The Boltzmann constant, k.
+
+`GSL_CONST_MKSA_MOLAR_GAS'
+ The molar gas constant, R_0.
+
+`GSL_CONST_MKSA_STANDARD_GAS_VOLUME'
+ The standard gas volume, V_0.
+
+`GSL_CONST_MKSA_STEFAN_BOLTZMANN_CONSTANT'
+ The Stefan-Boltzmann radiation constant, \sigma.
+
+`GSL_CONST_MKSA_GAUSS'
+ The magnetic field of 1 Gauss.
+
+
+File: gsl-ref.info, Node: Astronomy and Astrophysics, Next: Atomic and Nuclear Physics, Prev: Fundamental Constants, Up: Physical Constants
+
+39.2 Astronomy and Astrophysics
+===============================
+
+`GSL_CONST_MKSA_ASTRONOMICAL_UNIT'
+ The length of 1 astronomical unit (mean earth-sun distance), au.
+
+`GSL_CONST_MKSA_GRAVITATIONAL_CONSTANT'
+ The gravitational constant, G.
+
+`GSL_CONST_MKSA_LIGHT_YEAR'
+ The distance of 1 light-year, ly.
+
+`GSL_CONST_MKSA_PARSEC'
+ The distance of 1 parsec, pc.
+
+`GSL_CONST_MKSA_GRAV_ACCEL'
+ The standard gravitational acceleration on Earth, g.
+
+`GSL_CONST_MKSA_SOLAR_MASS'
+ The mass of the Sun.
+
+
+File: gsl-ref.info, Node: Atomic and Nuclear Physics, Next: Measurement of Time, Prev: Astronomy and Astrophysics, Up: Physical Constants
+
+39.3 Atomic and Nuclear Physics
+===============================
+
+`GSL_CONST_MKSA_ELECTRON_CHARGE'
+ The charge of the electron, e.
+
+`GSL_CONST_MKSA_ELECTRON_VOLT'
+ The energy of 1 electron volt, eV.
+
+`GSL_CONST_MKSA_UNIFIED_ATOMIC_MASS'
+ The unified atomic mass, amu.
+
+`GSL_CONST_MKSA_MASS_ELECTRON'
+ The mass of the electron, m_e.
+
+`GSL_CONST_MKSA_MASS_MUON'
+ The mass of the muon, m_\mu.
+
+`GSL_CONST_MKSA_MASS_PROTON'
+ The mass of the proton, m_p.
+
+`GSL_CONST_MKSA_MASS_NEUTRON'
+ The mass of the neutron, m_n.
+
+`GSL_CONST_NUM_FINE_STRUCTURE'
+ The electromagnetic fine structure constant \alpha.
+
+`GSL_CONST_MKSA_RYDBERG'
+ The Rydberg constant, Ry, in units of energy. This is related to
+ the Rydberg inverse wavelength R by Ry = h c R.
+
+`GSL_CONST_MKSA_BOHR_RADIUS'
+ The Bohr radius, a_0.
+
+`GSL_CONST_MKSA_ANGSTROM'
+ The length of 1 angstrom.
+
+`GSL_CONST_MKSA_BARN'
+ The area of 1 barn.
+
+`GSL_CONST_MKSA_BOHR_MAGNETON'
+ The Bohr Magneton, \mu_B.
+
+`GSL_CONST_MKSA_NUCLEAR_MAGNETON'
+ The Nuclear Magneton, \mu_N.
+
+`GSL_CONST_MKSA_ELECTRON_MAGNETIC_MOMENT'
+ The absolute value of the magnetic moment of the electron, \mu_e.
+ The physical magnetic moment of the electron is negative.
+
+`GSL_CONST_MKSA_PROTON_MAGNETIC_MOMENT'
+ The magnetic moment of the proton, \mu_p.
+
+`GSL_CONST_MKSA_THOMSON_CROSS_SECTION'
+ The Thomson cross section, \sigma_T.
+
+`GSL_CONST_MKSA_DEBYE'
+ The electric dipole moment of 1 Debye, D.
+
+
+File: gsl-ref.info, Node: Measurement of Time, Next: Imperial Units, Prev: Atomic and Nuclear Physics, Up: Physical Constants
+
+39.4 Measurement of Time
+========================
+
+`GSL_CONST_MKSA_MINUTE'
+ The number of seconds in 1 minute.
+
+`GSL_CONST_MKSA_HOUR'
+ The number of seconds in 1 hour.
+
+`GSL_CONST_MKSA_DAY'
+ The number of seconds in 1 day.
+
+`GSL_CONST_MKSA_WEEK'
+ The number of seconds in 1 week.
+
+
+File: gsl-ref.info, Node: Imperial Units, Next: Speed and Nautical Units, Prev: Measurement of Time, Up: Physical Constants
+
+39.5 Imperial Units
+===================
+
+`GSL_CONST_MKSA_INCH'
+ The length of 1 inch.
+
+`GSL_CONST_MKSA_FOOT'
+ The length of 1 foot.
+
+`GSL_CONST_MKSA_YARD'
+ The length of 1 yard.
+
+`GSL_CONST_MKSA_MILE'
+ The length of 1 mile.
+
+`GSL_CONST_MKSA_MIL'
+ The length of 1 mil (1/1000th of an inch).
+
+
+File: gsl-ref.info, Node: Speed and Nautical Units, Next: Printers Units, Prev: Imperial Units, Up: Physical Constants
+
+39.6 Speed and Nautical Units
+=============================
+
+`GSL_CONST_MKSA_KILOMETERS_PER_HOUR'
+ The speed of 1 kilometer per hour.
+
+`GSL_CONST_MKSA_MILES_PER_HOUR'
+ The speed of 1 mile per hour.
+
+`GSL_CONST_MKSA_NAUTICAL_MILE'
+ The length of 1 nautical mile.
+
+`GSL_CONST_MKSA_FATHOM'
+ The length of 1 fathom.
+
+`GSL_CONST_MKSA_KNOT'
+ The speed of 1 knot.
+
+
+File: gsl-ref.info, Node: Printers Units, Next: Volume Area and Length, Prev: Speed and Nautical Units, Up: Physical Constants
+
+39.7 Printers Units
+===================
+
+`GSL_CONST_MKSA_POINT'
+ The length of 1 printer's point (1/72 inch).
+
+`GSL_CONST_MKSA_TEXPOINT'
+ The length of 1 TeX point (1/72.27 inch).
+
+
+File: gsl-ref.info, Node: Volume Area and Length, Next: Mass and Weight, Prev: Printers Units, Up: Physical Constants
+
+39.8 Volume, Area and Length
+============================
+
+`GSL_CONST_MKSA_MICRON'
+ The length of 1 micron.
+
+`GSL_CONST_MKSA_HECTARE'
+ The area of 1 hectare.
+
+`GSL_CONST_MKSA_ACRE'
+ The area of 1 acre.
+
+`GSL_CONST_MKSA_LITER'
+ The volume of 1 liter.
+
+`GSL_CONST_MKSA_US_GALLON'
+ The volume of 1 US gallon.
+
+`GSL_CONST_MKSA_CANADIAN_GALLON'
+ The volume of 1 Canadian gallon.
+
+`GSL_CONST_MKSA_UK_GALLON'
+ The volume of 1 UK gallon.
+
+`GSL_CONST_MKSA_QUART'
+ The volume of 1 quart.
+
+`GSL_CONST_MKSA_PINT'
+ The volume of 1 pint.
+
+
+File: gsl-ref.info, Node: Mass and Weight, Next: Thermal Energy and Power, Prev: Volume Area and Length, Up: Physical Constants
+
+39.9 Mass and Weight
+====================
+
+`GSL_CONST_MKSA_POUND_MASS'
+ The mass of 1 pound.
+
+`GSL_CONST_MKSA_OUNCE_MASS'
+ The mass of 1 ounce.
+
+`GSL_CONST_MKSA_TON'
+ The mass of 1 ton.
+
+`GSL_CONST_MKSA_METRIC_TON'
+ The mass of 1 metric ton (1000 kg).
+
+`GSL_CONST_MKSA_UK_TON'
+ The mass of 1 UK ton.
+
+`GSL_CONST_MKSA_TROY_OUNCE'
+ The mass of 1 troy ounce.
+
+`GSL_CONST_MKSA_CARAT'
+ The mass of 1 carat.
+
+`GSL_CONST_MKSA_GRAM_FORCE'
+ The force of 1 gram weight.
+
+`GSL_CONST_MKSA_POUND_FORCE'
+ The force of 1 pound weight.
+
+`GSL_CONST_MKSA_KILOPOUND_FORCE'
+ The force of 1 kilopound weight.
+
+`GSL_CONST_MKSA_POUNDAL'
+ The force of 1 poundal.
+
+
+File: gsl-ref.info, Node: Thermal Energy and Power, Next: Pressure, Prev: Mass and Weight, Up: Physical Constants
+
+39.10 Thermal Energy and Power
+==============================
+
+`GSL_CONST_MKSA_CALORIE'
+ The energy of 1 calorie.
+
+`GSL_CONST_MKSA_BTU'
+ The energy of 1 British Thermal Unit, btu.
+
+`GSL_CONST_MKSA_THERM'
+ The energy of 1 Therm.
+
+`GSL_CONST_MKSA_HORSEPOWER'
+ The power of 1 horsepower.
+
+
+File: gsl-ref.info, Node: Pressure, Next: Viscosity, Prev: Thermal Energy and Power, Up: Physical Constants
+
+39.11 Pressure
+==============
+
+`GSL_CONST_MKSA_BAR'
+ The pressure of 1 bar.
+
+`GSL_CONST_MKSA_STD_ATMOSPHERE'
+ The pressure of 1 standard atmosphere.
+
+`GSL_CONST_MKSA_TORR'
+ The pressure of 1 torr.
+
+`GSL_CONST_MKSA_METER_OF_MERCURY'
+ The pressure of 1 meter of mercury.
+
+`GSL_CONST_MKSA_INCH_OF_MERCURY'
+ The pressure of 1 inch of mercury.
+
+`GSL_CONST_MKSA_INCH_OF_WATER'
+ The pressure of 1 inch of water.
+
+`GSL_CONST_MKSA_PSI'
+ The pressure of 1 pound per square inch.
+
+
+File: gsl-ref.info, Node: Viscosity, Next: Light and Illumination, Prev: Pressure, Up: Physical Constants
+
+39.12 Viscosity
+===============
+
+`GSL_CONST_MKSA_POISE'
+ The dynamic viscosity of 1 poise.
+
+`GSL_CONST_MKSA_STOKES'
+ The kinematic viscosity of 1 stokes.
+
+
+File: gsl-ref.info, Node: Light and Illumination, Next: Radioactivity, Prev: Viscosity, Up: Physical Constants
+
+39.13 Light and Illumination
+============================
+
+`GSL_CONST_MKSA_STILB'
+ The luminance of 1 stilb.
+
+`GSL_CONST_MKSA_LUMEN'
+ The luminous flux of 1 lumen.
+
+`GSL_CONST_MKSA_LUX'
+ The illuminance of 1 lux.
+
+`GSL_CONST_MKSA_PHOT'
+ The illuminance of 1 phot.
+
+`GSL_CONST_MKSA_FOOTCANDLE'
+ The illuminance of 1 footcandle.
+
+`GSL_CONST_MKSA_LAMBERT'
+ The luminance of 1 lambert.
+
+`GSL_CONST_MKSA_FOOTLAMBERT'
+ The luminance of 1 footlambert.
+
+
+File: gsl-ref.info, Node: Radioactivity, Next: Force and Energy, Prev: Light and Illumination, Up: Physical Constants
+
+39.14 Radioactivity
+===================
+
+`GSL_CONST_MKSA_CURIE'
+ The activity of 1 curie.
+
+`GSL_CONST_MKSA_ROENTGEN'
+ The exposure of 1 roentgen.
+
+`GSL_CONST_MKSA_RAD'
+ The absorbed dose of 1 rad.
+
+
+File: gsl-ref.info, Node: Force and Energy, Next: Prefixes, Prev: Radioactivity, Up: Physical Constants
+
+39.15 Force and Energy
+======================
+
+`GSL_CONST_MKSA_NEWTON'
+ The SI unit of force, 1 Newton.
+
+`GSL_CONST_MKSA_DYNE'
+ The force of 1 Dyne = 10^-5 Newton.
+
+`GSL_CONST_MKSA_JOULE'
+ The SI unit of energy, 1 Joule.
+
+`GSL_CONST_MKSA_ERG'
+ The energy 1 erg = 10^-7 Joule.
+
+
+File: gsl-ref.info, Node: Prefixes, Next: Physical Constant Examples, Prev: Force and Energy, Up: Physical Constants
+
+39.16 Prefixes
+==============
+
+These constants are dimensionless scaling factors.
+
+`GSL_CONST_NUM_YOTTA'
+ 10^24
+
+`GSL_CONST_NUM_ZETTA'
+ 10^21
+
+`GSL_CONST_NUM_EXA'
+ 10^18
+
+`GSL_CONST_NUM_PETA'
+ 10^15
+
+`GSL_CONST_NUM_TERA'
+ 10^12
+
+`GSL_CONST_NUM_GIGA'
+ 10^9
+
+`GSL_CONST_NUM_MEGA'
+ 10^6
+
+`GSL_CONST_NUM_KILO'
+ 10^3
+
+`GSL_CONST_NUM_MILLI'
+ 10^-3
+
+`GSL_CONST_NUM_MICRO'
+ 10^-6
+
+`GSL_CONST_NUM_NANO'
+ 10^-9
+
+`GSL_CONST_NUM_PICO'
+ 10^-12
+
+`GSL_CONST_NUM_FEMTO'
+ 10^-15
+
+`GSL_CONST_NUM_ATTO'
+ 10^-18
+
+`GSL_CONST_NUM_ZEPTO'
+ 10^-21
+
+`GSL_CONST_NUM_YOCTO'
+ 10^-24
+
+
+File: gsl-ref.info, Node: Physical Constant Examples, Next: Physical Constant References and Further Reading, Prev: Prefixes, Up: Physical Constants
+
+39.17 Examples
+==============
+
+The following program demonstrates the use of the physical constants in
+a calculation. In this case, the goal is to calculate the range of
+light-travel times from Earth to Mars.
+
+ The required data is the average distance of each planet from the
+Sun in astronomical units (the eccentricities and inclinations of the
+orbits will be neglected for the purposes of this calculation). The
+average radius of the orbit of Mars is 1.52 astronomical units, and for
+the orbit of Earth it is 1 astronomical unit (by definition). These
+values are combined with the MKSA values of the constants for the speed
+of light and the length of an astronomical unit to produce a result for
+the shortest and longest light-travel times in seconds. The figures are
+converted into minutes before being displayed.
+
+ #include <stdio.h>
+ #include <gsl/gsl_const_mksa.h>
+
+ int
+ main (void)
+ {
+ double c = GSL_CONST_MKSA_SPEED_OF_LIGHT;
+ double au = GSL_CONST_MKSA_ASTRONOMICAL_UNIT;
+ double minutes = GSL_CONST_MKSA_MINUTE;
+
+ /* distance stored in meters */
+ double r_earth = 1.00 * au;
+ double r_mars = 1.52 * au;
+
+ double t_min, t_max;
+
+ t_min = (r_mars - r_earth) / c;
+ t_max = (r_mars + r_earth) / c;
+
+ printf ("light travel time from Earth to Mars:\n");
+ printf ("minimum = %.1f minutes\n", t_min / minutes);
+ printf ("maximum = %.1f minutes\n", t_max / minutes);
+
+ return 0;
+ }
+
+Here is the output from the program,
+
+ light travel time from Earth to Mars:
+ minimum = 4.3 minutes
+ maximum = 21.0 minutes
+
+
+File: gsl-ref.info, Node: Physical Constant References and Further Reading, Prev: Physical Constant Examples, Up: Physical Constants
+
+39.18 References and Further Reading
+====================================
+
+The authoritative sources for physical constants are the 2002 CODATA
+recommended values, published in the articles below. Further information
+on the values of physical constants is also available from the cited
+articles and the NIST website.
+
+ Journal of Physical and Chemical Reference Data, 28(6), 1713-1852,
+ 1999
+
+ Reviews of Modern Physics, 72(2), 351-495, 2000
+
+ `http://www.physics.nist.gov/cuu/Constants/index.html'
+
+ `http://physics.nist.gov/Pubs/SP811/appenB9.html'
+
+
+File: gsl-ref.info, Node: IEEE floating-point arithmetic, Next: Debugging Numerical Programs, Prev: Physical Constants, Up: Top
+
+40 IEEE floating-point arithmetic
+*********************************
+
+This chapter describes functions for examining the representation of
+floating point numbers and controlling the floating point environment of
+your program. The functions described in this chapter are declared in
+the header file `gsl_ieee_utils.h'.
+
+* Menu:
+
+* Representation of floating point numbers::
+* Setting up your IEEE environment::
+* IEEE References and Further Reading::
+
+
+File: gsl-ref.info, Node: Representation of floating point numbers, Next: Setting up your IEEE environment, Up: IEEE floating-point arithmetic
+
+40.1 Representation of floating point numbers
+=============================================
+
+The IEEE Standard for Binary Floating-Point Arithmetic defines binary
+formats for single and double precision numbers. Each number is
+composed of three parts: a "sign bit" (s), an "exponent" (E) and a
+"fraction" (f). The numerical value of the combination (s,E,f) is
+given by the following formula,
+
+ (-1)^s (1.fffff...) 2^E
+
+The sign bit is either zero or one. The exponent ranges from a minimum
+value E_min to a maximum value E_max depending on the precision. The
+exponent is converted to an unsigned number e, known as the "biased
+exponent", for storage by adding a "bias" parameter, e = E + bias. The
+sequence fffff... represents the digits of the binary fraction f. The
+binary digits are stored in "normalized form", by adjusting the
+exponent to give a leading digit of 1. Since the leading digit is
+always 1 for normalized numbers it is assumed implicitly and does not
+have to be stored. Numbers smaller than 2^(E_min) are be stored in
+"denormalized form" with a leading zero,
+
+ (-1)^s (0.fffff...) 2^(E_min)
+
+This allows gradual underflow down to 2^(E_min - p) for p bits of
+precision. A zero is encoded with the special exponent of 2^(E_min -
+1) and infinities with the exponent of 2^(E_max + 1).
+
+The format for single precision numbers uses 32 bits divided in the
+following way,
+
+ seeeeeeeefffffffffffffffffffffff
+
+ s = sign bit, 1 bit
+ e = exponent, 8 bits (E_min=-126, E_max=127, bias=127)
+ f = fraction, 23 bits
+
+The format for double precision numbers uses 64 bits divided in the
+following way,
+
+ seeeeeeeeeeeffffffffffffffffffffffffffffffffffffffffffffffffffff
+
+ s = sign bit, 1 bit
+ e = exponent, 11 bits (E_min=-1022, E_max=1023, bias=1023)
+ f = fraction, 52 bits
+
+It is often useful to be able to investigate the behavior of a
+calculation at the bit-level and the library provides functions for
+printing the IEEE representations in a human-readable form.
+
+ -- Function: void gsl_ieee_fprintf_float (FILE * STREAM, const float *
+ X)
+ -- Function: void gsl_ieee_fprintf_double (FILE * STREAM, const double
+ * X)
+ These functions output a formatted version of the IEEE
+ floating-point number pointed to by X to the stream STREAM. A
+ pointer is used to pass the number indirectly, to avoid any
+ undesired promotion from `float' to `double'. The output takes
+ one of the following forms,
+
+ `NaN'
+ the Not-a-Number symbol
+
+ `Inf, -Inf'
+ positive or negative infinity
+
+ `1.fffff...*2^E, -1.fffff...*2^E'
+ a normalized floating point number
+
+ `0.fffff...*2^E, -0.fffff...*2^E'
+ a denormalized floating point number
+
+ `0, -0'
+ positive or negative zero
+
+
+ The output can be used directly in GNU Emacs Calc mode by
+ preceding it with `2#' to indicate binary.
+
+ -- Function: void gsl_ieee_printf_float (const float * X)
+ -- Function: void gsl_ieee_printf_double (const double * X)
+ These functions output a formatted version of the IEEE
+ floating-point number pointed to by X to the stream `stdout'.
+
+The following program demonstrates the use of the functions by printing
+the single and double precision representations of the fraction 1/3.
+For comparison the representation of the value promoted from single to
+double precision is also printed.
+
+ #include <stdio.h>
+ #include <gsl/gsl_ieee_utils.h>
+
+ int
+ main (void)
+ {
+ float f = 1.0/3.0;
+ double d = 1.0/3.0;
+
+ double fd = f; /* promote from float to double */
+
+ printf (" f="); gsl_ieee_printf_float(&f);
+ printf ("\n");
+
+ printf ("fd="); gsl_ieee_printf_double(&fd);
+ printf ("\n");
+
+ printf (" d="); gsl_ieee_printf_double(&d);
+ printf ("\n");
+
+ return 0;
+ }
+
+The binary representation of 1/3 is 0.01010101... . The output below
+shows that the IEEE format normalizes this fraction to give a leading
+digit of 1,
+
+ f= 1.01010101010101010101011*2^-2
+ fd= 1.0101010101010101010101100000000000000000000000000000*2^-2
+ d= 1.0101010101010101010101010101010101010101010101010101*2^-2
+
+The output also shows that a single-precision number is promoted to
+double-precision by adding zeros in the binary representation.
+
+
+File: gsl-ref.info, Node: Setting up your IEEE environment, Next: IEEE References and Further Reading, Prev: Representation of floating point numbers, Up: IEEE floating-point arithmetic
+
+40.2 Setting up your IEEE environment
+=====================================
+
+The IEEE standard defines several "modes" for controlling the behavior
+of floating point operations. These modes specify the important
+properties of computer arithmetic: the direction used for rounding (e.g.
+whether numbers should be rounded up, down or to the nearest number),
+the rounding precision and how the program should handle arithmetic
+exceptions, such as division by zero.
+
+ Many of these features can now be controlled via standard functions
+such as `fpsetround', which should be used whenever they are available.
+Unfortunately in the past there has been no universal API for
+controlling their behavior--each system has had its own low-level way
+of accessing them. To help you write portable programs GSL allows you
+to specify modes in a platform-independent way using the environment
+variable `GSL_IEEE_MODE'. The library then takes care of all the
+necessary machine-specific initializations for you when you call the
+function `gsl_ieee_env_setup'.
+
+ -- Function: void gsl_ieee_env_setup ()
+ This function reads the environment variable `GSL_IEEE_MODE' and
+ attempts to set up the corresponding specified IEEE modes. The
+ environment variable should be a list of keywords, separated by
+ commas, like this,
+
+ `GSL_IEEE_MODE' = "KEYWORD,KEYWORD,..."
+
+ where KEYWORD is one of the following mode-names,
+
+ `single-precision'
+
+ `double-precision'
+
+ `extended-precision'
+
+ `round-to-nearest'
+
+ `round-down'
+
+ `round-up'
+
+ `round-to-zero'
+
+ `mask-all'
+
+ `mask-invalid'
+
+ `mask-denormalized'
+
+ `mask-division-by-zero'
+
+ `mask-overflow'
+
+ `mask-underflow'
+
+ `trap-inexact'
+
+ `trap-common'
+
+ If `GSL_IEEE_MODE' is empty or undefined then the function returns
+ immediately and no attempt is made to change the system's IEEE
+ mode. When the modes from `GSL_IEEE_MODE' are turned on the
+ function prints a short message showing the new settings to remind
+ you that the results of the program will be affected.
+
+ If the requested modes are not supported by the platform being
+ used then the function calls the error handler and returns an
+ error code of `GSL_EUNSUP'.
+
+ When options are specified using this method, the resulting mode is
+ based on a default setting of the highest available precision
+ (double precision or extended precision, depending on the
+ platform) in round-to-nearest mode, with all exceptions enabled
+ apart from the INEXACT exception. The INEXACT exception is
+ generated whenever rounding occurs, so it must generally be
+ disabled in typical scientific calculations. All other
+ floating-point exceptions are enabled by default, including
+ underflows and the use of denormalized numbers, for safety. They
+ can be disabled with the individual `mask-' settings or together
+ using `mask-all'.
+
+ The following adjusted combination of modes is convenient for many
+ purposes,
+
+ GSL_IEEE_MODE="double-precision,"\
+ "mask-underflow,"\
+ "mask-denormalized"
+
+ This choice ignores any errors relating to small numbers (either
+ denormalized, or underflowing to zero) but traps overflows,
+ division by zero and invalid operations.
+
+To demonstrate the effects of different rounding modes consider the
+following program which computes e, the base of natural logarithms, by
+summing a rapidly-decreasing series,
+
+ e = 1 + 1/2! + 1/3! + 1/4! + ...
+ = 2.71828182846...
+
+ #include <stdio.h>
+ #include <gsl/gsl_math.h>
+ #include <gsl/gsl_ieee_utils.h>
+
+ int
+ main (void)
+ {
+ double x = 1, oldsum = 0, sum = 0;
+ int i = 0;
+
+ gsl_ieee_env_setup (); /* read GSL_IEEE_MODE */
+
+ do
+ {
+ i++;
+
+ oldsum = sum;
+ sum += x;
+ x = x / i;
+
+ printf ("i=%2d sum=%.18f error=%g\n",
+ i, sum, sum - M_E);
+
+ if (i > 30)
+ break;
+ }
+ while (sum != oldsum);
+
+ return 0;
+ }
+
+Here are the results of running the program in `round-to-nearest' mode.
+This is the IEEE default so it isn't really necessary to specify it
+here,
+
+ $ GSL_IEEE_MODE="round-to-nearest" ./a.out
+ i= 1 sum=1.000000000000000000 error=-1.71828
+ i= 2 sum=2.000000000000000000 error=-0.718282
+ ....
+ i=18 sum=2.718281828459045535 error=4.44089e-16
+ i=19 sum=2.718281828459045535 error=4.44089e-16
+
+After nineteen terms the sum converges to within 4 \times 10^-16 of the
+correct value. If we now change the rounding mode to `round-down' the
+final result is less accurate,
+
+ $ GSL_IEEE_MODE="round-down" ./a.out
+ i= 1 sum=1.000000000000000000 error=-1.71828
+ ....
+ i=19 sum=2.718281828459041094 error=-3.9968e-15
+
+The result is about 4 \times 10^-15 below the correct value, an order
+of magnitude worse than the result obtained in the `round-to-nearest'
+mode.
+
+ If we change to rounding mode to `round-up' then the series no
+longer converges (the reason is that when we add each term to the sum
+the final result is always rounded up. This is guaranteed to increase
+the sum by at least one tick on each iteration). To avoid this problem
+we would need to use a safer converge criterion, such as `while
+(fabs(sum - oldsum) > epsilon)', with a suitably chosen value of
+epsilon.
+
+ Finally we can see the effect of computing the sum using
+single-precision rounding, in the default `round-to-nearest' mode. In
+this case the program thinks it is still using double precision numbers
+but the CPU rounds the result of each floating point operation to
+single-precision accuracy. This simulates the effect of writing the
+program using single-precision `float' variables instead of `double'
+variables. The iteration stops after about half the number of
+iterations and the final result is much less accurate,
+
+ $ GSL_IEEE_MODE="single-precision" ./a.out
+ ....
+ i=12 sum=2.718281984329223633 error=1.5587e-07
+
+with an error of O(10^-7), which corresponds to single precision
+accuracy (about 1 part in 10^7). Continuing the iterations further
+does not decrease the error because all the subsequent results are
+rounded to the same value.
+
+
+File: gsl-ref.info, Node: IEEE References and Further Reading, Prev: Setting up your IEEE environment, Up: IEEE floating-point arithmetic
+
+40.3 References and Further Reading
+===================================
+
+The reference for the IEEE standard is,
+
+ ANSI/IEEE Std 754-1985, IEEE Standard for Binary Floating-Point
+ Arithmetic.
+
+A more pedagogical introduction to the standard can be found in the
+following paper,
+
+ David Goldberg: What Every Computer Scientist Should Know About
+ Floating-Point Arithmetic. `ACM Computing Surveys', Vol. 23, No. 1
+ (March 1991), pages 5-48.
+
+ Corrigendum: `ACM Computing Surveys', Vol. 23, No. 3 (September
+ 1991), page 413. and see also the sections by B. A. Wichmann and
+ Charles B. Dunham in Surveyor's Forum: "What Every Computer
+ Scientist Should Know About Floating-Point Arithmetic". `ACM
+ Computing Surveys', Vol. 24, No. 3 (September 1992), page 319.
+
+A detailed textbook on IEEE arithmetic and its practical use is
+available from SIAM Press,
+
+ Michael L. Overton, `Numerical Computing with IEEE Floating Point
+ Arithmetic', SIAM Press, ISBN 0898715717.
+
+
+
+File: gsl-ref.info, Node: Debugging Numerical Programs, Next: Contributors to GSL, Prev: IEEE floating-point arithmetic, Up: Top
+
+Appendix A Debugging Numerical Programs
+***************************************
+
+This chapter describes some tips and tricks for debugging numerical
+programs which use GSL.
+
+* Menu:
+
+* Using gdb::
+* Examining floating point registers::
+* Handling floating point exceptions::
+* GCC warning options for numerical programs::
+* Debugging References::
+
+
+File: gsl-ref.info, Node: Using gdb, Next: Examining floating point registers, Up: Debugging Numerical Programs
+
+A.1 Using gdb
+=============
+
+Any errors reported by the library are passed to the function
+`gsl_error'. By running your programs under gdb and setting a
+breakpoint in this function you can automatically catch any library
+errors. You can add a breakpoint for every session by putting
+
+ break gsl_error
+
+into your `.gdbinit' file in the directory where your program is
+started.
+
+ If the breakpoint catches an error then you can use a backtrace
+(`bt') to see the call-tree, and the arguments which possibly caused
+the error. By moving up into the calling function you can investigate
+the values of variables at that point. Here is an example from the
+program `fft/test_trap', which contains the following line,
+
+ status = gsl_fft_complex_wavetable_alloc (0, &complex_wavetable);
+
+The function `gsl_fft_complex_wavetable_alloc' takes the length of an
+FFT as its first argument. When this line is executed an error will be
+generated because the length of an FFT is not allowed to be zero.
+
+ To debug this problem we start `gdb', using the file `.gdbinit' to
+define a breakpoint in `gsl_error',
+
+ $ gdb test_trap
+
+ GDB is free software and you are welcome to distribute copies
+ of it under certain conditions; type "show copying" to see
+ the conditions. There is absolutely no warranty for GDB;
+ type "show warranty" for details. GDB 4.16 (i586-debian-linux),
+ Copyright 1996 Free Software Foundation, Inc.
+
+ Breakpoint 1 at 0x8050b1e: file error.c, line 14.
+
+When we run the program this breakpoint catches the error and shows the
+reason for it.
+
+ (gdb) run
+ Starting program: test_trap
+
+ Breakpoint 1, gsl_error (reason=0x8052b0d
+ "length n must be positive integer",
+ file=0x8052b04 "c_init.c", line=108, gsl_errno=1)
+ at error.c:14
+ 14 if (gsl_error_handler)
+
+The first argument of `gsl_error' is always a string describing the
+error. Now we can look at the backtrace to see what caused the problem,
+
+ (gdb) bt
+ #0 gsl_error (reason=0x8052b0d
+ "length n must be positive integer",
+ file=0x8052b04 "c_init.c", line=108, gsl_errno=1)
+ at error.c:14
+ #1 0x8049376 in gsl_fft_complex_wavetable_alloc (n=0,
+ wavetable=0xbffff778) at c_init.c:108
+ #2 0x8048a00 in main (argc=1, argv=0xbffff9bc)
+ at test_trap.c:94
+ #3 0x80488be in ___crt_dummy__ ()
+
+We can see that the error was generated in the function
+`gsl_fft_complex_wavetable_alloc' when it was called with an argument
+of N=0. The original call came from line 94 in the file `test_trap.c'.
+
+ By moving up to the level of the original call we can find the line
+that caused the error,
+
+ (gdb) up
+ #1 0x8049376 in gsl_fft_complex_wavetable_alloc (n=0,
+ wavetable=0xbffff778) at c_init.c:108
+ 108 GSL_ERROR ("length n must be positive integer", GSL_EDOM);
+ (gdb) up
+ #2 0x8048a00 in main (argc=1, argv=0xbffff9bc)
+ at test_trap.c:94
+ 94 status = gsl_fft_complex_wavetable_alloc (0,
+ &complex_wavetable);
+
+Thus we have found the line that caused the problem. From this point we
+could also print out the values of other variables such as
+`complex_wavetable'.
+
+
+File: gsl-ref.info, Node: Examining floating point registers, Next: Handling floating point exceptions, Prev: Using gdb, Up: Debugging Numerical Programs
+
+A.2 Examining floating point registers
+======================================
+
+The contents of floating point registers can be examined using the
+command `info float' (on supported platforms).
+
+ (gdb) info float
+ st0: 0xc4018b895aa17a945000 Valid Normal -7.838871e+308
+ st1: 0x3ff9ea3f50e4d7275000 Valid Normal 0.0285946
+ st2: 0x3fe790c64ce27dad4800 Valid Normal 6.7415931e-08
+ st3: 0x3ffaa3ef0df6607d7800 Spec Normal 0.0400229
+ st4: 0x3c028000000000000000 Valid Normal 4.4501477e-308
+ st5: 0x3ffef5412c22219d9000 Zero Normal 0.9580257
+ st6: 0x3fff8000000000000000 Valid Normal 1
+ st7: 0xc4028b65a1f6d243c800 Valid Normal -1.566206e+309
+ fctrl: 0x0272 53 bit; NEAR; mask DENOR UNDER LOS;
+ fstat: 0xb9ba flags 0001; top 7; excep DENOR OVERF UNDER LOS
+ ftag: 0x3fff
+ fip: 0x08048b5c
+ fcs: 0x051a0023
+ fopoff: 0x08086820
+ fopsel: 0x002b
+
+Individual registers can be examined using the variables $REG, where
+REG is the register name.
+
+ (gdb) p $st1
+ $1 = 0.02859464454261210347719
+
+
+File: gsl-ref.info, Node: Handling floating point exceptions, Next: GCC warning options for numerical programs, Prev: Examining floating point registers, Up: Debugging Numerical Programs
+
+A.3 Handling floating point exceptions
+======================================
+
+It is possible to stop the program whenever a `SIGFPE' floating point
+exception occurs. This can be useful for finding the cause of an
+unexpected infinity or `NaN'. The current handler settings can be
+shown with the command `info signal SIGFPE'.
+
+ (gdb) info signal SIGFPE
+ Signal Stop Print Pass to program Description
+ SIGFPE Yes Yes Yes Arithmetic exception
+
+Unless the program uses a signal handler the default setting should be
+changed so that SIGFPE is not passed to the program, as this would cause
+it to exit. The command `handle SIGFPE stop nopass' prevents this.
+
+ (gdb) handle SIGFPE stop nopass
+ Signal Stop Print Pass to program Description
+ SIGFPE Yes Yes No Arithmetic exception
+
+Depending on the platform it may be necessary to instruct the kernel to
+generate signals for floating point exceptions. For programs using GSL
+this can be achieved using the `GSL_IEEE_MODE' environment variable in
+conjunction with the function `gsl_ieee_env_setup' as described in
+*note IEEE floating-point arithmetic::.
+
+ (gdb) set env GSL_IEEE_MODE=double-precision
+
+
+File: gsl-ref.info, Node: GCC warning options for numerical programs, Next: Debugging References, Prev: Handling floating point exceptions, Up: Debugging Numerical Programs
+
+A.4 GCC warning options for numerical programs
+==============================================
+
+Writing reliable numerical programs in C requires great care. The
+following GCC warning options are recommended when compiling numerical
+programs:
+
+ gcc -ansi -pedantic -Werror -Wall -W
+ -Wmissing-prototypes -Wstrict-prototypes
+ -Wtraditional -Wconversion -Wshadow
+ -Wpointer-arith -Wcast-qual -Wcast-align
+ -Wwrite-strings -Wnested-externs
+ -fshort-enums -fno-common -Dinline= -g -O2
+
+For details of each option consult the manual `Using and Porting GCC'.
+The following table gives a brief explanation of what types of errors
+these options catch.
+
+`-ansi -pedantic'
+ Use ANSI C, and reject any non-ANSI extensions. These flags help
+ in writing portable programs that will compile on other systems.
+
+`-Werror'
+ Consider warnings to be errors, so that compilation stops. This
+ prevents warnings from scrolling off the top of the screen and
+ being lost. You won't be able to compile the program until it is
+ completely warning-free.
+
+`-Wall'
+ This turns on a set of warnings for common programming problems.
+ You need `-Wall', but it is not enough on its own.
+
+`-O2'
+ Turn on optimization. The warnings for uninitialized variables in
+ `-Wall' rely on the optimizer to analyze the code. If there is no
+ optimization then these warnings aren't generated.
+
+`-W'
+ This turns on some extra warnings not included in `-Wall', such as
+ missing return values and comparisons between signed and unsigned
+ integers.
+
+`-Wmissing-prototypes -Wstrict-prototypes'
+ Warn if there are any missing or inconsistent prototypes. Without
+ prototypes it is harder to detect problems with incorrect
+ arguments.
+
+`-Wtraditional'
+ This warns about certain constructs that behave differently in
+ traditional and ANSI C. Whether the traditional or ANSI
+ interpretation is used might be unpredictable on other compilers.
+
+`-Wconversion'
+ The main use of this option is to warn about conversions from
+ signed to unsigned integers. For example, `unsigned int x = -1'.
+ If you need to perform such a conversion you can use an explicit
+ cast.
+
+`-Wshadow'
+ This warns whenever a local variable shadows another local
+ variable. If two variables have the same name then it is a
+ potential source of confusion.
+
+`-Wpointer-arith -Wcast-qual -Wcast-align'
+ These options warn if you try to do pointer arithmetic for types
+ which don't have a size, such as `void', if you remove a `const'
+ cast from a pointer, or if you cast a pointer to a type which has a
+ different size, causing an invalid alignment.
+
+`-Wwrite-strings'
+ This option gives string constants a `const' qualifier so that it
+ will be a compile-time error to attempt to overwrite them.
+
+`-fshort-enums'
+ This option makes the type of `enum' as short as possible.
+ Normally this makes an `enum' different from an `int'.
+ Consequently any attempts to assign a pointer-to-int to a
+ pointer-to-enum will generate a cast-alignment warning.
+
+`-fno-common'
+ This option prevents global variables being simultaneously defined
+ in different object files (you get an error at link time). Such a
+ variable should be defined in one file and referred to in other
+ files with an `extern' declaration.
+
+`-Wnested-externs'
+ This warns if an `extern' declaration is encountered within a
+ function.
+
+`-Dinline='
+ The `inline' keyword is not part of ANSI C. Thus if you want to use
+ `-ansi' with a program which uses inline functions you can use this
+ preprocessor definition to remove the `inline' keywords.
+
+`-g'
+ It always makes sense to put debugging symbols in the executable
+ so that you can debug it using `gdb'. The only effect of
+ debugging symbols is to increase the size of the file, and you can
+ use the `strip' command to remove them later if necessary.
+
+
+File: gsl-ref.info, Node: Debugging References, Prev: GCC warning options for numerical programs, Up: Debugging Numerical Programs
+
+A.5 References and Further Reading
+==================================
+
+The following books are essential reading for anyone writing and
+debugging numerical programs with GCC and GDB.
+
+ R.M. Stallman, `Using and Porting GNU CC', Free Software
+ Foundation, ISBN 1882114388
+
+ R.M. Stallman, R.H. Pesch, `Debugging with GDB: The GNU
+ Source-Level Debugger', Free Software Foundation, ISBN 1882114779
+
+For a tutorial introduction to the GNU C Compiler and related programs,
+see
+
+ B.J. Gough, `An Introduction to GCC', Network Theory Ltd, ISBN
+ 0954161793
+
+
+File: gsl-ref.info, Node: Contributors to GSL, Next: Autoconf Macros, Prev: Debugging Numerical Programs, Up: Top
+
+Appendix B Contributors to GSL
+******************************
+
+(See the AUTHORS file in the distribution for up-to-date information.)
+
+*Mark Galassi*
+ Conceived GSL (with James Theiler) and wrote the design document.
+ Wrote the simulated annealing package and the relevant chapter in
+ the manual.
+
+*James Theiler*
+ Conceived GSL (with Mark Galassi). Wrote the random number
+ generators and the relevant chapter in this manual.
+
+*Jim Davies*
+ Wrote the statistical routines and the relevant chapter in this
+ manual.
+
+*Brian Gough*
+ FFTs, numerical integration, random number generators and
+ distributions, root finding, minimization and fitting, polynomial
+ solvers, complex numbers, physical constants, permutations, vector
+ and matrix functions, histograms, statistics, ieee-utils, revised
+ CBLAS Level 2 & 3, matrix decompositions, eigensystems, cumulative
+ distribution functions, testing, documentation and releases.
+
+*Reid Priedhorsky*
+ Wrote and documented the initial version of the root finding
+ routines while at Los Alamos National Laboratory, Mathematical
+ Modeling and Analysis Group.
+
+*Gerard Jungman*
+ Special Functions, Series acceleration, ODEs, BLAS, Linear Algebra,
+ Eigensystems, Hankel Transforms.
+
+*Mike Booth*
+ Wrote the Monte Carlo library.
+
+*Jorma Olavi Ta"htinen*
+ Wrote the initial complex arithmetic functions.
+
+*Thomas Walter*
+ Wrote the initial heapsort routines and cholesky decomposition.
+
+*Fabrice Rossi*
+ Multidimensional minimization.
+
+*Carlo Perassi*
+ Implementation of the random number generators in Knuth's
+ `Seminumerical Algorithms', 3rd Ed.
+
+*Szymon Jaroszewicz*
+ Wrote the routines for generating combinations.
+
+*Nicolas Darnis*
+ Wrote the initial routines for canonical permutations.
+
+*Jason H. Stover*
+ Wrote the major cumulative distribution functions.
+
+*Ivo Alxneit*
+ Wrote the routines for wavelet transforms.
+
+*Tuomo Keskitalo*
+ Improved the implementation of the ODE solvers.
+
+*Lowell Johnson*
+ Implementation of the Mathieu functions.
+
+*Patrick Alken*
+ Implementation of non-symmetric eigensystems and B-splines.
+
+
+ Thanks to Nigel Lowry for help in proofreading the manual.
+
+ The non-symmetric eigensystems routines contain code based on the
+LAPACK linear algebra library. LAPACK is distributed under the
+following license:
+
+
+ Copyright (c) 1992-2006 The University of Tennessee. All rights
+ reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer listed
+ in this license in the documentation and/or other materials
+ provided with the distribution.
+
+ * Neither the name of the copyright holders nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+ INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+File: gsl-ref.info, Node: Autoconf Macros, Next: GSL CBLAS Library, Prev: Contributors to GSL, Up: Top
+
+Appendix C Autoconf Macros
+**************************
+
+For applications using `autoconf' the standard macro `AC_CHECK_LIB' can
+be used to link with GSL automatically from a `configure' script. The
+library itself depends on the presence of a CBLAS and math library as
+well, so these must also be located before linking with the main
+`libgsl' file. The following commands should be placed in the
+`configure.ac' file to perform these tests,
+
+ AC_CHECK_LIB(m,main)
+ AC_CHECK_LIB(gslcblas,main)
+ AC_CHECK_LIB(gsl,main)
+
+It is important to check for `libm' and `libgslcblas' before `libgsl',
+otherwise the tests will fail. Assuming the libraries are found the
+output during the configure stage looks like this,
+
+ checking for main in -lm... yes
+ checking for main in -lgslcblas... yes
+ checking for main in -lgsl... yes
+
+If the library is found then the tests will define the macros
+`HAVE_LIBGSL', `HAVE_LIBGSLCBLAS', `HAVE_LIBM' and add the options
+`-lgsl -lgslcblas -lm' to the variable `LIBS'.
+
+ The tests above will find any version of the library. They are
+suitable for general use, where the versions of the functions are not
+important. An alternative macro is available in the file `gsl.m4' to
+test for a specific version of the library. To use this macro simply
+add the following line to your `configure.in' file instead of the tests
+above:
+
+ AM_PATH_GSL(GSL_VERSION,
+ [action-if-found],
+ [action-if-not-found])
+
+The argument `GSL_VERSION' should be the two or three digit MAJOR.MINOR
+or MAJOR.MINOR.MICRO version number of the release you require. A
+suitable choice for `action-if-not-found' is,
+
+ AC_MSG_ERROR(could not find required version of GSL)
+
+Then you can add the variables `GSL_LIBS' and `GSL_CFLAGS' to your
+Makefile.am files to obtain the correct compiler flags. `GSL_LIBS' is
+equal to the output of the `gsl-config --libs' command and `GSL_CFLAGS'
+is equal to `gsl-config --cflags' command. For example,
+
+ libfoo_la_LDFLAGS = -lfoo $(GSL_LIBS) -lgslcblas
+
+Note that the macro `AM_PATH_GSL' needs to use the C compiler so it
+should appear in the `configure.in' file before the macro
+`AC_LANG_CPLUSPLUS' for programs that use C++.
+
+ To test for `inline' the following test should be placed in your
+`configure.in' file,
+
+ AC_C_INLINE
+
+ if test "$ac_cv_c_inline" != no ; then
+ AC_DEFINE(HAVE_INLINE,1)
+ AC_SUBST(HAVE_INLINE)
+ fi
+
+and the macro will then be defined in the compilation flags or by
+including the file `config.h' before any library headers.
+
+ The following autoconf test will check for `extern inline',
+
+ dnl Check for "extern inline", using a modified version
+ dnl of the test for AC_C_INLINE from acspecific.mt
+ dnl
+ AC_CACHE_CHECK([for extern inline], ac_cv_c_extern_inline,
+ [ac_cv_c_extern_inline=no
+ AC_TRY_COMPILE([extern $ac_cv_c_inline double foo(double x);
+ extern $ac_cv_c_inline double foo(double x) { return x+1.0; };
+ double foo (double x) { return x + 1.0; };],
+ [ foo(1.0) ],
+ [ac_cv_c_extern_inline="yes"])
+ ])
+
+ if test "$ac_cv_c_extern_inline" != no ; then
+ AC_DEFINE(HAVE_INLINE,1)
+ AC_SUBST(HAVE_INLINE)
+ fi
+
+ The substitution of portability functions can be made automatically
+if you use `autoconf'. For example, to test whether the BSD function
+`hypot' is available you can include the following line in the
+configure file `configure.in' for your application,
+
+ AC_CHECK_FUNCS(hypot)
+
+and place the following macro definitions in the file `config.h.in',
+
+ /* Substitute gsl_hypot for missing system hypot */
+
+ #ifndef HAVE_HYPOT
+ #define hypot gsl_hypot
+ #endif
+
+The application source files can then use the include command `#include
+<config.h>' to substitute `gsl_hypot' for each occurrence of `hypot'
+when `hypot' is not available.
+
+
+File: gsl-ref.info, Node: GSL CBLAS Library, Next: Free Software Needs Free Documentation, Prev: Autoconf Macros, Up: Top
+
+Appendix D GSL CBLAS Library
+****************************
+
+The prototypes for the low-level CBLAS functions are declared in the
+file `gsl_cblas.h'. For the definition of the functions consult the
+documentation available from Netlib (*note BLAS References and Further
+Reading::).
+
+* Menu:
+
+* Level 1 CBLAS Functions::
+* Level 2 CBLAS Functions::
+* Level 3 CBLAS Functions::
+* GSL CBLAS Examples::
+
+
+File: gsl-ref.info, Node: Level 1 CBLAS Functions, Next: Level 2 CBLAS Functions, Up: GSL CBLAS Library
+
+D.1 Level 1
+===========
+
+ -- Function: float cblas_sdsdot (const int N, const float ALPHA, const
+ float * X, const int INCX, const float * Y, const int INCY)
+
+ -- Function: double cblas_dsdot (const int N, const float * X, const
+ int INCX, const float * Y, const int INCY)
+
+ -- Function: float cblas_sdot (const int N, const float * X, const int
+ INCX, const float * Y, const int INCY)
+
+ -- Function: double cblas_ddot (const int N, const double * X, const
+ int INCX, const double * Y, const int INCY)
+
+ -- Function: void cblas_cdotu_sub (const int N, const void * X, const
+ int INCX, const void * Y, const int INCY, void * DOTU)
+
+ -- Function: void cblas_cdotc_sub (const int N, const void * X, const
+ int INCX, const void * Y, const int INCY, void * DOTC)
+
+ -- Function: void cblas_zdotu_sub (const int N, const void * X, const
+ int INCX, const void * Y, const int INCY, void * DOTU)
+
+ -- Function: void cblas_zdotc_sub (const int N, const void * X, const
+ int INCX, const void * Y, const int INCY, void * DOTC)
+
+ -- Function: float cblas_snrm2 (const int N, const float * X, const
+ int INCX)
+
+ -- Function: float cblas_sasum (const int N, const float * X, const
+ int INCX)
+
+ -- Function: double cblas_dnrm2 (const int N, const double * X, const
+ int INCX)
+
+ -- Function: double cblas_dasum (const int N, const double * X, const
+ int INCX)
+
+ -- Function: float cblas_scnrm2 (const int N, const void * X, const
+ int INCX)
+
+ -- Function: float cblas_scasum (const int N, const void * X, const
+ int INCX)
+
+ -- Function: double cblas_dznrm2 (const int N, const void * X, const
+ int INCX)
+
+ -- Function: double cblas_dzasum (const int N, const void * X, const
+ int INCX)
+
+ -- Function: CBLAS_INDEX cblas_isamax (const int N, const float * X,
+ const int INCX)
+
+ -- Function: CBLAS_INDEX cblas_idamax (const int N, const double * X,
+ const int INCX)
+
+ -- Function: CBLAS_INDEX cblas_icamax (const int N, const void * X,
+ const int INCX)
+
+ -- Function: CBLAS_INDEX cblas_izamax (const int N, const void * X,
+ const int INCX)
+
+ -- Function: void cblas_sswap (const int N, float * X, const int INCX,
+ float * Y, const int INCY)
+
+ -- Function: void cblas_scopy (const int N, const float * X, const int
+ INCX, float * Y, const int INCY)
+
+ -- Function: void cblas_saxpy (const int N, const float ALPHA, const
+ float * X, const int INCX, float * Y, const int INCY)
+
+ -- Function: void cblas_dswap (const int N, double * X, const int
+ INCX, double * Y, const int INCY)
+
+ -- Function: void cblas_dcopy (const int N, const double * X, const
+ int INCX, double * Y, const int INCY)
+
+ -- Function: void cblas_daxpy (const int N, const double ALPHA, const
+ double * X, const int INCX, double * Y, const int INCY)
+
+ -- Function: void cblas_cswap (const int N, void * X, const int INCX,
+ void * Y, const int INCY)
+
+ -- Function: void cblas_ccopy (const int N, const void * X, const int
+ INCX, void * Y, const int INCY)
+
+ -- Function: void cblas_caxpy (const int N, const void * ALPHA, const
+ void * X, const int INCX, void * Y, const int INCY)
+
+ -- Function: void cblas_zswap (const int N, void * X, const int INCX,
+ void * Y, const int INCY)
+
+ -- Function: void cblas_zcopy (const int N, const void * X, const int
+ INCX, void * Y, const int INCY)
+
+ -- Function: void cblas_zaxpy (const int N, const void * ALPHA, const
+ void * X, const int INCX, void * Y, const int INCY)
+
+ -- Function: void cblas_srotg (float * A, float * B, float * C, float
+ * S)
+
+ -- Function: void cblas_srotmg (float * D1, float * D2, float * B1,
+ const float B2, float * P)
+
+ -- Function: void cblas_srot (const int N, float * X, const int INCX,
+ float * Y, const int INCY, const float C, const float S)
+
+ -- Function: void cblas_srotm (const int N, float * X, const int INCX,
+ float * Y, const int INCY, const float * P)
+
+ -- Function: void cblas_drotg (double * A, double * B, double * C,
+ double * S)
+
+ -- Function: void cblas_drotmg (double * D1, double * D2, double * B1,
+ const double B2, double * P)
+
+ -- Function: void cblas_drot (const int N, double * X, const int INCX,
+ double * Y, const int INCY, const double C, const double S)
+
+ -- Function: void cblas_drotm (const int N, double * X, const int
+ INCX, double * Y, const int INCY, const double * P)
+
+ -- Function: void cblas_sscal (const int N, const float ALPHA, float *
+ X, const int INCX)
+
+ -- Function: void cblas_dscal (const int N, const double ALPHA, double
+ * X, const int INCX)
+
+ -- Function: void cblas_cscal (const int N, const void * ALPHA, void *
+ X, const int INCX)
+
+ -- Function: void cblas_zscal (const int N, const void * ALPHA, void *
+ X, const int INCX)
+
+ -- Function: void cblas_csscal (const int N, const float ALPHA, void *
+ X, const int INCX)
+
+ -- Function: void cblas_zdscal (const int N, const double ALPHA, void
+ * X, const int INCX)
+
+
+File: gsl-ref.info, Node: Level 2 CBLAS Functions, Next: Level 3 CBLAS Functions, Prev: Level 1 CBLAS Functions, Up: GSL CBLAS Library
+
+D.2 Level 2
+===========
+
+ -- Function: void cblas_sgemv (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_TRANSPOSE TRANSA, const int M, const int N, const
+ float ALPHA, const float * A, const int LDA, const float * X,
+ const int INCX, const float BETA, float * Y, const int INCY)
+
+ -- Function: void cblas_sgbmv (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_TRANSPOSE TRANSA, const int M, const int N, const
+ int KL, const int KU, const float ALPHA, const float * A,
+ const int LDA, const float * X, const int INCX, const float
+ BETA, float * Y, const int INCY)
+
+ -- Function: void cblas_strmv (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const enum CBLAS_TRANSPOSE TRANSA,
+ const enum CBLAS_DIAG DIAG, const int N, const float * A,
+ const int LDA, float * X, const int INCX)
+
+ -- Function: void cblas_stbmv (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const enum CBLAS_TRANSPOSE TRANSA,
+ const enum CBLAS_DIAG DIAG, const int N, const int K, const
+ float * A, const int LDA, float * X, const int INCX)
+
+ -- Function: void cblas_stpmv (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const enum CBLAS_TRANSPOSE TRANSA,
+ const enum CBLAS_DIAG DIAG, const int N, const float * AP,
+ float * X, const int INCX)
+
+ -- Function: void cblas_strsv (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const enum CBLAS_TRANSPOSE TRANSA,
+ const enum CBLAS_DIAG DIAG, const int N, const float * A,
+ const int LDA, float * X, const int INCX)
+
+ -- Function: void cblas_stbsv (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const enum CBLAS_TRANSPOSE TRANSA,
+ const enum CBLAS_DIAG DIAG, const int N, const int K, const
+ float * A, const int LDA, float * X, const int INCX)
+
+ -- Function: void cblas_stpsv (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const enum CBLAS_TRANSPOSE TRANSA,
+ const enum CBLAS_DIAG DIAG, const int N, const float * AP,
+ float * X, const int INCX)
+
+ -- Function: void cblas_dgemv (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_TRANSPOSE TRANSA, const int M, const int N, const
+ double ALPHA, const double * A, const int LDA, const double *
+ X, const int INCX, const double BETA, double * Y, const int
+ INCY)
+
+ -- Function: void cblas_dgbmv (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_TRANSPOSE TRANSA, const int M, const int N, const
+ int KL, const int KU, const double ALPHA, const double * A,
+ const int LDA, const double * X, const int INCX, const double
+ BETA, double * Y, const int INCY)
+
+ -- Function: void cblas_dtrmv (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const enum CBLAS_TRANSPOSE TRANSA,
+ const enum CBLAS_DIAG DIAG, const int N, const double * A,
+ const int LDA, double * X, const int INCX)
+
+ -- Function: void cblas_dtbmv (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const enum CBLAS_TRANSPOSE TRANSA,
+ const enum CBLAS_DIAG DIAG, const int N, const int K, const
+ double * A, const int LDA, double * X, const int INCX)
+
+ -- Function: void cblas_dtpmv (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const enum CBLAS_TRANSPOSE TRANSA,
+ const enum CBLAS_DIAG DIAG, const int N, const double * AP,
+ double * X, const int INCX)
+
+ -- Function: void cblas_dtrsv (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const enum CBLAS_TRANSPOSE TRANSA,
+ const enum CBLAS_DIAG DIAG, const int N, const double * A,
+ const int LDA, double * X, const int INCX)
+
+ -- Function: void cblas_dtbsv (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const enum CBLAS_TRANSPOSE TRANSA,
+ const enum CBLAS_DIAG DIAG, const int N, const int K, const
+ double * A, const int LDA, double * X, const int INCX)
+
+ -- Function: void cblas_dtpsv (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const enum CBLAS_TRANSPOSE TRANSA,
+ const enum CBLAS_DIAG DIAG, const int N, const double * AP,
+ double * X, const int INCX)
+
+ -- Function: void cblas_cgemv (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_TRANSPOSE TRANSA, const int M, const int N, const
+ void * ALPHA, const void * A, const int LDA, const void * X,
+ const int INCX, const void * BETA, void * Y, const int INCY)
+
+ -- Function: void cblas_cgbmv (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_TRANSPOSE TRANSA, const int M, const int N, const
+ int KL, const int KU, const void * ALPHA, const void * A,
+ const int LDA, const void * X, const int INCX, const void *
+ BETA, void * Y, const int INCY)
+
+ -- Function: void cblas_ctrmv (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const enum CBLAS_TRANSPOSE TRANSA,
+ const enum CBLAS_DIAG DIAG, const int N, const void * A,
+ const int LDA, void * X, const int INCX)
+
+ -- Function: void cblas_ctbmv (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const enum CBLAS_TRANSPOSE TRANSA,
+ const enum CBLAS_DIAG DIAG, const int N, const int K, const
+ void * A, const int LDA, void * X, const int INCX)
+
+ -- Function: void cblas_ctpmv (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const enum CBLAS_TRANSPOSE TRANSA,
+ const enum CBLAS_DIAG DIAG, const int N, const void * AP,
+ void * X, const int INCX)
+
+ -- Function: void cblas_ctrsv (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const enum CBLAS_TRANSPOSE TRANSA,
+ const enum CBLAS_DIAG DIAG, const int N, const void * A,
+ const int LDA, void * X, const int INCX)
+
+ -- Function: void cblas_ctbsv (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const enum CBLAS_TRANSPOSE TRANSA,
+ const enum CBLAS_DIAG DIAG, const int N, const int K, const
+ void * A, const int LDA, void * X, const int INCX)
+
+ -- Function: void cblas_ctpsv (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const enum CBLAS_TRANSPOSE TRANSA,
+ const enum CBLAS_DIAG DIAG, const int N, const void * AP,
+ void * X, const int INCX)
+
+ -- Function: void cblas_zgemv (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_TRANSPOSE TRANSA, const int M, const int N, const
+ void * ALPHA, const void * A, const int LDA, const void * X,
+ const int INCX, const void * BETA, void * Y, const int INCY)
+
+ -- Function: void cblas_zgbmv (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_TRANSPOSE TRANSA, const int M, const int N, const
+ int KL, const int KU, const void * ALPHA, const void * A,
+ const int LDA, const void * X, const int INCX, const void *
+ BETA, void * Y, const int INCY)
+
+ -- Function: void cblas_ztrmv (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const enum CBLAS_TRANSPOSE TRANSA,
+ const enum CBLAS_DIAG DIAG, const int N, const void * A,
+ const int LDA, void * X, const int INCX)
+
+ -- Function: void cblas_ztbmv (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const enum CBLAS_TRANSPOSE TRANSA,
+ const enum CBLAS_DIAG DIAG, const int N, const int K, const
+ void * A, const int LDA, void * X, const int INCX)
+
+ -- Function: void cblas_ztpmv (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const enum CBLAS_TRANSPOSE TRANSA,
+ const enum CBLAS_DIAG DIAG, const int N, const void * AP,
+ void * X, const int INCX)
+
+ -- Function: void cblas_ztrsv (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const enum CBLAS_TRANSPOSE TRANSA,
+ const enum CBLAS_DIAG DIAG, const int N, const void * A,
+ const int LDA, void * X, const int INCX)
+
+ -- Function: void cblas_ztbsv (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const enum CBLAS_TRANSPOSE TRANSA,
+ const enum CBLAS_DIAG DIAG, const int N, const int K, const
+ void * A, const int LDA, void * X, const int INCX)
+
+ -- Function: void cblas_ztpsv (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const enum CBLAS_TRANSPOSE TRANSA,
+ const enum CBLAS_DIAG DIAG, const int N, const void * AP,
+ void * X, const int INCX)
+
+ -- Function: void cblas_ssymv (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const int N, const float ALPHA, const
+ float * A, const int LDA, const float * X, const int INCX,
+ const float BETA, float * Y, const int INCY)
+
+ -- Function: void cblas_ssbmv (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const int N, const int K, const float
+ ALPHA, const float * A, const int LDA, const float * X, const
+ int INCX, const float BETA, float * Y, const int INCY)
+
+ -- Function: void cblas_sspmv (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const int N, const float ALPHA, const
+ float * AP, const float * X, const int INCX, const float
+ BETA, float * Y, const int INCY)
+
+ -- Function: void cblas_sger (const enum CBLAS_ORDER ORDER, const int
+ M, const int N, const float ALPHA, const float * X, const int
+ INCX, const float * Y, const int INCY, float * A, const int
+ LDA)
+
+ -- Function: void cblas_ssyr (const enum CBLAS_ORDER ORDER, const enum
+ CBLAS_UPLO UPLO, const int N, const float ALPHA, const float
+ * X, const int INCX, float * A, const int LDA)
+
+ -- Function: void cblas_sspr (const enum CBLAS_ORDER ORDER, const enum
+ CBLAS_UPLO UPLO, const int N, const float ALPHA, const float
+ * X, const int INCX, float * AP)
+
+ -- Function: void cblas_ssyr2 (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const int N, const float ALPHA, const
+ float * X, const int INCX, const float * Y, const int INCY,
+ float * A, const int LDA)
+
+ -- Function: void cblas_sspr2 (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const int N, const float ALPHA, const
+ float * X, const int INCX, const float * Y, const int INCY,
+ float * A)
+
+ -- Function: void cblas_dsymv (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const int N, const double ALPHA, const
+ double * A, const int LDA, const double * X, const int INCX,
+ const double BETA, double * Y, const int INCY)
+
+ -- Function: void cblas_dsbmv (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const int N, const int K, const double
+ ALPHA, const double * A, const int LDA, const double * X,
+ const int INCX, const double BETA, double * Y, const int INCY)
+
+ -- Function: void cblas_dspmv (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const int N, const double ALPHA, const
+ double * AP, const double * X, const int INCX, const double
+ BETA, double * Y, const int INCY)
+
+ -- Function: void cblas_dger (const enum CBLAS_ORDER ORDER, const int
+ M, const int N, const double ALPHA, const double * X, const
+ int INCX, const double * Y, const int INCY, double * A, const
+ int LDA)
+
+ -- Function: void cblas_dsyr (const enum CBLAS_ORDER ORDER, const enum
+ CBLAS_UPLO UPLO, const int N, const double ALPHA, const
+ double * X, const int INCX, double * A, const int LDA)
+
+ -- Function: void cblas_dspr (const enum CBLAS_ORDER ORDER, const enum
+ CBLAS_UPLO UPLO, const int N, const double ALPHA, const
+ double * X, const int INCX, double * AP)
+
+ -- Function: void cblas_dsyr2 (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const int N, const double ALPHA, const
+ double * X, const int INCX, const double * Y, const int INCY,
+ double * A, const int LDA)
+
+ -- Function: void cblas_dspr2 (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const int N, const double ALPHA, const
+ double * X, const int INCX, const double * Y, const int INCY,
+ double * A)
+
+ -- Function: void cblas_chemv (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const int N, const void * ALPHA, const
+ void * A, const int LDA, const void * X, const int INCX,
+ const void * BETA, void * Y, const int INCY)
+
+ -- Function: void cblas_chbmv (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const int N, const int K, const void *
+ ALPHA, const void * A, const int LDA, const void * X, const
+ int INCX, const void * BETA, void * Y, const int INCY)
+
+ -- Function: void cblas_chpmv (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const int N, const void * ALPHA, const
+ void * AP, const void * X, const int INCX, const void * BETA,
+ void * Y, const int INCY)
+
+ -- Function: void cblas_cgeru (const enum CBLAS_ORDER ORDER, const int
+ M, const int N, const void * ALPHA, const void * X, const int
+ INCX, const void * Y, const int INCY, void * A, const int LDA)
+
+ -- Function: void cblas_cgerc (const enum CBLAS_ORDER ORDER, const int
+ M, const int N, const void * ALPHA, const void * X, const int
+ INCX, const void * Y, const int INCY, void * A, const int LDA)
+
+ -- Function: void cblas_cher (const enum CBLAS_ORDER ORDER, const enum
+ CBLAS_UPLO UPLO, const int N, const float ALPHA, const void *
+ X, const int INCX, void * A, const int LDA)
+
+ -- Function: void cblas_chpr (const enum CBLAS_ORDER ORDER, const enum
+ CBLAS_UPLO UPLO, const int N, const float ALPHA, const void *
+ X, const int INCX, void * A)
+
+ -- Function: void cblas_cher2 (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const int N, const void * ALPHA, const
+ void * X, const int INCX, const void * Y, const int INCY,
+ void * A, const int LDA)
+
+ -- Function: void cblas_chpr2 (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const int N, const void * ALPHA, const
+ void * X, const int INCX, const void * Y, const int INCY,
+ void * AP)
+
+ -- Function: void cblas_zhemv (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const int N, const void * ALPHA, const
+ void * A, const int LDA, const void * X, const int INCX,
+ const void * BETA, void * Y, const int INCY)
+
+ -- Function: void cblas_zhbmv (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const int N, const int K, const void *
+ ALPHA, const void * A, const int LDA, const void * X, const
+ int INCX, const void * BETA, void * Y, const int INCY)
+
+ -- Function: void cblas_zhpmv (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const int N, const void * ALPHA, const
+ void * AP, const void * X, const int INCX, const void * BETA,
+ void * Y, const int INCY)
+
+ -- Function: void cblas_zgeru (const enum CBLAS_ORDER ORDER, const int
+ M, const int N, const void * ALPHA, const void * X, const int
+ INCX, const void * Y, const int INCY, void * A, const int LDA)
+
+ -- Function: void cblas_zgerc (const enum CBLAS_ORDER ORDER, const int
+ M, const int N, const void * ALPHA, const void * X, const int
+ INCX, const void * Y, const int INCY, void * A, const int LDA)
+
+ -- Function: void cblas_zher (const enum CBLAS_ORDER ORDER, const enum
+ CBLAS_UPLO UPLO, const int N, const double ALPHA, const void
+ * X, const int INCX, void * A, const int LDA)
+
+ -- Function: void cblas_zhpr (const enum CBLAS_ORDER ORDER, const enum
+ CBLAS_UPLO UPLO, const int N, const double ALPHA, const void
+ * X, const int INCX, void * A)
+
+ -- Function: void cblas_zher2 (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const int N, const void * ALPHA, const
+ void * X, const int INCX, const void * Y, const int INCY,
+ void * A, const int LDA)
+
+ -- Function: void cblas_zhpr2 (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const int N, const void * ALPHA, const
+ void * X, const int INCX, const void * Y, const int INCY,
+ void * AP)
+
+
+File: gsl-ref.info, Node: Level 3 CBLAS Functions, Next: GSL CBLAS Examples, Prev: Level 2 CBLAS Functions, Up: GSL CBLAS Library
+
+D.3 Level 3
+===========
+
+ -- Function: void cblas_sgemm (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_TRANSPOSE TRANSA, const enum CBLAS_TRANSPOSE
+ TRANSB, const int M, const int N, const int K, const float
+ ALPHA, const float * A, const int LDA, const float * B, const
+ int LDB, const float BETA, float * C, const int LDC)
+
+ -- Function: void cblas_ssymm (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_SIDE SIDE, const enum CBLAS_UPLO UPLO, const int
+ M, const int N, const float ALPHA, const float * A, const int
+ LDA, const float * B, const int LDB, const float BETA, float
+ * C, const int LDC)
+
+ -- Function: void cblas_ssyrk (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const enum CBLAS_TRANSPOSE TRANS, const
+ int N, const int K, const float ALPHA, const float * A, const
+ int LDA, const float BETA, float * C, const int LDC)
+
+ -- Function: void cblas_ssyr2k (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const enum CBLAS_TRANSPOSE TRANS, const
+ int N, const int K, const float ALPHA, const float * A, const
+ int LDA, const float * B, const int LDB, const float BETA,
+ float * C, const int LDC)
+
+ -- Function: void cblas_strmm (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_SIDE SIDE, const enum CBLAS_UPLO UPLO, const enum
+ CBLAS_TRANSPOSE TRANSA, const enum CBLAS_DIAG DIAG, const int
+ M, const int N, const float ALPHA, const float * A, const int
+ LDA, float * B, const int LDB)
+
+ -- Function: void cblas_strsm (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_SIDE SIDE, const enum CBLAS_UPLO UPLO, const enum
+ CBLAS_TRANSPOSE TRANSA, const enum CBLAS_DIAG DIAG, const int
+ M, const int N, const float ALPHA, const float * A, const int
+ LDA, float * B, const int LDB)
+
+ -- Function: void cblas_dgemm (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_TRANSPOSE TRANSA, const enum CBLAS_TRANSPOSE
+ TRANSB, const int M, const int N, const int K, const double
+ ALPHA, const double * A, const int LDA, const double * B,
+ const int LDB, const double BETA, double * C, const int LDC)
+
+ -- Function: void cblas_dsymm (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_SIDE SIDE, const enum CBLAS_UPLO UPLO, const int
+ M, const int N, const double ALPHA, const double * A, const
+ int LDA, const double * B, const int LDB, const double BETA,
+ double * C, const int LDC)
+
+ -- Function: void cblas_dsyrk (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const enum CBLAS_TRANSPOSE TRANS, const
+ int N, const int K, const double ALPHA, const double * A,
+ const int LDA, const double BETA, double * C, const int LDC)
+
+ -- Function: void cblas_dsyr2k (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const enum CBLAS_TRANSPOSE TRANS, const
+ int N, const int K, const double ALPHA, const double * A,
+ const int LDA, const double * B, const int LDB, const double
+ BETA, double * C, const int LDC)
+
+ -- Function: void cblas_dtrmm (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_SIDE SIDE, const enum CBLAS_UPLO UPLO, const enum
+ CBLAS_TRANSPOSE TRANSA, const enum CBLAS_DIAG DIAG, const int
+ M, const int N, const double ALPHA, const double * A, const
+ int LDA, double * B, const int LDB)
+
+ -- Function: void cblas_dtrsm (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_SIDE SIDE, const enum CBLAS_UPLO UPLO, const enum
+ CBLAS_TRANSPOSE TRANSA, const enum CBLAS_DIAG DIAG, const int
+ M, const int N, const double ALPHA, const double * A, const
+ int LDA, double * B, const int LDB)
+
+ -- Function: void cblas_cgemm (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_TRANSPOSE TRANSA, const enum CBLAS_TRANSPOSE
+ TRANSB, const int M, const int N, const int K, const void *
+ ALPHA, const void * A, const int LDA, const void * B, const
+ int LDB, const void * BETA, void * C, const int LDC)
+
+ -- Function: void cblas_csymm (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_SIDE SIDE, const enum CBLAS_UPLO UPLO, const int
+ M, const int N, const void * ALPHA, const void * A, const int
+ LDA, const void * B, const int LDB, const void * BETA, void *
+ C, const int LDC)
+
+ -- Function: void cblas_csyrk (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const enum CBLAS_TRANSPOSE TRANS, const
+ int N, const int K, const void * ALPHA, const void * A, const
+ int LDA, const void * BETA, void * C, const int LDC)
+
+ -- Function: void cblas_csyr2k (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const enum CBLAS_TRANSPOSE TRANS, const
+ int N, const int K, const void * ALPHA, const void * A, const
+ int LDA, const void * B, const int LDB, const void * BETA,
+ void * C, const int LDC)
+
+ -- Function: void cblas_ctrmm (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_SIDE SIDE, const enum CBLAS_UPLO UPLO, const enum
+ CBLAS_TRANSPOSE TRANSA, const enum CBLAS_DIAG DIAG, const int
+ M, const int N, const void * ALPHA, const void * A, const int
+ LDA, void * B, const int LDB)
+
+ -- Function: void cblas_ctrsm (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_SIDE SIDE, const enum CBLAS_UPLO UPLO, const enum
+ CBLAS_TRANSPOSE TRANSA, const enum CBLAS_DIAG DIAG, const int
+ M, const int N, const void * ALPHA, const void * A, const int
+ LDA, void * B, const int LDB)
+
+ -- Function: void cblas_zgemm (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_TRANSPOSE TRANSA, const enum CBLAS_TRANSPOSE
+ TRANSB, const int M, const int N, const int K, const void *
+ ALPHA, const void * A, const int LDA, const void * B, const
+ int LDB, const void * BETA, void * C, const int LDC)
+
+ -- Function: void cblas_zsymm (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_SIDE SIDE, const enum CBLAS_UPLO UPLO, const int
+ M, const int N, const void * ALPHA, const void * A, const int
+ LDA, const void * B, const int LDB, const void * BETA, void *
+ C, const int LDC)
+
+ -- Function: void cblas_zsyrk (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const enum CBLAS_TRANSPOSE TRANS, const
+ int N, const int K, const void * ALPHA, const void * A, const
+ int LDA, const void * BETA, void * C, const int LDC)
+
+ -- Function: void cblas_zsyr2k (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const enum CBLAS_TRANSPOSE TRANS, const
+ int N, const int K, const void * ALPHA, const void * A, const
+ int LDA, const void * B, const int LDB, const void * BETA,
+ void * C, const int LDC)
+
+ -- Function: void cblas_ztrmm (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_SIDE SIDE, const enum CBLAS_UPLO UPLO, const enum
+ CBLAS_TRANSPOSE TRANSA, const enum CBLAS_DIAG DIAG, const int
+ M, const int N, const void * ALPHA, const void * A, const int
+ LDA, void * B, const int LDB)
+
+ -- Function: void cblas_ztrsm (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_SIDE SIDE, const enum CBLAS_UPLO UPLO, const enum
+ CBLAS_TRANSPOSE TRANSA, const enum CBLAS_DIAG DIAG, const int
+ M, const int N, const void * ALPHA, const void * A, const int
+ LDA, void * B, const int LDB)
+
+ -- Function: void cblas_chemm (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_SIDE SIDE, const enum CBLAS_UPLO UPLO, const int
+ M, const int N, const void * ALPHA, const void * A, const int
+ LDA, const void * B, const int LDB, const void * BETA, void *
+ C, const int LDC)
+
+ -- Function: void cblas_cherk (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const enum CBLAS_TRANSPOSE TRANS, const
+ int N, const int K, const float ALPHA, const void * A, const
+ int LDA, const float BETA, void * C, const int LDC)
+
+ -- Function: void cblas_cher2k (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const enum CBLAS_TRANSPOSE TRANS, const
+ int N, const int K, const void * ALPHA, const void * A, const
+ int LDA, const void * B, const int LDB, const float BETA,
+ void * C, const int LDC)
+
+ -- Function: void cblas_zhemm (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_SIDE SIDE, const enum CBLAS_UPLO UPLO, const int
+ M, const int N, const void * ALPHA, const void * A, const int
+ LDA, const void * B, const int LDB, const void * BETA, void *
+ C, const int LDC)
+
+ -- Function: void cblas_zherk (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const enum CBLAS_TRANSPOSE TRANS, const
+ int N, const int K, const double ALPHA, const void * A, const
+ int LDA, const double BETA, void * C, const int LDC)
+
+ -- Function: void cblas_zher2k (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const enum CBLAS_TRANSPOSE TRANS, const
+ int N, const int K, const void * ALPHA, const void * A, const
+ int LDA, const void * B, const int LDB, const double BETA,
+ void * C, const int LDC)
+
+ -- Function: void cblas_xerbla (int P, const char * ROUT, const char *
+ FORM, ...)
+
+
+File: gsl-ref.info, Node: GSL CBLAS Examples, Prev: Level 3 CBLAS Functions, Up: GSL CBLAS Library
+
+D.4 Examples
+============
+
+The following program computes the product of two matrices using the
+Level-3 BLAS function SGEMM,
+
+ [ 0.11 0.12 0.13 ] [ 1011 1012 ] [ 367.76 368.12 ]
+ [ 0.21 0.22 0.23 ] [ 1021 1022 ] = [ 674.06 674.72 ]
+ [ 1031 1032 ]
+
+The matrices are stored in row major order but could be stored in column
+major order if the first argument of the call to `cblas_sgemm' was
+changed to `CblasColMajor'.
+
+ #include <stdio.h>
+ #include <gsl/gsl_cblas.h>
+
+ int
+ main (void)
+ {
+ int lda = 3;
+
+ float A[] = { 0.11, 0.12, 0.13,
+ 0.21, 0.22, 0.23 };
+
+ int ldb = 2;
+
+ float B[] = { 1011, 1012,
+ 1021, 1022,
+ 1031, 1032 };
+
+ int ldc = 2;
+
+ float C[] = { 0.00, 0.00,
+ 0.00, 0.00 };
+
+ /* Compute C = A B */
+
+ cblas_sgemm (CblasRowMajor,
+ CblasNoTrans, CblasNoTrans, 2, 2, 3,
+ 1.0, A, lda, B, ldb, 0.0, C, ldc);
+
+ printf ("[ %g, %g\n", C[0], C[1]);
+ printf (" %g, %g ]\n", C[2], C[3]);
+
+ return 0;
+ }
+
+To compile the program use the following command line,
+
+ $ gcc -Wall demo.c -lgslcblas
+
+There is no need to link with the main library `-lgsl' in this case as
+the CBLAS library is an independent unit. Here is the output from the
+program,
+
+ $ ./a.out
+ [ 367.76, 368.12
+ 674.06, 674.72 ]
+
+
+File: gsl-ref.info, Node: Free Software Needs Free Documentation, Next: GNU General Public License, Prev: GSL CBLAS Library, Up: Top
+
+Free Software Needs Free Documentation
+**************************************
+
+ The following article was written by Richard Stallman, founder of
+ the GNU Project.
+
+ The biggest deficiency in the free software community today is not in
+the software--it is the lack of good free documentation that we can
+include with the free software. Many of our most important programs do
+not come with free reference manuals and free introductory texts.
+Documentation is an essential part of any software package; when an
+important free software package does not come with a free manual and a
+free tutorial, that is a major gap. We have many such gaps today.
+
+ Consider Perl, for instance. The tutorial manuals that people
+normally use are non-free. How did this come about? Because the
+authors of those manuals published them with restrictive terms--no
+copying, no modification, source files not available--which exclude
+them from the free software world.
+
+ That wasn't the first time this sort of thing happened, and it was
+far from the last. Many times we have heard a GNU user eagerly
+describe a manual that he is writing, his intended contribution to the
+community, only to learn that he had ruined everything by signing a
+publication contract to make it non-free.
+
+ Free documentation, like free software, is a matter of freedom, not
+price. The problem with the non-free manual is not that publishers
+charge a price for printed copies--that in itself is fine. (The Free
+Software Foundation sells printed copies of manuals, too.) The problem
+is the restrictions on the use of the manual. Free manuals are
+available in source code form, and give you permission to copy and
+modify. Non-free manuals do not allow this.
+
+ The criteria of freedom for a free manual are roughly the same as for
+free software. Redistribution (including the normal kinds of
+commercial redistribution) must be permitted, so that the manual can
+accompany every copy of the program, both on-line and on paper.
+
+ Permission for modification of the technical content is crucial too.
+When people modify the software, adding or changing features, if they
+are conscientious they will change the manual too--so they can provide
+accurate and clear documentation for the modified program. A manual
+that leaves you no choice but to write a new manual to document a
+changed version of the program is not really available to our community.
+
+ Some kinds of limits on the way modification is handled are
+acceptable. For example, requirements to preserve the original
+author's copyright notice, the distribution terms, or the list of
+authors, are ok. It is also no problem to require modified versions to
+include notice that they were modified. Even entire sections that may
+not be deleted or changed are acceptable, as long as they deal with
+nontechnical topics (like this one). These kinds of restrictions are
+acceptable because they don't obstruct the community's normal use of
+the manual.
+
+ However, it must be possible to modify all the _technical_ content
+of the manual, and then distribute the result in all the usual media,
+through all the usual channels. Otherwise, the restrictions obstruct
+the use of the manual, it is not free, and we need another manual to
+replace it.
+
+ Please spread the word about this issue. Our community continues to
+lose manuals to proprietary publishing. If we spread the word that
+free software needs free reference manuals and free tutorials, perhaps
+the next person who wants to contribute by writing documentation will
+realize, before it is too late, that only free manuals contribute to
+the free software community.
+
+ If you are writing documentation, please insist on publishing it
+under the GNU Free Documentation License or another free documentation
+license. Remember that this decision requires your approval--you don't
+have to let the publisher decide. Some commercial publishers will use
+a free license if you insist, but they will not propose the option; it
+is up to you to raise the issue and say firmly that this is what you
+want. If the publisher you are dealing with refuses, please try other
+publishers. If you're not sure whether a proposed license is free,
+write to <licensing@gnu.org>.
+
+ You can encourage commercial publishers to sell more free, copylefted
+manuals and tutorials by buying them, and particularly by buying copies
+from the publishers that paid for their writing or for major
+improvements. Meanwhile, try to avoid buying non-free documentation at
+all. Check the distribution terms of a manual before you buy it, and
+insist that whoever seeks your business must respect your freedom.
+Check the history of the book, and try reward the publishers that have
+paid or pay the authors to work on it.
+
+ The Free Software Foundation maintains a list of free documentation
+published by other publishers:
+
+ `http://www.fsf.org/doc/other-free-books.html'
+
+
+File: gsl-ref.info, Node: GNU General Public License, Next: GNU Free Documentation License, Prev: Free Software Needs Free Documentation, Up: Top
+
+GNU General Public License
+**************************
+
+ Version 2, June 1991
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+
+ Everyone is permitted to copy and distribute verbatim copies of this
+ license document, but changing it is not allowed.
+
+Preamble
+========
+
+The licenses for most software are designed to take away your freedom
+to share and change it. By contrast, the GNU General Public License is
+intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it in
+new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software,
+and (2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+ 0. This License applies to any program or other work which contains a
+ notice placed by the copyright holder saying it may be distributed
+ under the terms of this General Public License. The "Program",
+ below, refers to any such program or work, and a "work based on
+ the Program" means either the Program or any derivative work under
+ copyright law: that is to say, a work containing the Program or a
+ portion of it, either verbatim or with modifications and/or
+ translated into another language. (Hereinafter, translation is
+ included without limitation in the term "modification".) Each
+ licensee is addressed as "you".
+
+ Activities other than copying, distribution and modification are
+ not covered by this License; they are outside its scope. The act
+ of running the Program is not restricted, and the output from the
+ Program is covered only if its contents constitute a work based on
+ the Program (independent of having been made by running the
+ Program). Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+ source code as you receive it, in any medium, provided that you
+ conspicuously and appropriately publish on each copy an appropriate
+ copyright notice and disclaimer of warranty; keep intact all the
+ notices that refer to this License and to the absence of any
+ warranty; and give any other recipients of the Program a copy of
+ this License along with the Program.
+
+ You may charge a fee for the physical act of transferring a copy,
+ and you may at your option offer warranty protection in exchange
+ for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+ of it, thus forming a work based on the Program, and copy and
+ distribute such modifications or work under the terms of Section 1
+ above, provided that you also meet all of these conditions:
+
+ a. You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b. You must cause any work that you distribute or publish, that
+ in whole or in part contains or is derived from the Program
+ or any part thereof, to be licensed as a whole at no charge
+ to all third parties under the terms of this License.
+
+ c. If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display
+ an announcement including an appropriate copyright notice and
+ a notice that there is no warranty (or else, saying that you
+ provide a warranty) and that users may redistribute the
+ program under these conditions, and telling the user how to
+ view a copy of this License. (Exception: if the Program
+ itself is interactive but does not normally print such an
+ announcement, your work based on the Program is not required
+ to print an announcement.)
+
+ These requirements apply to the modified work as a whole. If
+ identifiable sections of that work are not derived from the
+ Program, and can be reasonably considered independent and separate
+ works in themselves, then this License, and its terms, do not
+ apply to those sections when you distribute them as separate
+ works. But when you distribute the same sections as part of a
+ whole which is a work based on the Program, the distribution of
+ the whole must be on the terms of this License, whose permissions
+ for other licensees extend to the entire whole, and thus to each
+ and every part regardless of who wrote it.
+
+ Thus, it is not the intent of this section to claim rights or
+ contest your rights to work written entirely by you; rather, the
+ intent is to exercise the right to control the distribution of
+ derivative or collective works based on the Program.
+
+ In addition, mere aggregation of another work not based on the
+ Program with the Program (or with a work based on the Program) on
+ a volume of a storage or distribution medium does not bring the
+ other work under the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+ under Section 2) in object code or executable form under the terms
+ of Sections 1 and 2 above provided that you also do one of the
+ following:
+
+ a. Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of
+ Sections 1 and 2 above on a medium customarily used for
+ software interchange; or,
+
+ b. Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a
+ medium customarily used for software interchange; or,
+
+ c. Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with
+ such an offer, in accord with Subsection b above.)
+
+ The source code for a work means the preferred form of the work for
+ making modifications to it. For an executable work, complete
+ source code means all the source code for all modules it contains,
+ plus any associated interface definition files, plus the scripts
+ used to control compilation and installation of the executable.
+ However, as a special exception, the source code distributed need
+ not include anything that is normally distributed (in either
+ source or binary form) with the major components (compiler,
+ kernel, and so on) of the operating system on which the executable
+ runs, unless that component itself accompanies the executable.
+
+ If distribution of executable or object code is made by offering
+ access to copy from a designated place, then offering equivalent
+ access to copy the source code from the same place counts as
+ distribution of the source code, even though third parties are not
+ compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+ except as expressly provided under this License. Any attempt
+ otherwise to copy, modify, sublicense or distribute the Program is
+ void, and will automatically terminate your rights under this
+ License. However, parties who have received copies, or rights,
+ from you under this License will not have their licenses
+ terminated so long as such parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+ signed it. However, nothing else grants you permission to modify
+ or distribute the Program or its derivative works. These actions
+ are prohibited by law if you do not accept this License.
+ Therefore, by modifying or distributing the Program (or any work
+ based on the Program), you indicate your acceptance of this
+ License to do so, and all its terms and conditions for copying,
+ distributing or modifying the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+ Program), the recipient automatically receives a license from the
+ original licensor to copy, distribute or modify the Program
+ subject to these terms and conditions. You may not impose any
+ further restrictions on the recipients' exercise of the rights
+ granted herein. You are not responsible for enforcing compliance
+ by third parties to this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+ infringement or for any other reason (not limited to patent
+ issues), conditions are imposed on you (whether by court order,
+ agreement or otherwise) that contradict the conditions of this
+ License, they do not excuse you from the conditions of this
+ License. If you cannot distribute so as to satisfy simultaneously
+ your obligations under this License and any other pertinent
+ obligations, then as a consequence you may not distribute the
+ Program at all. For example, if a patent license would not permit
+ royalty-free redistribution of the Program by all those who
+ receive copies directly or indirectly through you, then the only
+ way you could satisfy both it and this License would be to refrain
+ entirely from distribution of the Program.
+
+ If any portion of this section is held invalid or unenforceable
+ under any particular circumstance, the balance of the section is
+ intended to apply and the section as a whole is intended to apply
+ in other circumstances.
+
+ It is not the purpose of this section to induce you to infringe any
+ patents or other property right claims or to contest validity of
+ any such claims; this section has the sole purpose of protecting
+ the integrity of the free software distribution system, which is
+ implemented by public license practices. Many people have made
+ generous contributions to the wide range of software distributed
+ through that system in reliance on consistent application of that
+ system; it is up to the author/donor to decide if he or she is
+ willing to distribute software through any other system and a
+ licensee cannot impose that choice.
+
+ This section is intended to make thoroughly clear what is believed
+ to be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+ certain countries either by patents or by copyrighted interfaces,
+ the original copyright holder who places the Program under this
+ License may add an explicit geographical distribution limitation
+ excluding those countries, so that distribution is permitted only
+ in or among countries not thus excluded. In such case, this
+ License incorporates the limitation as if written in the body of
+ this License.
+
+ 9. The Free Software Foundation may publish revised and/or new
+ versions of the General Public License from time to time. Such
+ new versions will be similar in spirit to the present version, but
+ may differ in detail to address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+ Program specifies a version number of this License which applies
+ to it and "any later version", you have the option of following
+ the terms and conditions either of that version or of any later
+ version published by the Free Software Foundation. If the Program
+ does not specify a version number of this License, you may choose
+ any version ever published by the Free Software Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+ programs whose distribution conditions are different, write to the
+ author to ask for permission. For software which is copyrighted
+ by the Free Software Foundation, write to the Free Software
+ Foundation; we sometimes make exceptions for this. Our decision
+ will be guided by the two goals of preserving the free status of
+ all derivatives of our free software and of promoting the sharing
+ and reuse of software generally.
+
+ NO WARRANTY
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO
+ WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE
+ LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+ HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT
+ WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT
+ NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE
+ QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+ PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY
+ SERVICING, REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+ WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY
+ MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE
+ LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL,
+ INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR
+ INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+ DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU
+ OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY
+ OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN
+ ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+Appendix: How to Apply These Terms to Your New Programs
+=======================================================
+
+If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these
+terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ one line to give the program's name and a brief idea
+ of whAT IT DOES.
+ Copyright (C) YYYY NAME OF AUTHOR
+
+ This program is free software; you can redistribute it
+ and/or modify it under the terms of the GNU General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later
+ version.
+
+ This program is distributed in the hope that it will be
+ useful, but WITHOUT ANY WARRANTY; without even the implied
+ warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ PURPOSE. See the GNU General Public License for more
+ details.
+
+ You should have received a copy of the GNU General Public
+ License along with this program; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA.
+
+ Also add information on how to contact you by electronic and paper
+mail.
+
+ If the program is interactive, make it output a short notice like
+this when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) 19YY NAME OF AUTHOR
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details
+ type `show w'. This is free software, and you are welcome
+ to redistribute it under certain conditions; type `show c'
+ for details.
+
+ The hypothetical commands `show w' and `show c' should show the
+appropriate parts of the General Public License. Of course, the
+commands you use may be called something other than `show w' and `show
+c'; they could even be mouse-clicks or menu items--whatever suits your
+program.
+
+ You should also get your employer (if you work as a programmer) or
+your school, if any, to sign a "copyright disclaimer" for the program,
+if necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in
+ the program `Gnomovision' (which makes passes at compilers)
+ written by James Hacker.
+
+ SIGNATURE OF TY COON, 1 April 1989
+ Ty Coon, President of Vice
+
+ This General Public License does not permit incorporating your
+program into proprietary programs. If your program is a subroutine
+library, you may consider it more useful to permit linking proprietary
+applications with the library. If this is what you want to do, use the
+GNU Library General Public License instead of this License.
+
+
+File: gsl-ref.info, Node: GNU Free Documentation License, Next: Function Index, Prev: GNU General Public License, Up: Top
+
+GNU Free Documentation License
+******************************
+
+ Version 1.2, November 2002
+ Copyright (C) 2000,2001,2002 Free Software Foundation, Inc.
+ 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+
+ Everyone is permitted to copy and distribute verbatim copies of this license
+ document, but changing it is not allowed.
+
+ 0. PREAMBLE
+
+ The purpose of this License is to make a manual, textbook, or other
+ functional and useful document "free" in the sense of freedom: to
+ assure everyone the effective freedom to copy and redistribute it,
+ with or without modifying it, either commercially or
+ noncommercially. Secondarily, this License preserves for the
+ author and publisher a way to get credit for their work, while not
+ being considered responsible for modifications made by others.
+
+ This License is a kind of "copyleft", which means that derivative
+ works of the document must themselves be free in the same sense.
+ It complements the GNU General Public License, which is a copyleft
+ license designed for free software.
+
+ We have designed this License in order to use it for manuals for
+ free software, because free software needs free documentation: a
+ free program should come with manuals providing the same freedoms
+ that the software does. But this License is not limited to
+ software manuals; it can be used for any textual work, regardless
+ of subject matter or whether it is published as a printed book.
+ We recommend this License principally for works whose purpose is
+ instruction or reference.
+
+ 1. APPLICABILITY AND DEFINITIONS
+
+ This License applies to any manual or other work, in any medium,
+ that contains a notice placed by the copyright holder saying it
+ can be distributed under the terms of this License. Such a notice
+ grants a world-wide, royalty-free license, unlimited in duration,
+ to use that work under the conditions stated herein. The
+ "Document", below, refers to any such manual or work. Any member
+ of the public is a licensee, and is addressed as "you". You
+ accept the license if you copy, modify or distribute the work in a
+ way requiring permission under copyright law.
+
+ A "Modified Version" of the Document means any work containing the
+ Document or a portion of it, either copied verbatim, or with
+ modifications and/or translated into another language.
+
+ A "Secondary Section" is a named appendix or a front-matter section
+ of the Document that deals exclusively with the relationship of the
+ publishers or authors of the Document to the Document's overall
+ subject (or to related matters) and contains nothing that could
+ fall directly within that overall subject. (Thus, if the Document
+ is in part a textbook of mathematics, a Secondary Section may not
+ explain any mathematics.) The relationship could be a matter of
+ historical connection with the subject or with related matters, or
+ of legal, commercial, philosophical, ethical or political position
+ regarding them.
+
+ The "Invariant Sections" are certain Secondary Sections whose
+ titles are designated, as being those of Invariant Sections, in
+ the notice that says that the Document is released under this
+ License. If a section does not fit the above definition of
+ Secondary then it is not allowed to be designated as Invariant.
+ The Document may contain zero Invariant Sections. If the Document
+ does not identify any Invariant Sections then there are none.
+
+ The "Cover Texts" are certain short passages of text that are
+ listed, as Front-Cover Texts or Back-Cover Texts, in the notice
+ that says that the Document is released under this License. A
+ Front-Cover Text may be at most 5 words, and a Back-Cover Text may
+ be at most 25 words.
+
+ A "Transparent" copy of the Document means a machine-readable copy,
+ represented in a format whose specification is available to the
+ general public, that is suitable for revising the document
+ straightforwardly with generic text editors or (for images
+ composed of pixels) generic paint programs or (for drawings) some
+ widely available drawing editor, and that is suitable for input to
+ text formatters or for automatic translation to a variety of
+ formats suitable for input to text formatters. A copy made in an
+ otherwise Transparent file format whose markup, or absence of
+ markup, has been arranged to thwart or discourage subsequent
+ modification by readers is not Transparent. An image format is
+ not Transparent if used for any substantial amount of text. A
+ copy that is not "Transparent" is called "Opaque".
+
+ Examples of suitable formats for Transparent copies include plain
+ ASCII without markup, Texinfo input format, LaTeX input format,
+ SGML or XML using a publicly available DTD, and
+ standard-conforming simple HTML, PostScript or PDF designed for
+ human modification. Examples of transparent image formats include
+ PNG, XCF and JPG. Opaque formats include proprietary formats that
+ can be read and edited only by proprietary word processors, SGML or
+ XML for which the DTD and/or processing tools are not generally
+ available, and the machine-generated HTML, PostScript or PDF
+ produced by some word processors for output purposes only.
+
+ The "Title Page" means, for a printed book, the title page itself,
+ plus such following pages as are needed to hold, legibly, the
+ material this License requires to appear in the title page. For
+ works in formats which do not have any title page as such, "Title
+ Page" means the text near the most prominent appearance of the
+ work's title, preceding the beginning of the body of the text.
+
+ A section "Entitled XYZ" means a named subunit of the Document
+ whose title either is precisely XYZ or contains XYZ in parentheses
+ following text that translates XYZ in another language. (Here XYZ
+ stands for a specific section name mentioned below, such as
+ "Acknowledgements", "Dedications", "Endorsements", or "History".)
+ To "Preserve the Title" of such a section when you modify the
+ Document means that it remains a section "Entitled XYZ" according
+ to this definition.
+
+ The Document may include Warranty Disclaimers next to the notice
+ which states that this License applies to the Document. These
+ Warranty Disclaimers are considered to be included by reference in
+ this License, but only as regards disclaiming warranties: any other
+ implication that these Warranty Disclaimers may have is void and
+ has no effect on the meaning of this License.
+
+ 2. VERBATIM COPYING
+
+ You may copy and distribute the Document in any medium, either
+ commercially or noncommercially, provided that this License, the
+ copyright notices, and the license notice saying this License
+ applies to the Document are reproduced in all copies, and that you
+ add no other conditions whatsoever to those of this License. You
+ may not use technical measures to obstruct or control the reading
+ or further copying of the copies you make or distribute. However,
+ you may accept compensation in exchange for copies. If you
+ distribute a large enough number of copies you must also follow
+ the conditions in section 3.
+
+ You may also lend copies, under the same conditions stated above,
+ and you may publicly display copies.
+
+ 3. COPYING IN QUANTITY
+
+ If you publish printed copies (or copies in media that commonly
+ have printed covers) of the Document, numbering more than 100, and
+ the Document's license notice requires Cover Texts, you must
+ enclose the copies in covers that carry, clearly and legibly, all
+ these Cover Texts: Front-Cover Texts on the front cover, and
+ Back-Cover Texts on the back cover. Both covers must also clearly
+ and legibly identify you as the publisher of these copies. The
+ front cover must present the full title with all words of the
+ title equally prominent and visible. You may add other material
+ on the covers in addition. Copying with changes limited to the
+ covers, as long as they preserve the title of the Document and
+ satisfy these conditions, can be treated as verbatim copying in
+ other respects.
+
+ If the required texts for either cover are too voluminous to fit
+ legibly, you should put the first ones listed (as many as fit
+ reasonably) on the actual cover, and continue the rest onto
+ adjacent pages.
+
+ If you publish or distribute Opaque copies of the Document
+ numbering more than 100, you must either include a
+ machine-readable Transparent copy along with each Opaque copy, or
+ state in or with each Opaque copy a computer-network location from
+ which the general network-using public has access to download
+ using public-standard network protocols a complete Transparent
+ copy of the Document, free of added material. If you use the
+ latter option, you must take reasonably prudent steps, when you
+ begin distribution of Opaque copies in quantity, to ensure that
+ this Transparent copy will remain thus accessible at the stated
+ location until at least one year after the last time you
+ distribute an Opaque copy (directly or through your agents or
+ retailers) of that edition to the public.
+
+ It is requested, but not required, that you contact the authors of
+ the Document well before redistributing any large number of
+ copies, to give them a chance to provide you with an updated
+ version of the Document.
+
+ 4. MODIFICATIONS
+
+ You may copy and distribute a Modified Version of the Document
+ under the conditions of sections 2 and 3 above, provided that you
+ release the Modified Version under precisely this License, with
+ the Modified Version filling the role of the Document, thus
+ licensing distribution and modification of the Modified Version to
+ whoever possesses a copy of it. In addition, you must do these
+ things in the Modified Version:
+
+ A. Use in the Title Page (and on the covers, if any) a title
+ distinct from that of the Document, and from those of
+ previous versions (which should, if there were any, be listed
+ in the History section of the Document). You may use the
+ same title as a previous version if the original publisher of
+ that version gives permission.
+
+ B. List on the Title Page, as authors, one or more persons or
+ entities responsible for authorship of the modifications in
+ the Modified Version, together with at least five of the
+ principal authors of the Document (all of its principal
+ authors, if it has fewer than five), unless they release you
+ from this requirement.
+
+ C. State on the Title page the name of the publisher of the
+ Modified Version, as the publisher.
+
+ D. Preserve all the copyright notices of the Document.
+
+ E. Add an appropriate copyright notice for your modifications
+ adjacent to the other copyright notices.
+
+ F. Include, immediately after the copyright notices, a license
+ notice giving the public permission to use the Modified
+ Version under the terms of this License, in the form shown in
+ the Addendum below.
+
+ G. Preserve in that license notice the full lists of Invariant
+ Sections and required Cover Texts given in the Document's
+ license notice.
+
+ H. Include an unaltered copy of this License.
+
+ I. Preserve the section Entitled "History", Preserve its Title,
+ and add to it an item stating at least the title, year, new
+ authors, and publisher of the Modified Version as given on
+ the Title Page. If there is no section Entitled "History" in
+ the Document, create one stating the title, year, authors,
+ and publisher of the Document as given on its Title Page,
+ then add an item describing the Modified Version as stated in
+ the previous sentence.
+
+ J. Preserve the network location, if any, given in the Document
+ for public access to a Transparent copy of the Document, and
+ likewise the network locations given in the Document for
+ previous versions it was based on. These may be placed in
+ the "History" section. You may omit a network location for a
+ work that was published at least four years before the
+ Document itself, or if the original publisher of the version
+ it refers to gives permission.
+
+ K. For any section Entitled "Acknowledgements" or "Dedications",
+ Preserve the Title of the section, and preserve in the
+ section all the substance and tone of each of the contributor
+ acknowledgements and/or dedications given therein.
+
+ L. Preserve all the Invariant Sections of the Document,
+ unaltered in their text and in their titles. Section numbers
+ or the equivalent are not considered part of the section
+ titles.
+
+ M. Delete any section Entitled "Endorsements". Such a section
+ may not be included in the Modified Version.
+
+ N. Do not retitle any existing section to be Entitled
+ "Endorsements" or to conflict in title with any Invariant
+ Section.
+
+ O. Preserve any Warranty Disclaimers.
+
+ If the Modified Version includes new front-matter sections or
+ appendices that qualify as Secondary Sections and contain no
+ material copied from the Document, you may at your option
+ designate some or all of these sections as invariant. To do this,
+ add their titles to the list of Invariant Sections in the Modified
+ Version's license notice. These titles must be distinct from any
+ other section titles.
+
+ You may add a section Entitled "Endorsements", provided it contains
+ nothing but endorsements of your Modified Version by various
+ parties--for example, statements of peer review or that the text
+ has been approved by an organization as the authoritative
+ definition of a standard.
+
+ You may add a passage of up to five words as a Front-Cover Text,
+ and a passage of up to 25 words as a Back-Cover Text, to the end
+ of the list of Cover Texts in the Modified Version. Only one
+ passage of Front-Cover Text and one of Back-Cover Text may be
+ added by (or through arrangements made by) any one entity. If the
+ Document already includes a cover text for the same cover,
+ previously added by you or by arrangement made by the same entity
+ you are acting on behalf of, you may not add another; but you may
+ replace the old one, on explicit permission from the previous
+ publisher that added the old one.
+
+ The author(s) and publisher(s) of the Document do not by this
+ License give permission to use their names for publicity for or to
+ assert or imply endorsement of any Modified Version.
+
+ 5. COMBINING DOCUMENTS
+
+ You may combine the Document with other documents released under
+ this License, under the terms defined in section 4 above for
+ modified versions, provided that you include in the combination
+ all of the Invariant Sections of all of the original documents,
+ unmodified, and list them all as Invariant Sections of your
+ combined work in its license notice, and that you preserve all
+ their Warranty Disclaimers.
+
+ The combined work need only contain one copy of this License, and
+ multiple identical Invariant Sections may be replaced with a single
+ copy. If there are multiple Invariant Sections with the same name
+ but different contents, make the title of each such section unique
+ by adding at the end of it, in parentheses, the name of the
+ original author or publisher of that section if known, or else a
+ unique number. Make the same adjustment to the section titles in
+ the list of Invariant Sections in the license notice of the
+ combined work.
+
+ In the combination, you must combine any sections Entitled
+ "History" in the various original documents, forming one section
+ Entitled "History"; likewise combine any sections Entitled
+ "Acknowledgements", and any sections Entitled "Dedications". You
+ must delete all sections Entitled "Endorsements."
+
+ 6. COLLECTIONS OF DOCUMENTS
+
+ You may make a collection consisting of the Document and other
+ documents released under this License, and replace the individual
+ copies of this License in the various documents with a single copy
+ that is included in the collection, provided that you follow the
+ rules of this License for verbatim copying of each of the
+ documents in all other respects.
+
+ You may extract a single document from such a collection, and
+ distribute it individually under this License, provided you insert
+ a copy of this License into the extracted document, and follow
+ this License in all other respects regarding verbatim copying of
+ that document.
+
+ 7. AGGREGATION WITH INDEPENDENT WORKS
+
+ A compilation of the Document or its derivatives with other
+ separate and independent documents or works, in or on a volume of
+ a storage or distribution medium, is called an "aggregate" if the
+ copyright resulting from the compilation is not used to limit the
+ legal rights of the compilation's users beyond what the individual
+ works permit. When the Document is included in an aggregate, this
+ License does not apply to the other works in the aggregate which
+ are not themselves derivative works of the Document.
+
+ If the Cover Text requirement of section 3 is applicable to these
+ copies of the Document, then if the Document is less than one half
+ of the entire aggregate, the Document's Cover Texts may be placed
+ on covers that bracket the Document within the aggregate, or the
+ electronic equivalent of covers if the Document is in electronic
+ form. Otherwise they must appear on printed covers that bracket
+ the whole aggregate.
+
+ 8. TRANSLATION
+
+ Translation is considered a kind of modification, so you may
+ distribute translations of the Document under the terms of section
+ 4. Replacing Invariant Sections with translations requires special
+ permission from their copyright holders, but you may include
+ translations of some or all Invariant Sections in addition to the
+ original versions of these Invariant Sections. You may include a
+ translation of this License, and all the license notices in the
+ Document, and any Warranty Disclaimers, provided that you also
+ include the original English version of this License and the
+ original versions of those notices and disclaimers. In case of a
+ disagreement between the translation and the original version of
+ this License or a notice or disclaimer, the original version will
+ prevail.
+
+ If a section in the Document is Entitled "Acknowledgements",
+ "Dedications", or "History", the requirement (section 4) to
+ Preserve its Title (section 1) will typically require changing the
+ actual title.
+
+ 9. TERMINATION
+
+ You may not copy, modify, sublicense, or distribute the Document
+ except as expressly provided for under this License. Any other
+ attempt to copy, modify, sublicense or distribute the Document is
+ void, and will automatically terminate your rights under this
+ License. However, parties who have received copies, or rights,
+ from you under this License will not have their licenses
+ terminated so long as such parties remain in full compliance.
+
+ 10. FUTURE REVISIONS OF THIS LICENSE
+
+ The Free Software Foundation may publish new, revised versions of
+ the GNU Free Documentation License from time to time. Such new
+ versions will be similar in spirit to the present version, but may
+ differ in detail to address new problems or concerns. See
+ `http://www.gnu.org/copyleft/'.
+
+ Each version of the License is given a distinguishing version
+ number. If the Document specifies that a particular numbered
+ version of this License "or any later version" applies to it, you
+ have the option of following the terms and conditions either of
+ that specified version or of any later version that has been
+ published (not as a draft) by the Free Software Foundation. If
+ the Document does not specify a version number of this License,
+ you may choose any version ever published (not as a draft) by the
+ Free Software Foundation.
+
+ADDENDUM: How to use this License for your documents
+====================================================
+
+To use this License in a document you have written, include a copy of
+the License in the document and put the following copyright and license
+notices just after the title page:
+
+ Copyright (C) YEAR YOUR NAME.
+ Permission is granted to copy, distribute and/or modify
+ this document under the terms of the GNU Free
+ Documentation License, Version 1.2 or any later version
+ published by the Free Software Foundation; with no
+ Invariant Sections, no Front-Cover Texts, and no
+ Back-Cover Texts. A copy of the license is included in
+ the section entitled ``GNU Free Documentation License''.
+
+ If you have Invariant Sections, Front-Cover Texts and Back-Cover
+Texts, replace the "with...Texts." line with this:
+
+ with the Invariant Sections being LIST THEIR
+ TITLES, with the Front-Cover Texts being LIST, and
+ with the Back-Cover Texts being LIST.
+
+ If you have Invariant Sections without Cover Texts, or some other
+combination of the three, merge those two alternatives to suit the
+situation.
+
+ If your document contains nontrivial examples of program code, we
+recommend releasing these examples in parallel under your choice of
+free software license, such as the GNU General Public License, to
+permit their use in free software.
+