summaryrefslogtreecommitdiff
path: root/gsl-1.9/doc/sum.texi
diff options
context:
space:
mode:
Diffstat (limited to 'gsl-1.9/doc/sum.texi')
-rw-r--r--gsl-1.9/doc/sum.texi186
1 files changed, 186 insertions, 0 deletions
diff --git a/gsl-1.9/doc/sum.texi b/gsl-1.9/doc/sum.texi
new file mode 100644
index 0000000..9b11675
--- /dev/null
+++ b/gsl-1.9/doc/sum.texi
@@ -0,0 +1,186 @@
+@cindex acceleration of series
+@cindex summation, acceleration
+@cindex series, acceleration
+@cindex u-transform for series
+@cindex Levin u-transform
+@cindex convergence, accelerating a series
+
+The functions described in this chapter accelerate the convergence of a
+series using the Levin @math{u}-transform. This method takes a small number of
+terms from the start of a series and uses a systematic approximation to
+compute an extrapolated value and an estimate of its error. The
+@math{u}-transform works for both convergent and divergent series, including
+asymptotic series.
+
+These functions are declared in the header file @file{gsl_sum.h}.
+
+@menu
+* Acceleration functions::
+* Acceleration functions without error estimation::
+* Example of accelerating a series::
+* Series Acceleration References::
+@end menu
+
+@node Acceleration functions
+@section Acceleration functions
+
+The following functions compute the full Levin @math{u}-transform of a series
+with its error estimate. The error estimate is computed by propagating
+rounding errors from each term through to the final extrapolation.
+
+These functions are intended for summing analytic series where each term
+is known to high accuracy, and the rounding errors are assumed to
+originate from finite precision. They are taken to be relative errors of
+order @code{GSL_DBL_EPSILON} for each term.
+
+The calculation of the error in the extrapolated value is an
+@math{O(N^2)} process, which is expensive in time and memory. A faster
+but less reliable method which estimates the error from the convergence
+of the extrapolated value is described in the next section. For the
+method described here a full table of intermediate values and
+derivatives through to @math{O(N)} must be computed and stored, but this
+does give a reliable error estimate.
+
+@deftypefun {gsl_sum_levin_u_workspace *} gsl_sum_levin_u_alloc (size_t @var{n})
+This function allocates a workspace for a Levin @math{u}-transform of @var{n}
+terms. The size of the workspace is @math{O(2n^2 + 3n)}.
+@end deftypefun
+
+@deftypefun void gsl_sum_levin_u_free (gsl_sum_levin_u_workspace * @var{w})
+This function frees the memory associated with the workspace @var{w}.
+@end deftypefun
+
+@deftypefun int gsl_sum_levin_u_accel (const double * @var{array}, size_t @var{array_size}, gsl_sum_levin_u_workspace * @var{w}, double * @var{sum_accel}, double * @var{abserr})
+This function takes the terms of a series in @var{array} of size
+@var{array_size} and computes the extrapolated limit of the series using
+a Levin @math{u}-transform. Additional working space must be provided in
+@var{w}. The extrapolated sum is stored in @var{sum_accel}, with an
+estimate of the absolute error stored in @var{abserr}. The actual
+term-by-term sum is returned in @code{w->sum_plain}. The algorithm
+calculates the truncation error (the difference between two successive
+extrapolations) and round-off error (propagated from the individual
+terms) to choose an optimal number of terms for the extrapolation.
+All the terms of the series passed in through @var{array} should be non-zero.
+@end deftypefun
+
+
+@node Acceleration functions without error estimation
+@section Acceleration functions without error estimation
+
+The functions described in this section compute the Levin @math{u}-transform of
+series and attempt to estimate the error from the ``truncation error'' in
+the extrapolation, the difference between the final two approximations.
+Using this method avoids the need to compute an intermediate table of
+derivatives because the error is estimated from the behavior of the
+extrapolated value itself. Consequently this algorithm is an @math{O(N)}
+process and only requires @math{O(N)} terms of storage. If the series
+converges sufficiently fast then this procedure can be acceptable. It
+is appropriate to use this method when there is a need to compute many
+extrapolations of series with similar convergence properties at high-speed.
+For example, when numerically integrating a function defined by a
+parameterized series where the parameter varies only slightly. A
+reliable error estimate should be computed first using the full
+algorithm described above in order to verify the consistency of the
+results.
+
+@deftypefun {gsl_sum_levin_utrunc_workspace *} gsl_sum_levin_utrunc_alloc (size_t @var{n})
+This function allocates a workspace for a Levin @math{u}-transform of @var{n}
+terms, without error estimation. The size of the workspace is
+@math{O(3n)}.
+@end deftypefun
+
+@deftypefun void gsl_sum_levin_utrunc_free (gsl_sum_levin_utrunc_workspace * @var{w})
+This function frees the memory associated with the workspace @var{w}.
+@end deftypefun
+
+@deftypefun int gsl_sum_levin_utrunc_accel (const double * @var{array}, size_t @var{array_size}, gsl_sum_levin_utrunc_workspace * @var{w}, double * @var{sum_accel}, double * @var{abserr_trunc})
+This function takes the terms of a series in @var{array} of size
+@var{array_size} and computes the extrapolated limit of the series using
+a Levin @math{u}-transform. Additional working space must be provided in
+@var{w}. The extrapolated sum is stored in @var{sum_accel}. The actual
+term-by-term sum is returned in @code{w->sum_plain}. The algorithm
+terminates when the difference between two successive extrapolations
+reaches a minimum or is sufficiently small. The difference between these
+two values is used as estimate of the error and is stored in
+@var{abserr_trunc}. To improve the reliability of the algorithm the
+extrapolated values are replaced by moving averages when calculating the
+truncation error, smoothing out any fluctuations.
+@end deftypefun
+
+
+@node Example of accelerating a series
+@section Examples
+
+The following code calculates an estimate of @math{\zeta(2) = \pi^2 / 6}
+using the series,
+@tex
+\beforedisplay
+$$
+\zeta(2) = 1 + 1/2^2 + 1/3^2 + 1/4^2 + \dots
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+\zeta(2) = 1 + 1/2^2 + 1/3^2 + 1/4^2 + ...
+@end example
+
+@end ifinfo
+@noindent
+After @var{N} terms the error in the sum is @math{O(1/N)}, making direct
+summation of the series converge slowly.
+
+@example
+@verbatiminclude examples/sum.c
+@end example
+
+@noindent
+The output below shows that the Levin @math{u}-transform is able to obtain an
+estimate of the sum to 1 part in
+@c{$10^{10}$}
+@math{10^10} using the first eleven terms of the series. The
+error estimate returned by the function is also accurate, giving
+the correct number of significant digits.
+
+@example
+$ ./a.out
+@verbatiminclude examples/sum.out
+@end example
+
+@noindent
+Note that a direct summation of this series would require
+@c{$10^{10}$}
+@math{10^10} terms to achieve the same precision as the accelerated
+sum does in 13 terms.
+
+@node Series Acceleration References
+@section References and Further Reading
+
+The algorithms used by these functions are described in the following papers,
+
+@itemize @asis
+@item
+T. Fessler, W.F. Ford, D.A. Smith,
+@sc{hurry}: An acceleration algorithm for scalar sequences and series
+@cite{ACM Transactions on Mathematical Software}, 9(3):346--354, 1983.
+and Algorithm 602 9(3):355--357, 1983.
+@end itemize
+
+@noindent
+The theory of the @math{u}-transform was presented by Levin,
+
+@itemize @asis
+@item
+D. Levin,
+Development of Non-Linear Transformations for Improving Convergence of
+Sequences, @cite{Intern.@: J.@: Computer Math.} B3:371--388, 1973.
+@end itemize
+
+@noindent
+A review paper on the Levin Transform is available online,
+@itemize @asis
+@item
+Herbert H. H. Homeier, Scalar Levin-Type Sequence Transformations,
+@uref{http://arxiv.org/abs/math/0005209}.
+@end itemize