summaryrefslogtreecommitdiff
path: root/gsl-1.9/doc/poly.texi
diff options
context:
space:
mode:
Diffstat (limited to 'gsl-1.9/doc/poly.texi')
-rw-r--r--gsl-1.9/doc/poly.texi302
1 files changed, 302 insertions, 0 deletions
diff --git a/gsl-1.9/doc/poly.texi b/gsl-1.9/doc/poly.texi
new file mode 100644
index 0000000..531f77a
--- /dev/null
+++ b/gsl-1.9/doc/poly.texi
@@ -0,0 +1,302 @@
+@cindex polynomials, roots of
+
+This chapter describes functions for evaluating and solving polynomials.
+There are routines for finding real and complex roots of quadratic and
+cubic equations using analytic methods. An iterative polynomial solver
+is also available for finding the roots of general polynomials with real
+coefficients (of any order). The functions are declared in the header
+file @code{gsl_poly.h}.
+
+@menu
+* Polynomial Evaluation::
+* Divided Difference Representation of Polynomials::
+* Quadratic Equations::
+* Cubic Equations::
+* General Polynomial Equations::
+* Roots of Polynomials Examples::
+* Roots of Polynomials References and Further Reading::
+@end menu
+
+@node Polynomial Evaluation
+@section Polynomial Evaluation
+@cindex polynomial evaluation
+@cindex evaluation of polynomials
+
+@deftypefun double gsl_poly_eval (const double @var{c}[], const int @var{len}, const double @var{x})
+This function evaluates the polynomial
+@c{$c[0] + c[1] x + c[2] x^2 + \dots + c[len-1] x^{len-1}$}
+@math{c[0] + c[1] x + c[2] x^2 + \dots + c[len-1] x^@{len-1@}} using
+Horner's method for stability. The function is inlined when possible.
+@end deftypefun
+
+@node Divided Difference Representation of Polynomials
+@section Divided Difference Representation of Polynomials
+@cindex divided differences, polynomials
+@cindex evaluation of polynomials, in divided difference form
+
+The functions described here manipulate polynomials stored in Newton's
+divided-difference representation. The use of divided-differences is
+described in Abramowitz & Stegun sections 25.1.4 and 25.2.26.
+
+@deftypefun int gsl_poly_dd_init (double @var{dd}[], const double @var{xa}[], const double @var{ya}[], size_t @var{size})
+This function computes a divided-difference representation of the
+interpolating polynomial for the points (@var{xa}, @var{ya}) stored in
+the arrays @var{xa} and @var{ya} of length @var{size}. On output the
+divided-differences of (@var{xa},@var{ya}) are stored in the array
+@var{dd}, also of length @var{size}.
+@end deftypefun
+
+@deftypefun double gsl_poly_dd_eval (const double @var{dd}[], const double @var{xa}[], const size_t @var{size}, const double @var{x})
+This function evaluates the polynomial stored in divided-difference form
+in the arrays @var{dd} and @var{xa} of length @var{size} at the point
+@var{x}.
+@end deftypefun
+
+@deftypefun int gsl_poly_dd_taylor (double @var{c}[], double @var{xp}, const double @var{dd}[], const double @var{xa}[], size_t @var{size}, double @var{w}[])
+This function converts the divided-difference representation of a
+polynomial to a Taylor expansion. The divided-difference representation
+is supplied in the arrays @var{dd} and @var{xa} of length @var{size}.
+On output the Taylor coefficients of the polynomial expanded about the
+point @var{xp} are stored in the array @var{c} also of length
+@var{size}. A workspace of length @var{size} must be provided in the
+array @var{w}.
+@end deftypefun
+
+@node Quadratic Equations
+@section Quadratic Equations
+@cindex quadratic equation, solving
+
+@deftypefun int gsl_poly_solve_quadratic (double @var{a}, double @var{b}, double @var{c}, double * @var{x0}, double * @var{x1})
+This function finds the real roots of the quadratic equation,
+@tex
+\beforedisplay
+$$
+a x^2 + b x + c = 0
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+a x^2 + b x + c = 0
+@end example
+
+@end ifinfo
+@noindent
+The number of real roots (either zero, one or two) is returned, and
+their locations are stored in @var{x0} and @var{x1}. If no real roots
+are found then @var{x0} and @var{x1} are not modified. If one real root
+is found (i.e. if @math{a=0}) then it is stored in @var{x0}. When two
+real roots are found they are stored in @var{x0} and @var{x1} in
+ascending order. The case of coincident roots is not considered
+special. For example @math{(x-1)^2=0} will have two roots, which happen
+to have exactly equal values.
+
+The number of roots found depends on the sign of the discriminant
+@math{b^2 - 4 a c}. This will be subject to rounding and cancellation
+errors when computed in double precision, and will also be subject to
+errors if the coefficients of the polynomial are inexact. These errors
+may cause a discrete change in the number of roots. However, for
+polynomials with small integer coefficients the discriminant can always
+be computed exactly.
+
+@end deftypefun
+
+@deftypefun int gsl_poly_complex_solve_quadratic (double @var{a}, double @var{b}, double @var{c}, gsl_complex * @var{z0}, gsl_complex * @var{z1})
+
+This function finds the complex roots of the quadratic equation,
+@tex
+\beforedisplay
+$$
+a z^2 + b z + c = 0
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+a z^2 + b z + c = 0
+@end example
+
+@end ifinfo
+@noindent
+The number of complex roots is returned (either one or two) and the
+locations of the roots are stored in @var{z0} and @var{z1}. The roots
+are returned in ascending order, sorted first by their real components
+and then by their imaginary components. If only one real root is found
+(i.e. if @math{a=0}) then it is stored in @var{z0}.
+
+@end deftypefun
+
+
+@node Cubic Equations
+@section Cubic Equations
+@cindex cubic equation, solving
+
+@deftypefun int gsl_poly_solve_cubic (double @var{a}, double @var{b}, double @var{c}, double * @var{x0}, double * @var{x1}, double * @var{x2})
+
+This function finds the real roots of the cubic equation,
+@tex
+\beforedisplay
+$$
+x^3 + a x^2 + b x + c = 0
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+x^3 + a x^2 + b x + c = 0
+@end example
+
+@end ifinfo
+@noindent
+with a leading coefficient of unity. The number of real roots (either
+one or three) is returned, and their locations are stored in @var{x0},
+@var{x1} and @var{x2}. If one real root is found then only @var{x0} is
+modified. When three real roots are found they are stored in @var{x0},
+@var{x1} and @var{x2} in ascending order. The case of coincident roots
+is not considered special. For example, the equation @math{(x-1)^3=0}
+will have three roots with exactly equal values.
+
+@end deftypefun
+
+@deftypefun int gsl_poly_complex_solve_cubic (double @var{a}, double @var{b}, double @var{c}, gsl_complex * @var{z0}, gsl_complex * @var{z1}, gsl_complex * @var{z2})
+
+This function finds the complex roots of the cubic equation,
+@tex
+\beforedisplay
+$$
+z^3 + a z^2 + b z + c = 0
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+z^3 + a z^2 + b z + c = 0
+@end example
+
+@end ifinfo
+@noindent
+The number of complex roots is returned (always three) and the locations
+of the roots are stored in @var{z0}, @var{z1} and @var{z2}. The roots
+are returned in ascending order, sorted first by their real components
+and then by their imaginary components.
+
+@end deftypefun
+
+
+@node General Polynomial Equations
+@section General Polynomial Equations
+@cindex general polynomial equations, solving
+
+The roots of polynomial equations cannot be found analytically beyond
+the special cases of the quadratic, cubic and quartic equation. The
+algorithm described in this section uses an iterative method to find the
+approximate locations of roots of higher order polynomials.
+
+@deftypefun {gsl_poly_complex_workspace *} gsl_poly_complex_workspace_alloc (size_t @var{n})
+This function allocates space for a @code{gsl_poly_complex_workspace}
+struct and a workspace suitable for solving a polynomial with @var{n}
+coefficients using the routine @code{gsl_poly_complex_solve}.
+
+The function returns a pointer to the newly allocated
+@code{gsl_poly_complex_workspace} if no errors were detected, and a null
+pointer in the case of error.
+@end deftypefun
+
+@deftypefun void gsl_poly_complex_workspace_free (gsl_poly_complex_workspace * @var{w})
+This function frees all the memory associated with the workspace
+@var{w}.
+@end deftypefun
+
+@deftypefun int gsl_poly_complex_solve (const double * @var{a}, size_t @var{n}, gsl_poly_complex_workspace * @var{w}, gsl_complex_packed_ptr @var{z})
+This function computes the roots of the general polynomial
+@c{$P(x) = a_0 + a_1 x + a_2 x^2 + ... + a_{n-1} x^{n-1}$}
+@math{P(x) = a_0 + a_1 x + a_2 x^2 + ... + a_@{n-1@} x^@{n-1@}} using
+balanced-QR reduction of the companion matrix. The parameter @var{n}
+specifies the length of the coefficient array. The coefficient of the
+highest order term must be non-zero. The function requires a workspace
+@var{w} of the appropriate size. The @math{n-1} roots are returned in
+the packed complex array @var{z} of length @math{2(n-1)}, alternating
+real and imaginary parts.
+
+The function returns @code{GSL_SUCCESS} if all the roots are found. If
+the QR reduction does not converge, the error handler is invoked with
+an error code of @code{GSL_EFAILED}. Note that due to finite precision,
+roots of higher multiplicity are returned as a cluster of simple roots
+with reduced accuracy. The solution of polynomials with higher-order
+roots requires specialized algorithms that take the multiplicity
+structure into account (see e.g. Z. Zeng, Algorithm 835, ACM
+Transactions on Mathematical Software, Volume 30, Issue 2 (2004), pp
+218--236).
+@end deftypefun
+
+@node Roots of Polynomials Examples
+@section Examples
+
+To demonstrate the use of the general polynomial solver we will take the
+polynomial @math{P(x) = x^5 - 1} which has the following roots,
+@tex
+\beforedisplay
+$$
+1, e^{2\pi i /5}, e^{4\pi i /5}, e^{6\pi i /5}, e^{8\pi i /5}
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+1, e^@{2\pi i /5@}, e^@{4\pi i /5@}, e^@{6\pi i /5@}, e^@{8\pi i /5@}
+@end example
+
+@end ifinfo
+@noindent
+The following program will find these roots.
+
+@example
+@verbatiminclude examples/polyroots.c
+@end example
+
+@noindent
+The output of the program is,
+
+@example
+$ ./a.out
+@verbatiminclude examples/polyroots.out
+@end example
+
+@noindent
+which agrees with the analytic result, @math{z_n = \exp(2 \pi n i/5)}.
+
+@node Roots of Polynomials References and Further Reading
+@section References and Further Reading
+
+The balanced-QR method and its error analysis are described in the
+following papers,
+
+@itemize @asis
+@item
+R.S. Martin, G. Peters and J.H. Wilkinson, ``The QR Algorithm for Real
+Hessenberg Matrices'', @cite{Numerische Mathematik}, 14 (1970), 219--231.
+
+@item
+B.N. Parlett and C. Reinsch, ``Balancing a Matrix for Calculation of
+Eigenvalues and Eigenvectors'', @cite{Numerische Mathematik}, 13 (1969),
+293--304.
+
+@item
+A. Edelman and H. Murakami, ``Polynomial roots from companion matrix
+eigenvalues'', @cite{Mathematics of Computation}, Vol.@: 64, No.@: 210
+(1995), 763--776.
+@end itemize
+
+@noindent
+The formulas for divided differences are given in Abramowitz and Stegun,
+
+@itemize @asis
+@item
+Abramowitz and Stegun, @cite{Handbook of Mathematical Functions},
+Sections 25.1.4 and 25.2.26.
+@end itemize