diff options
Diffstat (limited to 'gsl-1.9/doc/gsl-ref.info-1')
-rw-r--r-- | gsl-1.9/doc/gsl-ref.info-1 | 7392 |
1 files changed, 7392 insertions, 0 deletions
diff --git a/gsl-1.9/doc/gsl-ref.info-1 b/gsl-1.9/doc/gsl-ref.info-1 new file mode 100644 index 0000000..2d4e483 --- /dev/null +++ b/gsl-1.9/doc/gsl-ref.info-1 @@ -0,0 +1,7392 @@ +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: Top, Next: Introduction, Prev: (dir), Up: (dir) + +GSL +*** + +This file documents the GNU Scientific Library (GSL), a collection of +numerical routines for scientific computing. It corresponds to release +1.9 of the library. Please report any errors in this manual to +<bug-gsl@gnu.org>. + + More information about GSL can be found at the project homepage, +`http://www.gnu.org/software/gsl/'. + + Printed copies of this manual can be purchased from Network Theory +Ltd at `http://www.network-theory.co.uk/gsl/manual/'. The money raised +from sales of the manual helps support the development of GSL. + + A Japanese translation of this manual is available from the GSL +project homepage thanks to Daisuke Tominaga. + + 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." + + +* Menu: + +* Introduction:: +* Using the library:: +* Error Handling:: +* Mathematical Functions:: +* Complex Numbers:: +* Polynomials:: +* Special Functions:: +* Vectors and Matrices:: +* Permutations:: +* Combinations:: +* Sorting:: +* BLAS Support:: +* Linear Algebra:: +* Eigensystems:: +* Fast Fourier Transforms:: +* Numerical Integration:: +* Random Number Generation:: +* Quasi-Random Sequences:: +* Random Number Distributions:: +* Statistics:: +* Histograms:: +* N-tuples:: +* Monte Carlo Integration:: +* Simulated Annealing:: +* Ordinary Differential Equations:: +* Interpolation:: +* Numerical Differentiation:: +* Chebyshev Approximations:: +* Series Acceleration:: +* Wavelet Transforms:: +* Discrete Hankel Transforms:: +* One dimensional Root-Finding:: +* One dimensional Minimization:: +* Multidimensional Root-Finding:: +* Multidimensional Minimization:: +* Least-Squares Fitting:: +* Nonlinear Least-Squares Fitting:: +* Basis Splines:: +* Physical Constants:: +* IEEE floating-point arithmetic:: +* Debugging Numerical Programs:: +* Contributors to GSL:: +* Autoconf Macros:: +* GSL CBLAS Library:: +* Free Software Needs Free Documentation:: +* GNU General Public License:: +* GNU Free Documentation License:: +* Function Index:: +* Variable Index:: +* Type Index:: +* Concept Index:: + + +File: gsl-ref.info, Node: Introduction, Next: Using the library, Prev: Top, Up: Top + +1 Introduction +************** + +The GNU Scientific Library (GSL) is a collection of routines for +numerical computing. The routines have been written from scratch in C, +and present a modern Applications Programming Interface (API) for C +programmers, allowing wrappers to be written for very high level +languages. The source code is distributed under the GNU General Public +License. + +* Menu: + +* Routines available in GSL:: +* GSL is Free Software:: +* Obtaining GSL:: +* No Warranty:: +* Reporting Bugs:: +* Further Information:: +* Conventions used in this manual:: + + +File: gsl-ref.info, Node: Routines available in GSL, Next: GSL is Free Software, Up: Introduction + +1.1 Routines available in GSL +============================= + +The library covers a wide range of topics in numerical computing. +Routines are available for the following areas, + + Complex Numbers Roots of Polynomials + Special Functions Vectors and Matrices + Permutations Combinations + Sorting BLAS Support + Linear Algebra CBLAS Library + Fast Fourier Transforms Eigensystems + Random Numbers Quadrature + Random Distributions Quasi-Random Sequences + Histograms Statistics + Monte Carlo Integration N-Tuples + Differential Equations Simulated Annealing + Numerical Differentiation Interpolation + Series Acceleration Chebyshev Approximations + Root-Finding Discrete Hankel Transforms + Least-Squares Fitting Minimization + IEEE Floating-Point Physical Constants + Wavelets + +The use of these routines is described in this manual. Each chapter +provides detailed definitions of the functions, followed by example +programs and references to the articles on which the algorithms are +based. + + Where possible the routines have been based on reliable public-domain +packages such as FFTPACK and QUADPACK, which the developers of GSL have +reimplemented in C with modern coding conventions. + + +File: gsl-ref.info, Node: GSL is Free Software, Next: Obtaining GSL, Prev: Routines available in GSL, Up: Introduction + +1.2 GSL is Free Software +======================== + +The subroutines in the GNU Scientific Library are "free software"; this +means that everyone is free to use them, and to redistribute them in +other free programs. The library is not in the public domain; it is +copyrighted and there are conditions on its distribution. These +conditions are designed to permit everything that a good cooperating +citizen would want to do. What is not allowed is to try to prevent +others from further sharing any version of the software that they might +get from you. + + Specifically, we want to make sure that you have the right to share +copies of programs that you are given which use the GNU Scientific +Library, that you receive their source code or else can get it if you +want it, that you can change these programs or use pieces of them in new +free programs, and that you know you can do these things. + + To make sure that everyone has such rights, we have to forbid you to +deprive anyone else of these rights. For example, if you distribute +copies of any code which uses the GNU Scientific Library, you must give +the recipients all the rights that you have received. You must make +sure that they, too, receive or can get the source code, both to the +library and the code which uses it. And you must tell them their +rights. This means that the library should not be redistributed in +proprietary programs. + + Also, for our own protection, we must make certain that everyone +finds out that there is no warranty for the GNU Scientific Library. If +these programs are modified by someone else and passed on, we want their +recipients to know that what they have is not what we distributed, so +that any problems introduced by others will not reflect on our +reputation. + + The precise conditions for the distribution of software related to +the GNU Scientific Library are found in the GNU General Public License +(*note GNU General Public License::). Further information about this +license is available from the GNU Project webpage `Frequently Asked +Questions about the GNU GPL', + + `http://www.gnu.org/copyleft/gpl-faq.html' + +The Free Software Foundation also operates a license consulting service +for commercial users (contact details available from +`http://www.fsf.org/'). + + +File: gsl-ref.info, Node: Obtaining GSL, Next: No Warranty, Prev: GSL is Free Software, Up: Introduction + +1.3 Obtaining GSL +================= + +The source code for the library can be obtained in different ways, by +copying it from a friend, purchasing it on CDROM or downloading it from +the internet. A list of public ftp servers which carry the source code +can be found on the GNU website, + + `http://www.gnu.org/software/gsl/' + +The preferred platform for the library is a GNU system, which allows it +to take advantage of additional features in the GNU C compiler and GNU C +library. However, the library is fully portable and should compile on +most systems with a C compiler. Precompiled versions of the library +can be purchased from commercial redistributors listed on the website +above. + + Announcements of new releases, updates and other relevant events are +made on the `info-gsl@gnu.org' mailing list. To subscribe to this +low-volume list, send an email of the following form: + + To: info-gsl-request@gnu.org + Subject: subscribe + +You will receive a response asking you to reply in order to confirm +your subscription. + + +File: gsl-ref.info, Node: No Warranty, Next: Reporting Bugs, Prev: Obtaining GSL, Up: Introduction + +1.4 No Warranty +=============== + +The software described in this manual has no warranty, it is provided +"as is". It is your responsibility to validate the behavior of the +routines and their accuracy using the source code provided, or to +purchase support and warranties from commercial redistributors. Consult +the GNU General Public license for further details (*note GNU General +Public License::). + + +File: gsl-ref.info, Node: Reporting Bugs, Next: Further Information, Prev: No Warranty, Up: Introduction + +1.5 Reporting Bugs +================== + +A list of known bugs can be found in the `BUGS' file included in the +GSL distribution. Details of compilation problems can be found in the +`INSTALL' file. + + If you find a bug which is not listed in these files, please report +it to <bug-gsl@gnu.org>. + + All bug reports should include: + + * The version number of GSL + + * The hardware and operating system + + * The compiler used, including version number and compilation options + + * A description of the bug behavior + + * A short program which exercises the bug + +It is useful if you can check whether the same problem occurs when the +library is compiled without optimization. Thank you. + + Any errors or omissions in this manual can also be reported to the +same address. + + +File: gsl-ref.info, Node: Further Information, Next: Conventions used in this manual, Prev: Reporting Bugs, Up: Introduction + +1.6 Further Information +======================= + +Additional information, including online copies of this manual, links to +related projects, and mailing list archives are available from the +website mentioned above. + + Any questions about the use and installation of the library can be +asked on the mailing list `help-gsl@gnu.org'. To subscribe to this +list, send an email of the following form: + + To: help-gsl-request@gnu.org + Subject: subscribe + +This mailing list can be used to ask questions not covered by this +manual, and to contact the developers of the library. + + If you would like to refer to the GNU Scientific Library in a journal +article, the recommended way is to cite this reference manual, e.g. `M. +Galassi et al, GNU Scientific Library Reference Manual (2nd Ed.), ISBN +0954161734'. + + If you want to give a url, use "`http://www.gnu.org/software/gsl/'". + + +File: gsl-ref.info, Node: Conventions used in this manual, Prev: Further Information, Up: Introduction + +1.7 Conventions used in this manual +=================================== + +This manual contains many examples which can be typed at the keyboard. +A command entered at the terminal is shown like this, + + $ command + +The first character on the line is the terminal prompt, and should not +be typed. The dollar sign `$' is used as the standard prompt in this +manual, although some systems may use a different character. + + The examples assume the use of the GNU operating system. There may +be minor differences in the output on other systems. The commands for +setting environment variables use the Bourne shell syntax of the +standard GNU shell (`bash'). + + +File: gsl-ref.info, Node: Using the library, Next: Error Handling, Prev: Introduction, Up: Top + +2 Using the library +******************* + +This chapter describes how to compile programs that use GSL, and +introduces its conventions. + +* Menu: + +* An Example Program:: +* Compiling and Linking:: +* Shared Libraries:: +* ANSI C Compliance:: +* Inline functions:: +* Long double:: +* Portability functions:: +* Alternative optimized functions:: +* Support for different numeric types:: +* Compatibility with C++:: +* Aliasing of arrays:: +* Thread-safety:: +* Deprecated Functions:: +* Code Reuse:: + + +File: gsl-ref.info, Node: An Example Program, Next: Compiling and Linking, Up: Using the library + +2.1 An Example Program +====================== + +The following short program demonstrates the use of the library by +computing the value of the Bessel function J_0(x) for x=5, + + #include <stdio.h> + #include <gsl/gsl_sf_bessel.h> + + int + main (void) + { + double x = 5.0; + double y = gsl_sf_bessel_J0 (x); + printf ("J0(%g) = %.18e\n", x, y); + return 0; + } + +The output is shown below, and should be correct to double-precision +accuracy, + + J0(5) = -1.775967713143382920e-01 + +The steps needed to compile this program are described in the following +sections. + + +File: gsl-ref.info, Node: Compiling and Linking, Next: Shared Libraries, Prev: An Example Program, Up: Using the library + +2.2 Compiling and Linking +========================= + +The library header files are installed in their own `gsl' directory. +You should write any preprocessor include statements with a `gsl/' +directory prefix thus, + + #include <gsl/gsl_math.h> + +If the directory is not installed on the standard search path of your +compiler you will also need to provide its location to the preprocessor +as a command line flag. The default location of the `gsl' directory is +`/usr/local/include/gsl'. A typical compilation command for a source +file `example.c' with the GNU C compiler `gcc' is, + + $ gcc -Wall -I/usr/local/include -c example.c + +This results in an object file `example.o'. The default include path +for `gcc' searches `/usr/local/include' automatically so the `-I' +option can actually be omitted when GSL is installed in its default +location. + +* Menu: + +* Linking programs with the library:: +* Linking with an alternative BLAS library:: + + +File: gsl-ref.info, Node: Linking programs with the library, Next: Linking with an alternative BLAS library, Up: Compiling and Linking + +2.2.1 Linking programs with the library +--------------------------------------- + +The library is installed as a single file, `libgsl.a'. A shared +version of the library `libgsl.so' is also installed on systems that +support shared libraries. The default location of these files is +`/usr/local/lib'. If this directory is not on the standard search path +of your linker you will also need to provide its location as a command +line flag. + + To link against the library you need to specify both the main +library and a supporting CBLAS library, which provides standard basic +linear algebra subroutines. A suitable CBLAS implementation is +provided in the library `libgslcblas.a' if your system does not provide +one. The following example shows how to link an application with the +library, + + $ gcc -L/usr/local/lib example.o -lgsl -lgslcblas -lm + +The default library path for `gcc' searches `/usr/local/lib' +automatically so the `-L' option can be omitted when GSL is installed +in its default location. + + +File: gsl-ref.info, Node: Linking with an alternative BLAS library, Prev: Linking programs with the library, Up: Compiling and Linking + +2.2.2 Linking with an alternative BLAS library +---------------------------------------------- + +The following command line shows how you would link the same application +with an alternative CBLAS library called `libcblas', + + $ gcc example.o -lgsl -lcblas -lm + +For the best performance an optimized platform-specific CBLAS library +should be used for `-lcblas'. The library must conform to the CBLAS +standard. The ATLAS package provides a portable high-performance BLAS +library with a CBLAS interface. It is free software and should be +installed for any work requiring fast vector and matrix operations. +The following command line will link with the ATLAS library and its +CBLAS interface, + + $ gcc example.o -lgsl -lcblas -latlas -lm + +For more information see *Note BLAS Support::. + + +File: gsl-ref.info, Node: Shared Libraries, Next: ANSI C Compliance, Prev: Compiling and Linking, Up: Using the library + +2.3 Shared Libraries +==================== + +To run a program linked with the shared version of the library the +operating system must be able to locate the corresponding `.so' file at +runtime. If the library cannot be found, the following error will +occur: + + $ ./a.out + ./a.out: error while loading shared libraries: + libgsl.so.0: cannot open shared object file: No such + file or directory + +To avoid this error, define the shell variable `LD_LIBRARY_PATH' to +include the directory where the library is installed. + + For example, in the Bourne shell (`/bin/sh' or `/bin/bash'), the +library search path can be set with the following commands: + + $ LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH + $ export LD_LIBRARY_PATH + $ ./example + +In the C-shell (`/bin/csh' or `/bin/tcsh') the equivalent command is, + + % setenv LD_LIBRARY_PATH /usr/local/lib:$LD_LIBRARY_PATH + +The standard prompt for the C-shell in the example above is the percent +character `%', and should not be typed as part of the command. + + To save retyping these commands each session they should be placed +in an individual or system-wide login file. + + To compile a statically linked version of the program, use the +`-static' flag in `gcc', + + $ gcc -static example.o -lgsl -lgslcblas -lm + + +File: gsl-ref.info, Node: ANSI C Compliance, Next: Inline functions, Prev: Shared Libraries, Up: Using the library + +2.4 ANSI C Compliance +===================== + +The library is written in ANSI C and is intended to conform to the ANSI +C standard (C89). It should be portable to any system with a working +ANSI C compiler. + + The library does not rely on any non-ANSI extensions in the +interface it exports to the user. Programs you write using GSL can be +ANSI compliant. Extensions which can be used in a way compatible with +pure ANSI C are supported, however, via conditional compilation. This +allows the library to take advantage of compiler extensions on those +platforms which support them. + + When an ANSI C feature is known to be broken on a particular system +the library will exclude any related functions at compile-time. This +should make it impossible to link a program that would use these +functions and give incorrect results. + + To avoid namespace conflicts all exported function names and +variables have the prefix `gsl_', while exported macros have the prefix +`GSL_'. + + +File: gsl-ref.info, Node: Inline functions, Next: Long double, Prev: ANSI C Compliance, Up: Using the library + +2.5 Inline functions +==================== + +The `inline' keyword is not part of the original ANSI C standard (C89) +and the library does not export any inline function definitions by +default. However, the library provides optional inline versions of +performance-critical functions by conditional compilation. The inline +versions of these functions can be included by defining the macro +`HAVE_INLINE' when compiling an application, + + $ gcc -Wall -c -DHAVE_INLINE example.c + +If you use `autoconf' this macro can be defined automatically. If you +do not define the macro `HAVE_INLINE' then the slower non-inlined +versions of the functions will be used instead. + + Note that the actual usage of the inline keyword is `extern inline', +which eliminates unnecessary function definitions in GCC. If the form +`extern inline' causes problems with other compilers a stricter +autoconf test can be used, see *Note Autoconf Macros::. + + +File: gsl-ref.info, Node: Long double, Next: Portability functions, Prev: Inline functions, Up: Using the library + +2.6 Long double +=============== + +The extended numerical type `long double' is part of the ANSI C +standard and should be available in every modern compiler. However, the +precision of `long double' is platform dependent, and this should be +considered when using it. The IEEE standard only specifies the minimum +precision of extended precision numbers, while the precision of +`double' is the same on all platforms. + + In some system libraries the `stdio.h' formatted input/output +functions `printf' and `scanf' are not implemented correctly for `long +double'. Undefined or incorrect results are avoided by testing these +functions during the `configure' stage of library compilation and +eliminating certain GSL functions which depend on them if necessary. +The corresponding line in the `configure' output looks like this, + + checking whether printf works with long double... no + +Consequently when `long double' formatted input/output does not work on +a given system it should be impossible to link a program which uses GSL +functions dependent on this. + + If it is necessary to work on a system which does not support +formatted `long double' input/output then the options are to use binary +formats or to convert `long double' results into `double' for reading +and writing. + + +File: gsl-ref.info, Node: Portability functions, Next: Alternative optimized functions, Prev: Long double, Up: Using the library + +2.7 Portability functions +========================= + +To help in writing portable applications GSL provides some +implementations of functions that are found in other libraries, such as +the BSD math library. You can write your application to use the native +versions of these functions, and substitute the GSL versions via a +preprocessor macro if they are unavailable on another platform. + + For example, after determining whether the BSD function `hypot' is +available you can include the following macro definitions in a file +`config.h' with your application, + + /* 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 replace each occurrence of `hypot' by `gsl_hypot' when +`hypot' is not available. This substitution can be made automatically +if you use `autoconf', see *Note Autoconf Macros::. + + In most circumstances the best strategy is to use the native +versions of these functions when available, and fall back to GSL +versions otherwise, since this allows your application to take +advantage of any platform-specific optimizations in the system library. +This is the strategy used within GSL itself. + + +File: gsl-ref.info, Node: Alternative optimized functions, Next: Support for different numeric types, Prev: Portability functions, Up: Using the library + +2.8 Alternative optimized functions +=================================== + +The main implementation of some functions in the library will not be +optimal on all architectures. For example, there are several ways to +compute a Gaussian random variate and their relative speeds are +platform-dependent. In cases like this the library provides alternative +implementations of these functions with the same interface. If you +write your application using calls to the standard implementation you +can select an alternative version later via a preprocessor definition. +It is also possible to introduce your own optimized functions this way +while retaining portability. The following lines demonstrate the use of +a platform-dependent choice of methods for sampling from the Gaussian +distribution, + + #ifdef SPARC + #define gsl_ran_gaussian gsl_ran_gaussian_ratio_method + #endif + #ifdef INTEL + #define gsl_ran_gaussian my_gaussian + #endif + +These lines would be placed in the configuration header file `config.h' +of the application, which should then be included by all the source +files. Note that the alternative implementations will not produce +bit-for-bit identical results, and in the case of random number +distributions will produce an entirely different stream of random +variates. + + +File: gsl-ref.info, Node: Support for different numeric types, Next: Compatibility with C++, Prev: Alternative optimized functions, Up: Using the library + +2.9 Support for different numeric types +======================================= + +Many functions in the library are defined for different numeric types. +This feature is implemented by varying the name of the function with a +type-related modifier--a primitive form of C++ templates. The modifier +is inserted into the function name after the initial module prefix. +The following table shows the function names defined for all the +numeric types of an imaginary module `gsl_foo' with function `fn', + + gsl_foo_fn double + gsl_foo_long_double_fn long double + gsl_foo_float_fn float + gsl_foo_long_fn long + gsl_foo_ulong_fn unsigned long + gsl_foo_int_fn int + gsl_foo_uint_fn unsigned int + gsl_foo_short_fn short + gsl_foo_ushort_fn unsigned short + gsl_foo_char_fn char + gsl_foo_uchar_fn unsigned char + +The normal numeric precision `double' is considered the default and +does not require a suffix. For example, the function `gsl_stats_mean' +computes the mean of double precision numbers, while the function +`gsl_stats_int_mean' computes the mean of integers. + + A corresponding scheme is used for library defined types, such as +`gsl_vector' and `gsl_matrix'. In this case the modifier is appended +to the type name. For example, if a module defines a new +type-dependent struct or typedef `gsl_foo' it is modified for other +types in the following way, + + gsl_foo double + gsl_foo_long_double long double + gsl_foo_float float + gsl_foo_long long + gsl_foo_ulong unsigned long + gsl_foo_int int + gsl_foo_uint unsigned int + gsl_foo_short short + gsl_foo_ushort unsigned short + gsl_foo_char char + gsl_foo_uchar unsigned char + +When a module contains type-dependent definitions the library provides +individual header files for each type. The filenames are modified as +shown in the below. For convenience the default header includes the +definitions for all the types. To include only the double precision +header file, or any other specific type, use its individual filename. + + #include <gsl/gsl_foo.h> All types + #include <gsl/gsl_foo_double.h> double + #include <gsl/gsl_foo_long_double.h> long double + #include <gsl/gsl_foo_float.h> float + #include <gsl/gsl_foo_long.h> long + #include <gsl/gsl_foo_ulong.h> unsigned long + #include <gsl/gsl_foo_int.h> int + #include <gsl/gsl_foo_uint.h> unsigned int + #include <gsl/gsl_foo_short.h> short + #include <gsl/gsl_foo_ushort.h> unsigned short + #include <gsl/gsl_foo_char.h> char + #include <gsl/gsl_foo_uchar.h> unsigned char + + +File: gsl-ref.info, Node: Compatibility with C++, Next: Aliasing of arrays, Prev: Support for different numeric types, Up: Using the library + +2.10 Compatibility with C++ +=========================== + +The library header files automatically define functions to have `extern +"C"' linkage when included in C++ programs. This allows the functions +to be called directly from C++. + + To use C++ exception handling within user-defined functions passed to +the library as parameters, the library must be built with the +additional `CFLAGS' compilation option `-fexceptions'. + + +File: gsl-ref.info, Node: Aliasing of arrays, Next: Thread-safety, Prev: Compatibility with C++, Up: Using the library + +2.11 Aliasing of arrays +======================= + +The library assumes that arrays, vectors and matrices passed as +modifiable arguments are not aliased and do not overlap with each other. +This removes the need for the library to handle overlapping memory +regions as a special case, and allows additional optimizations to be +used. If overlapping memory regions are passed as modifiable arguments +then the results of such functions will be undefined. If the arguments +will not be modified (for example, if a function prototype declares them +as `const' arguments) then overlapping or aliased memory regions can be +safely used. + + +File: gsl-ref.info, Node: Thread-safety, Next: Deprecated Functions, Prev: Aliasing of arrays, Up: Using the library + +2.12 Thread-safety +================== + +The library can be used in multi-threaded programs. All the functions +are thread-safe, in the sense that they do not use static variables. +Memory is always associated with objects and not with functions. For +functions which use "workspace" objects as temporary storage the +workspaces should be allocated on a per-thread basis. For functions +which use "table" objects as read-only memory the tables can be used by +multiple threads simultaneously. Table arguments are always declared +`const' in function prototypes, to indicate that they may be safely +accessed by different threads. + + There are a small number of static global variables which are used to +control the overall behavior of the library (e.g. whether to use +range-checking, the function to call on fatal error, etc). These +variables are set directly by the user, so they should be initialized +once at program startup and not modified by different threads. + + +File: gsl-ref.info, Node: Deprecated Functions, Next: Code Reuse, Prev: Thread-safety, Up: Using the library + +2.13 Deprecated Functions +========================= + +From time to time, it may be necessary for the definitions of some +functions to be altered or removed from the library. In these +circumstances the functions will first be declared "deprecated" and +then removed from subsequent versions of the library. Functions that +are deprecated can be disabled in the current release by setting the +preprocessor definition `GSL_DISABLE_DEPRECATED'. This allows existing +code to be tested for forwards compatibility. + + +File: gsl-ref.info, Node: Code Reuse, Prev: Deprecated Functions, Up: Using the library + +2.14 Code Reuse +=============== + +Where possible the routines in the library have been written to avoid +dependencies between modules and files. This should make it possible to +extract individual functions for use in your own applications, without +needing to have the whole library installed. You may need to define +certain macros such as `GSL_ERROR' and remove some `#include' +statements in order to compile the files as standalone units. Reuse of +the library code in this way is encouraged, subject to the terms of the +GNU General Public License. + + +File: gsl-ref.info, Node: Error Handling, Next: Mathematical Functions, Prev: Using the library, Up: Top + +3 Error Handling +**************** + +This chapter describes the way that GSL functions report and handle +errors. By examining the status information returned by every function +you can determine whether it succeeded or failed, and if it failed you +can find out what the precise cause of failure was. You can also define +your own error handling functions to modify the default behavior of the +library. + + The functions described in this section are declared in the header +file `gsl_errno.h'. + +* Menu: + +* Error Reporting:: +* Error Codes:: +* Error Handlers:: +* Using GSL error reporting in your own functions:: +* Error Reporting Examples:: + + +File: gsl-ref.info, Node: Error Reporting, Next: Error Codes, Up: Error Handling + +3.1 Error Reporting +=================== + +The library follows the thread-safe error reporting conventions of the +POSIX Threads library. Functions return a non-zero error code to +indicate an error and `0' to indicate success. + + int status = gsl_function (...) + + if (status) { /* an error occurred */ + ..... + /* status value specifies the type of error */ + } + + The routines report an error whenever they cannot perform the task +requested of them. For example, a root-finding function would return a +non-zero error code if could not converge to the requested accuracy, or +exceeded a limit on the number of iterations. Situations like this are +a normal occurrence when using any mathematical library and you should +check the return status of the functions that you call. + + Whenever a routine reports an error the return value specifies the +type of error. The return value is analogous to the value of the +variable `errno' in the C library. The caller can examine the return +code and decide what action to take, including ignoring the error if it +is not considered serious. + + In addition to reporting errors by return codes the library also has +an error handler function `gsl_error'. This function is called by +other library functions when they report an error, just before they +return to the caller. The default behavior of the error handler is to +print a message and abort the program, + + gsl: file.c:67: ERROR: invalid argument supplied by user + Default GSL error handler invoked. + Aborted + + The purpose of the `gsl_error' handler is to provide a function +where a breakpoint can be set that will catch library errors when +running under the debugger. It is not intended for use in production +programs, which should handle any errors using the return codes. + + +File: gsl-ref.info, Node: Error Codes, Next: Error Handlers, Prev: Error Reporting, Up: Error Handling + +3.2 Error Codes +=============== + +The error code numbers returned by library functions are defined in the +file `gsl_errno.h'. They all have the prefix `GSL_' and expand to +non-zero constant integer values. Error codes above 1024 are reserved +for applications, and are not used by the library. Many of the error +codes use the same base name as the corresponding error code in the C +library. Here are some of the most common error codes, + + -- Macro: int GSL_EDOM + Domain error; used by mathematical functions when an argument + value does not fall into the domain over which the function is + defined (like EDOM in the C library) + + -- Macro: int GSL_ERANGE + Range error; used by mathematical functions when the result value + is not representable because of overflow or underflow (like ERANGE + in the C library) + + -- Macro: int GSL_ENOMEM + No memory available. The system cannot allocate more virtual + memory because its capacity is full (like ENOMEM in the C + library). This error is reported when a GSL routine encounters + problems when trying to allocate memory with `malloc'. + + -- Macro: int GSL_EINVAL + Invalid argument. This is used to indicate various kinds of + problems with passing the wrong argument to a library function + (like EINVAL in the C library). + + The error codes can be converted into an error message using the +function `gsl_strerror'. + + -- Function: const char * gsl_strerror (const int GSL_ERRNO) + This function returns a pointer to a string describing the error + code GSL_ERRNO. For example, + + printf ("error: %s\n", gsl_strerror (status)); + + would print an error message like `error: output range error' for a + status value of `GSL_ERANGE'. + + +File: gsl-ref.info, Node: Error Handlers, Next: Using GSL error reporting in your own functions, Prev: Error Codes, Up: Error Handling + +3.3 Error Handlers +================== + +The default behavior of the GSL error handler is to print a short +message and call `abort'. When this default is in use programs will +stop with a core-dump whenever a library routine reports an error. +This is intended as a fail-safe default for programs which do not check +the return status of library routines (we don't encourage you to write +programs this way). + + If you turn off the default error handler it is your responsibility +to check the return values of routines and handle them yourself. You +can also customize the error behavior by providing a new error handler. +For example, an alternative error handler could log all errors to a +file, ignore certain error conditions (such as underflows), or start the +debugger and attach it to the current process when an error occurs. + + All GSL error handlers have the type `gsl_error_handler_t', which is +defined in `gsl_errno.h', + + -- Data Type: gsl_error_handler_t + This is the type of GSL error handler functions. An error handler + will be passed four arguments which specify the reason for the + error (a string), the name of the source file in which it occurred + (also a string), the line number in that file (an integer) and the + error number (an integer). The source file and line number are + set at compile time using the `__FILE__' and `__LINE__' directives + in the preprocessor. An error handler function returns type + `void'. Error handler functions should be defined like this, + + void handler (const char * reason, + const char * file, + int line, + int gsl_errno) + +To request the use of your own error handler you need to call the +function `gsl_set_error_handler' which is also declared in +`gsl_errno.h', + + -- Function: gsl_error_handler_t * gsl_set_error_handler + (gsl_error_handler_t NEW_HANDLER) + This function sets a new error handler, NEW_HANDLER, for the GSL + library routines. The previous handler is returned (so that you + can restore it later). Note that the pointer to a user defined + error handler function is stored in a static variable, so there + can be only one error handler per program. This function should + be not be used in multi-threaded programs except to set up a + program-wide error handler from a master thread. The following + example shows how to set and restore a new error handler, + + /* save original handler, install new handler */ + old_handler = gsl_set_error_handler (&my_handler); + + /* code uses new handler */ + ..... + + /* restore original handler */ + gsl_set_error_handler (old_handler); + + To use the default behavior (`abort' on error) set the error + handler to `NULL', + + old_handler = gsl_set_error_handler (NULL); + + -- Function: gsl_error_handler_t * gsl_set_error_handler_off () + This function turns off the error handler by defining an error + handler which does nothing. This will cause the program to + continue after any error, so the return values from any library + routines must be checked. This is the recommended behavior for + production programs. The previous handler is returned (so that + you can restore it later). + + The error behavior can be changed for specific applications by +recompiling the library with a customized definition of the `GSL_ERROR' +macro in the file `gsl_errno.h'. + + +File: gsl-ref.info, Node: Using GSL error reporting in your own functions, Next: Error Reporting Examples, Prev: Error Handlers, Up: Error Handling + +3.4 Using GSL error reporting in your own functions +=================================================== + +If you are writing numerical functions in a program which also uses GSL +code you may find it convenient to adopt the same error reporting +conventions as in the library. + + To report an error you need to call the function `gsl_error' with a +string describing the error and then return an appropriate error code +from `gsl_errno.h', or a special value, such as `NaN'. For convenience +the file `gsl_errno.h' defines two macros which carry out these steps: + + -- Macro: GSL_ERROR (REASON, GSL_ERRNO) + This macro reports an error using the GSL conventions and returns a + status value of `gsl_errno'. It expands to the following code + fragment, + + gsl_error (reason, __FILE__, __LINE__, gsl_errno); + return gsl_errno; + + The macro definition in `gsl_errno.h' actually wraps the code in a + `do { ... } while (0)' block to prevent possible parsing problems. + + Here is an example of how the macro could be used to report that a +routine did not achieve a requested tolerance. To report the error the +routine needs to return the error code `GSL_ETOL'. + + if (residual > tolerance) + { + GSL_ERROR("residual exceeds tolerance", GSL_ETOL); + } + + -- Macro: GSL_ERROR_VAL (REASON, GSL_ERRNO, VALUE) + This macro is the same as `GSL_ERROR' but returns a user-defined + value of VALUE instead of an error code. It can be used for + mathematical functions that return a floating point value. + + The following example shows how to return a `NaN' at a mathematical +singularity using the `GSL_ERROR_VAL' macro, + + if (x == 0) + { + GSL_ERROR_VAL("argument lies on singularity", + GSL_ERANGE, GSL_NAN); + } + + +File: gsl-ref.info, Node: Error Reporting Examples, Prev: Using GSL error reporting in your own functions, Up: Error Handling + +3.5 Examples +============ + +Here is an example of some code which checks the return value of a +function where an error might be reported, + + #include <stdio.h> + #include <gsl/gsl_errno.h> + #include <gsl/gsl_fft_complex.h> + + ... + int status; + size_t n = 37; + + gsl_set_error_handler_off(); + + status = gsl_fft_complex_radix2_forward (data, n); + + if (status) { + if (status == GSL_EINVAL) { + fprintf (stderr, "invalid argument, n=%d\n", n); + } else { + fprintf (stderr, "failed, gsl_errno=%d\n", + status); + } + exit (-1); + } + ... + +The function `gsl_fft_complex_radix2' only accepts integer lengths +which are a power of two. If the variable `n' is not a power of two +then the call to the library function will return `GSL_EINVAL', +indicating that the length argument is invalid. The function call to +`gsl_set_error_handler_off' stops the default error handler from +aborting the program. The `else' clause catches any other possible +errors. + + +File: gsl-ref.info, Node: Mathematical Functions, Next: Complex Numbers, Prev: Error Handling, Up: Top + +4 Mathematical Functions +************************ + +This chapter describes basic mathematical functions. Some of these +functions are present in system libraries, but the alternative versions +given here can be used as a substitute when the system functions are not +available. + + The functions and macros described in this chapter are defined in the +header file `gsl_math.h'. + +* Menu: + +* Mathematical Constants:: +* Infinities and Not-a-number:: +* Elementary Functions:: +* Small integer powers:: +* Testing the Sign of Numbers:: +* Testing for Odd and Even Numbers:: +* Maximum and Minimum functions:: +* Approximate Comparison of Floating Point Numbers:: + + +File: gsl-ref.info, Node: Mathematical Constants, Next: Infinities and Not-a-number, Up: Mathematical Functions + +4.1 Mathematical Constants +========================== + +The library ensures that the standard BSD mathematical constants are +defined. For reference, here is a list of the constants: + +`M_E' + The base of exponentials, e + +`M_LOG2E' + The base-2 logarithm of e, \log_2 (e) + +`M_LOG10E' + The base-10 logarithm of e, \log_10 (e) + +`M_SQRT2' + The square root of two, \sqrt 2 + +`M_SQRT1_2' + The square root of one-half, \sqrt{1/2} + +`M_SQRT3' + The square root of three, \sqrt 3 + +`M_PI' + The constant pi, \pi + +`M_PI_2' + Pi divided by two, \pi/2 + +`M_PI_4' + Pi divided by four, \pi/4 + +`M_SQRTPI' + The square root of pi, \sqrt\pi + +`M_2_SQRTPI' + Two divided by the square root of pi, 2/\sqrt\pi + +`M_1_PI' + The reciprocal of pi, 1/\pi + +`M_2_PI' + Twice the reciprocal of pi, 2/\pi + +`M_LN10' + The natural logarithm of ten, \ln(10) + +`M_LN2' + The natural logarithm of two, \ln(2) + +`M_LNPI' + The natural logarithm of pi, \ln(\pi) + +`M_EULER' + Euler's constant, \gamma + + + +File: gsl-ref.info, Node: Infinities and Not-a-number, Next: Elementary Functions, Prev: Mathematical Constants, Up: Mathematical Functions + +4.2 Infinities and Not-a-number +=============================== + + -- Macro: GSL_POSINF + This macro contains the IEEE representation of positive infinity, + +\infty. It is computed from the expression `+1.0/0.0'. + + -- Macro: GSL_NEGINF + This macro contains the IEEE representation of negative infinity, + -\infty. It is computed from the expression `-1.0/0.0'. + + -- Macro: GSL_NAN + This macro contains the IEEE representation of the Not-a-Number + symbol, `NaN'. It is computed from the ratio `0.0/0.0'. + + -- Function: int gsl_isnan (const double X) + This function returns 1 if X is not-a-number. + + -- Function: int gsl_isinf (const double X) + This function returns +1 if X is positive infinity, -1 if X is + negative infinity and 0 otherwise. + + -- Function: int gsl_finite (const double X) + This function returns 1 if X is a real number, and 0 if it is + infinite or not-a-number. + + +File: gsl-ref.info, Node: Elementary Functions, Next: Small integer powers, Prev: Infinities and Not-a-number, Up: Mathematical Functions + +4.3 Elementary Functions +======================== + +The following routines provide portable implementations of functions +found in the BSD math library. When native versions are not available +the functions described here can be used instead. The substitution can +be made automatically if you use `autoconf' to compile your application +(*note Portability functions::). + + -- Function: double gsl_log1p (const double X) + This function computes the value of \log(1+x) in a way that is + accurate for small X. It provides an alternative to the BSD math + function `log1p(x)'. + + -- Function: double gsl_expm1 (const double X) + This function computes the value of \exp(x)-1 in a way that is + accurate for small X. It provides an alternative to the BSD math + function `expm1(x)'. + + -- Function: double gsl_hypot (const double X, const double Y) + This function computes the value of \sqrt{x^2 + y^2} in a way that + avoids overflow. It provides an alternative to the BSD math + function `hypot(x,y)'. + + -- Function: double gsl_acosh (const double X) + This function computes the value of \arccosh(x). It provides an + alternative to the standard math function `acosh(x)'. + + -- Function: double gsl_asinh (const double X) + This function computes the value of \arcsinh(x). It provides an + alternative to the standard math function `asinh(x)'. + + -- Function: double gsl_atanh (const double X) + This function computes the value of \arctanh(x). It provides an + alternative to the standard math function `atanh(x)'. + + -- Function: double gsl_ldexp (double X, int E) + This function computes the value of x * 2^e. It provides an + alternative to the standard math function `ldexp(x,e)'. + + -- Function: double gsl_frexp (double X, int * E) + This function splits the number x into its normalized fraction f + and exponent e, such that x = f * 2^e and 0.5 <= f < 1. The + function returns f and stores the exponent in e. If x is zero, + both f and e are set to zero. This function provides an + alternative to the standard math function `frexp(x, e)'. + + +File: gsl-ref.info, Node: Small integer powers, Next: Testing the Sign of Numbers, Prev: Elementary Functions, Up: Mathematical Functions + +4.4 Small integer powers +======================== + +A common complaint about the standard C library is its lack of a +function for calculating (small) integer powers. GSL provides some +simple functions to fill this gap. For reasons of efficiency, these +functions do not check for overflow or underflow conditions. + + -- Function: double gsl_pow_int (double X, int N) + This routine computes the power x^n for integer N. The power is + computed efficiently--for example, x^8 is computed as ((x^2)^2)^2, + requiring only 3 multiplications. A version of this function + which also computes the numerical error in the result is available + as `gsl_sf_pow_int_e'. + + -- Function: double gsl_pow_2 (const double X) + -- Function: double gsl_pow_3 (const double X) + -- Function: double gsl_pow_4 (const double X) + -- Function: double gsl_pow_5 (const double X) + -- Function: double gsl_pow_6 (const double X) + -- Function: double gsl_pow_7 (const double X) + -- Function: double gsl_pow_8 (const double X) + -- Function: double gsl_pow_9 (const double X) + These functions can be used to compute small integer powers x^2, + x^3, etc. efficiently. The functions will be inlined when possible + so that use of these functions should be as efficient as + explicitly writing the corresponding product expression. + + #include <gsl/gsl_math.h> + double y = gsl_pow_4 (3.141) /* compute 3.141**4 */ + + +File: gsl-ref.info, Node: Testing the Sign of Numbers, Next: Testing for Odd and Even Numbers, Prev: Small integer powers, Up: Mathematical Functions + +4.5 Testing the Sign of Numbers +=============================== + + -- Macro: GSL_SIGN (x) + This macro returns the sign of X. It is defined as `((x) >= 0 ? 1 + : -1)'. Note that with this definition the sign of zero is positive + (regardless of its IEEE sign bit). + + +File: gsl-ref.info, Node: Testing for Odd and Even Numbers, Next: Maximum and Minimum functions, Prev: Testing the Sign of Numbers, Up: Mathematical Functions + +4.6 Testing for Odd and Even Numbers +==================================== + + -- Macro: GSL_IS_ODD (n) + This macro evaluates to 1 if N is odd and 0 if N is even. The + argument N must be of integer type. + + -- Macro: GSL_IS_EVEN (n) + This macro is the opposite of `GSL_IS_ODD(n)'. It evaluates to 1 if + N is even and 0 if N is odd. The argument N must be of integer + type. + + +File: gsl-ref.info, Node: Maximum and Minimum functions, Next: Approximate Comparison of Floating Point Numbers, Prev: Testing for Odd and Even Numbers, Up: Mathematical Functions + +4.7 Maximum and Minimum functions +================================= + + -- Macro: GSL_MAX (a, b) + This macro returns the maximum of A and B. It is defined as `((a) + > (b) ? (a):(b))'. + + -- Macro: GSL_MIN (a, b) + This macro returns the minimum of A and B. It is defined as `((a) + < (b) ? (a):(b))'. + + -- Function: extern inline double GSL_MAX_DBL (double A, double B) + This function returns the maximum of the double precision numbers + A and B using an inline function. The use of a function allows for + type checking of the arguments as an extra safety feature. On + platforms where inline functions are not available the macro + `GSL_MAX' will be automatically substituted. + + -- Function: extern inline double GSL_MIN_DBL (double A, double B) + This function returns the minimum of the double precision numbers + A and B using an inline function. The use of a function allows for + type checking of the arguments as an extra safety feature. On + platforms where inline functions are not available the macro + `GSL_MIN' will be automatically substituted. + + -- Function: extern inline int GSL_MAX_INT (int A, int B) + -- Function: extern inline int GSL_MIN_INT (int A, int B) + These functions return the maximum or minimum of the integers A + and B using an inline function. On platforms where inline + functions are not available the macros `GSL_MAX' or `GSL_MIN' will + be automatically substituted. + + -- Function: extern inline long double GSL_MAX_LDBL (long double A, + long double B) + -- Function: extern inline long double GSL_MIN_LDBL (long double A, + long double B) + These functions return the maximum or minimum of the long doubles A + and B using an inline function. On platforms where inline + functions are not available the macros `GSL_MAX' or `GSL_MIN' will + be automatically substituted. + + +File: gsl-ref.info, Node: Approximate Comparison of Floating Point Numbers, Prev: Maximum and Minimum functions, Up: Mathematical Functions + +4.8 Approximate Comparison of Floating Point Numbers +==================================================== + +It is sometimes useful to be able to compare two floating point numbers +approximately, to allow for rounding and truncation errors. The +following function implements the approximate floating-point comparison +algorithm proposed by D.E. Knuth in Section 4.2.2 of `Seminumerical +Algorithms' (3rd edition). + + -- Function: int gsl_fcmp (double X, double Y, double EPSILON) + This function determines whether x and y are approximately equal + to a relative accuracy EPSILON. + + The relative accuracy is measured using an interval of size 2 + \delta, where \delta = 2^k \epsilon and k is the maximum base-2 + exponent of x and y as computed by the function `frexp'. + + If x and y lie within this interval, they are considered + approximately equal and the function returns 0. Otherwise if x < + y, the function returns -1, or if x > y, the function returns +1. + + The implementation is based on the package `fcmp' by T.C. Belding. + + +File: gsl-ref.info, Node: Complex Numbers, Next: Polynomials, Prev: Mathematical Functions, Up: Top + +5 Complex Numbers +***************** + +The functions described in this chapter provide support for complex +numbers. The algorithms take care to avoid unnecessary intermediate +underflows and overflows, allowing the functions to be evaluated over +as much of the complex plane as possible. + + For multiple-valued functions the branch cuts have been chosen to +follow the conventions of Abramowitz and Stegun in the `Handbook of +Mathematical Functions'. The functions return principal values which are +the same as those in GNU Calc, which in turn are the same as those in +`Common Lisp, The Language (Second Edition)'(1) and the HP-28/48 series +of calculators. + + The complex types are defined in the header file `gsl_complex.h', +while the corresponding complex functions and arithmetic operations are +defined in `gsl_complex_math.h'. + +* Menu: + +* Complex numbers:: +* Properties of complex numbers:: +* Complex arithmetic operators:: +* Elementary Complex Functions:: +* Complex Trigonometric Functions:: +* Inverse Complex Trigonometric Functions:: +* Complex Hyperbolic Functions:: +* Inverse Complex Hyperbolic Functions:: +* Complex Number References and Further Reading:: + + ---------- Footnotes ---------- + + (1) Note that the first edition uses different definitions. + + +File: gsl-ref.info, Node: Complex numbers, Next: Properties of complex numbers, Up: Complex Numbers + +5.1 Complex numbers +=================== + +Complex numbers are represented using the type `gsl_complex'. The +internal representation of this type may vary across platforms and +should not be accessed directly. The functions and macros described +below allow complex numbers to be manipulated in a portable way. + + For reference, the default form of the `gsl_complex' type is given +by the following struct, + + typedef struct + { + double dat[2]; + } gsl_complex; + +The real and imaginary part are stored in contiguous elements of a two +element array. This eliminates any padding between the real and +imaginary parts, `dat[0]' and `dat[1]', allowing the struct to be +mapped correctly onto packed complex arrays. + + -- Function: gsl_complex gsl_complex_rect (double X, double Y) + This function uses the rectangular cartesian components (X,Y) to + return the complex number z = x + i y. + + -- Function: gsl_complex gsl_complex_polar (double R, double THETA) + This function returns the complex number z = r \exp(i \theta) = r + (\cos(\theta) + i \sin(\theta)) from the polar representation + (R,THETA). + + -- Macro: GSL_REAL (Z) + -- Macro: GSL_IMAG (Z) + These macros return the real and imaginary parts of the complex + number Z. + + -- Macro: GSL_SET_COMPLEX (ZP, X, Y) + This macro uses the cartesian components (X,Y) to set the real and + imaginary parts of the complex number pointed to by ZP. For + example, + + GSL_SET_COMPLEX(&z, 3, 4) + + sets Z to be 3 + 4i. + + -- Macro: GSL_SET_REAL (ZP,X) + -- Macro: GSL_SET_IMAG (ZP,Y) + These macros allow the real and imaginary parts of the complex + number pointed to by ZP to be set independently. + + +File: gsl-ref.info, Node: Properties of complex numbers, Next: Complex arithmetic operators, Prev: Complex numbers, Up: Complex Numbers + +5.2 Properties of complex numbers +================================= + + -- Function: double gsl_complex_arg (gsl_complex Z) + This function returns the argument of the complex number Z, + \arg(z), where -\pi < \arg(z) <= \pi. + + -- Function: double gsl_complex_abs (gsl_complex Z) + This function returns the magnitude of the complex number Z, |z|. + + -- Function: double gsl_complex_abs2 (gsl_complex Z) + This function returns the squared magnitude of the complex number + Z, |z|^2. + + -- Function: double gsl_complex_logabs (gsl_complex Z) + This function returns the natural logarithm of the magnitude of the + complex number Z, \log|z|. It allows an accurate evaluation of + \log|z| when |z| is close to one. The direct evaluation of + `log(gsl_complex_abs(z))' would lead to a loss of precision in + this case. + + +File: gsl-ref.info, Node: Complex arithmetic operators, Next: Elementary Complex Functions, Prev: Properties of complex numbers, Up: Complex Numbers + +5.3 Complex arithmetic operators +================================ + + -- Function: gsl_complex gsl_complex_add (gsl_complex A, gsl_complex B) + This function returns the sum of the complex numbers A and B, + z=a+b. + + -- Function: gsl_complex gsl_complex_sub (gsl_complex A, gsl_complex B) + This function returns the difference of the complex numbers A and + B, z=a-b. + + -- Function: gsl_complex gsl_complex_mul (gsl_complex A, gsl_complex B) + This function returns the product of the complex numbers A and B, + z=ab. + + -- Function: gsl_complex gsl_complex_div (gsl_complex A, gsl_complex B) + This function returns the quotient of the complex numbers A and B, + z=a/b. + + -- Function: gsl_complex gsl_complex_add_real (gsl_complex A, double X) + This function returns the sum of the complex number A and the real + number X, z=a+x. + + -- Function: gsl_complex gsl_complex_sub_real (gsl_complex A, double X) + This function returns the difference of the complex number A and + the real number X, z=a-x. + + -- Function: gsl_complex gsl_complex_mul_real (gsl_complex A, double X) + This function returns the product of the complex number A and the + real number X, z=ax. + + -- Function: gsl_complex gsl_complex_div_real (gsl_complex A, double X) + This function returns the quotient of the complex number A and the + real number X, z=a/x. + + -- Function: gsl_complex gsl_complex_add_imag (gsl_complex A, double Y) + This function returns the sum of the complex number A and the + imaginary number iY, z=a+iy. + + -- Function: gsl_complex gsl_complex_sub_imag (gsl_complex A, double Y) + This function returns the difference of the complex number A and + the imaginary number iY, z=a-iy. + + -- Function: gsl_complex gsl_complex_mul_imag (gsl_complex A, double Y) + This function returns the product of the complex number A and the + imaginary number iY, z=a*(iy). + + -- Function: gsl_complex gsl_complex_div_imag (gsl_complex A, double Y) + This function returns the quotient of the complex number A and the + imaginary number iY, z=a/(iy). + + -- Function: gsl_complex gsl_complex_conjugate (gsl_complex Z) + This function returns the complex conjugate of the complex number + Z, z^* = x - i y. + + -- Function: gsl_complex gsl_complex_inverse (gsl_complex Z) + This function returns the inverse, or reciprocal, of the complex + number Z, 1/z = (x - i y)/(x^2 + y^2). + + -- Function: gsl_complex gsl_complex_negative (gsl_complex Z) + This function returns the negative of the complex number Z, -z = + (-x) + i(-y). + + +File: gsl-ref.info, Node: Elementary Complex Functions, Next: Complex Trigonometric Functions, Prev: Complex arithmetic operators, Up: Complex Numbers + +5.4 Elementary Complex Functions +================================ + + -- Function: gsl_complex gsl_complex_sqrt (gsl_complex Z) + This function returns the square root of the complex number Z, + \sqrt z. The branch cut is the negative real axis. The result + always lies in the right half of the complex plane. + + -- Function: gsl_complex gsl_complex_sqrt_real (double X) + This function returns the complex square root of the real number + X, where X may be negative. + + -- Function: gsl_complex gsl_complex_pow (gsl_complex Z, gsl_complex A) + The function returns the complex number Z raised to the complex + power A, z^a. This is computed as \exp(\log(z)*a) using complex + logarithms and complex exponentials. + + -- Function: gsl_complex gsl_complex_pow_real (gsl_complex Z, double X) + This function returns the complex number Z raised to the real + power X, z^x. + + -- Function: gsl_complex gsl_complex_exp (gsl_complex Z) + This function returns the complex exponential of the complex number + Z, \exp(z). + + -- Function: gsl_complex gsl_complex_log (gsl_complex Z) + This function returns the complex natural logarithm (base e) of + the complex number Z, \log(z). The branch cut is the negative + real axis. + + -- Function: gsl_complex gsl_complex_log10 (gsl_complex Z) + This function returns the complex base-10 logarithm of the complex + number Z, \log_10 (z). + + -- Function: gsl_complex gsl_complex_log_b (gsl_complex Z, gsl_complex + B) + This function returns the complex base-B logarithm of the complex + number Z, \log_b(z). This quantity is computed as the ratio + \log(z)/\log(b). + + +File: gsl-ref.info, Node: Complex Trigonometric Functions, Next: Inverse Complex Trigonometric Functions, Prev: Elementary Complex Functions, Up: Complex Numbers + +5.5 Complex Trigonometric Functions +=================================== + + -- Function: gsl_complex gsl_complex_sin (gsl_complex Z) + This function returns the complex sine of the complex number Z, + \sin(z) = (\exp(iz) - \exp(-iz))/(2i). + + -- Function: gsl_complex gsl_complex_cos (gsl_complex Z) + This function returns the complex cosine of the complex number Z, + \cos(z) = (\exp(iz) + \exp(-iz))/2. + + -- Function: gsl_complex gsl_complex_tan (gsl_complex Z) + This function returns the complex tangent of the complex number Z, + \tan(z) = \sin(z)/\cos(z). + + -- Function: gsl_complex gsl_complex_sec (gsl_complex Z) + This function returns the complex secant of the complex number Z, + \sec(z) = 1/\cos(z). + + -- Function: gsl_complex gsl_complex_csc (gsl_complex Z) + This function returns the complex cosecant of the complex number Z, + \csc(z) = 1/\sin(z). + + -- Function: gsl_complex gsl_complex_cot (gsl_complex Z) + This function returns the complex cotangent of the complex number + Z, \cot(z) = 1/\tan(z). + + +File: gsl-ref.info, Node: Inverse Complex Trigonometric Functions, Next: Complex Hyperbolic Functions, Prev: Complex Trigonometric Functions, Up: Complex Numbers + +5.6 Inverse Complex Trigonometric Functions +=========================================== + + -- Function: gsl_complex gsl_complex_arcsin (gsl_complex Z) + This function returns the complex arcsine of the complex number Z, + \arcsin(z). The branch cuts are on the real axis, less than -1 and + greater than 1. + + -- Function: gsl_complex gsl_complex_arcsin_real (double Z) + This function returns the complex arcsine of the real number Z, + \arcsin(z). For z between -1 and 1, the function returns a real + value in the range [-\pi/2,\pi/2]. For z less than -1 the result + has a real part of -\pi/2 and a positive imaginary part. For z + greater than 1 the result has a real part of \pi/2 and a negative + imaginary part. + + -- Function: gsl_complex gsl_complex_arccos (gsl_complex Z) + This function returns the complex arccosine of the complex number + Z, \arccos(z). The branch cuts are on the real axis, less than -1 + and greater than 1. + + -- Function: gsl_complex gsl_complex_arccos_real (double Z) + This function returns the complex arccosine of the real number Z, + \arccos(z). For z between -1 and 1, the function returns a real + value in the range [0,\pi]. For z less than -1 the result has a + real part of \pi and a negative imaginary part. For z greater + than 1 the result is purely imaginary and positive. + + -- Function: gsl_complex gsl_complex_arctan (gsl_complex Z) + This function returns the complex arctangent of the complex number + Z, \arctan(z). The branch cuts are on the imaginary axis, below -i + and above i. + + -- Function: gsl_complex gsl_complex_arcsec (gsl_complex Z) + This function returns the complex arcsecant of the complex number + Z, \arcsec(z) = \arccos(1/z). + + -- Function: gsl_complex gsl_complex_arcsec_real (double Z) + This function returns the complex arcsecant of the real number Z, + \arcsec(z) = \arccos(1/z). + + -- Function: gsl_complex gsl_complex_arccsc (gsl_complex Z) + This function returns the complex arccosecant of the complex + number Z, \arccsc(z) = \arcsin(1/z). + + -- Function: gsl_complex gsl_complex_arccsc_real (double Z) + This function returns the complex arccosecant of the real number Z, + \arccsc(z) = \arcsin(1/z). + + -- Function: gsl_complex gsl_complex_arccot (gsl_complex Z) + This function returns the complex arccotangent of the complex + number Z, \arccot(z) = \arctan(1/z). + + +File: gsl-ref.info, Node: Complex Hyperbolic Functions, Next: Inverse Complex Hyperbolic Functions, Prev: Inverse Complex Trigonometric Functions, Up: Complex Numbers + +5.7 Complex Hyperbolic Functions +================================ + + -- Function: gsl_complex gsl_complex_sinh (gsl_complex Z) + This function returns the complex hyperbolic sine of the complex + number Z, \sinh(z) = (\exp(z) - \exp(-z))/2. + + -- Function: gsl_complex gsl_complex_cosh (gsl_complex Z) + This function returns the complex hyperbolic cosine of the complex + number Z, \cosh(z) = (\exp(z) + \exp(-z))/2. + + -- Function: gsl_complex gsl_complex_tanh (gsl_complex Z) + This function returns the complex hyperbolic tangent of the + complex number Z, \tanh(z) = \sinh(z)/\cosh(z). + + -- Function: gsl_complex gsl_complex_sech (gsl_complex Z) + This function returns the complex hyperbolic secant of the complex + number Z, \sech(z) = 1/\cosh(z). + + -- Function: gsl_complex gsl_complex_csch (gsl_complex Z) + This function returns the complex hyperbolic cosecant of the + complex number Z, \csch(z) = 1/\sinh(z). + + -- Function: gsl_complex gsl_complex_coth (gsl_complex Z) + This function returns the complex hyperbolic cotangent of the + complex number Z, \coth(z) = 1/\tanh(z). + + +File: gsl-ref.info, Node: Inverse Complex Hyperbolic Functions, Next: Complex Number References and Further Reading, Prev: Complex Hyperbolic Functions, Up: Complex Numbers + +5.8 Inverse Complex Hyperbolic Functions +======================================== + + -- Function: gsl_complex gsl_complex_arcsinh (gsl_complex Z) + This function returns the complex hyperbolic arcsine of the + complex number Z, \arcsinh(z). The branch cuts are on the + imaginary axis, below -i and above i. + + -- Function: gsl_complex gsl_complex_arccosh (gsl_complex Z) + This function returns the complex hyperbolic arccosine of the + complex number Z, \arccosh(z). The branch cut is on the real + axis, less than 1. Note that in this case we use the negative + square root in formula 4.6.21 of Abramowitz & Stegun giving + \arccosh(z)=\log(z-\sqrt{z^2-1}). + + -- Function: gsl_complex gsl_complex_arccosh_real (double Z) + This function returns the complex hyperbolic arccosine of the real + number Z, \arccosh(z). + + -- Function: gsl_complex gsl_complex_arctanh (gsl_complex Z) + This function returns the complex hyperbolic arctangent of the + complex number Z, \arctanh(z). The branch cuts are on the real + axis, less than -1 and greater than 1. + + -- Function: gsl_complex gsl_complex_arctanh_real (double Z) + This function returns the complex hyperbolic arctangent of the real + number Z, \arctanh(z). + + -- Function: gsl_complex gsl_complex_arcsech (gsl_complex Z) + This function returns the complex hyperbolic arcsecant of the + complex number Z, \arcsech(z) = \arccosh(1/z). + + -- Function: gsl_complex gsl_complex_arccsch (gsl_complex Z) + This function returns the complex hyperbolic arccosecant of the + complex number Z, \arccsch(z) = \arcsin(1/z). + + -- Function: gsl_complex gsl_complex_arccoth (gsl_complex Z) + This function returns the complex hyperbolic arccotangent of the + complex number Z, \arccoth(z) = \arctanh(1/z). + + +File: gsl-ref.info, Node: Complex Number References and Further Reading, Prev: Inverse Complex Hyperbolic Functions, Up: Complex Numbers + +5.9 References and Further Reading +================================== + +The implementations of the elementary and trigonometric functions are +based on the following papers, + + T. E. Hull, Thomas F. Fairgrieve, Ping Tak Peter Tang, + "Implementing Complex Elementary Functions Using Exception + Handling", `ACM Transactions on Mathematical Software', Volume 20 + (1994), pp 215-244, Corrigenda, p553 + + T. E. Hull, Thomas F. Fairgrieve, Ping Tak Peter Tang, + "Implementing the complex arcsin and arccosine functions using + exception handling", `ACM Transactions on Mathematical Software', + Volume 23 (1997) pp 299-335 + +The general formulas and details of branch cuts can be found in the +following books, + + Abramowitz and Stegun, `Handbook of Mathematical Functions', + "Circular Functions in Terms of Real and Imaginary Parts", Formulas + 4.3.55-58, "Inverse Circular Functions in Terms of Real and + Imaginary Parts", Formulas 4.4.37-39, "Hyperbolic Functions in + Terms of Real and Imaginary Parts", Formulas 4.5.49-52, "Inverse + Hyperbolic Functions--relation to Inverse Circular Functions", + Formulas 4.6.14-19. + + Dave Gillespie, `Calc Manual', Free Software Foundation, ISBN + 1-882114-18-3 + + +File: gsl-ref.info, Node: Polynomials, Next: Special Functions, Prev: Complex Numbers, Up: Top + +6 Polynomials +************* + +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 `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:: + + +File: gsl-ref.info, Node: Polynomial Evaluation, Next: Divided Difference Representation of Polynomials, Up: Polynomials + +6.1 Polynomial Evaluation +========================= + + -- Function: double gsl_poly_eval (const double C[], const int LEN, + const double X) + This function evaluates the polynomial 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. + + +File: gsl-ref.info, Node: Divided Difference Representation of Polynomials, Next: Quadratic Equations, Prev: Polynomial Evaluation, Up: Polynomials + +6.2 Divided Difference Representation of Polynomials +==================================================== + +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. + + -- Function: int gsl_poly_dd_init (double DD[], const double XA[], + const double YA[], size_t SIZE) + This function computes a divided-difference representation of the + interpolating polynomial for the points (XA, YA) stored in the + arrays XA and YA of length SIZE. On output the + divided-differences of (XA,YA) are stored in the array DD, also of + length SIZE. + + -- Function: double gsl_poly_dd_eval (const double DD[], const double + XA[], const size_t SIZE, const double X) + This function evaluates the polynomial stored in + divided-difference form in the arrays DD and XA of length SIZE at + the point X. + + -- Function: int gsl_poly_dd_taylor (double C[], double XP, const + double DD[], const double XA[], size_t SIZE, double W[]) + This function converts the divided-difference representation of a + polynomial to a Taylor expansion. The divided-difference + representation is supplied in the arrays DD and XA of length SIZE. + On output the Taylor coefficients of the polynomial expanded about + the point XP are stored in the array C also of length SIZE. A + workspace of length SIZE must be provided in the array W. + + +File: gsl-ref.info, Node: Quadratic Equations, Next: Cubic Equations, Prev: Divided Difference Representation of Polynomials, Up: Polynomials + +6.3 Quadratic Equations +======================= + + -- Function: int gsl_poly_solve_quadratic (double A, double B, double + C, double * X0, double * X1) + This function finds the real roots of the quadratic equation, + + a x^2 + b x + c = 0 + + The number of real roots (either zero, one or two) is returned, and + their locations are stored in X0 and X1. If no real roots are + found then X0 and X1 are not modified. If one real root is found + (i.e. if a=0) then it is stored in X0. When two real roots are + found they are stored in X0 and X1 in ascending order. The case + of coincident roots is not considered special. For example + (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 + 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. + + + -- Function: int gsl_poly_complex_solve_quadratic (double A, double B, + double C, gsl_complex * Z0, gsl_complex * Z1) + This function finds the complex roots of the quadratic equation, + + a z^2 + b z + c = 0 + + The number of complex roots is returned (either one or two) and the + locations of the roots are stored in Z0 and 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 a=0) then it is stored in Z0. + + + +File: gsl-ref.info, Node: Cubic Equations, Next: General Polynomial Equations, Prev: Quadratic Equations, Up: Polynomials + +6.4 Cubic Equations +=================== + + -- Function: int gsl_poly_solve_cubic (double A, double B, double C, + double * X0, double * X1, double * X2) + This function finds the real roots of the cubic equation, + + x^3 + a x^2 + b x + c = 0 + + with a leading coefficient of unity. The number of real roots + (either one or three) is returned, and their locations are stored + in X0, X1 and X2. If one real root is found then only X0 is + modified. When three real roots are found they are stored in X0, + X1 and X2 in ascending order. The case of coincident roots is not + considered special. For example, the equation (x-1)^3=0 will have + three roots with exactly equal values. + + + -- Function: int gsl_poly_complex_solve_cubic (double A, double B, + double C, gsl_complex * Z0, gsl_complex * Z1, gsl_complex * + Z2) + This function finds the complex roots of the cubic equation, + + z^3 + a z^2 + b z + c = 0 + + The number of complex roots is returned (always three) and the + locations of the roots are stored in Z0, Z1 and Z2. The roots are + returned in ascending order, sorted first by their real components + and then by their imaginary components. + + + +File: gsl-ref.info, Node: General Polynomial Equations, Next: Roots of Polynomials Examples, Prev: Cubic Equations, Up: Polynomials + +6.5 General Polynomial Equations +================================ + +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. + + -- Function: gsl_poly_complex_workspace * +gsl_poly_complex_workspace_alloc (size_t N) + This function allocates space for a `gsl_poly_complex_workspace' + struct and a workspace suitable for solving a polynomial with N + coefficients using the routine `gsl_poly_complex_solve'. + + The function returns a pointer to the newly allocated + `gsl_poly_complex_workspace' if no errors were detected, and a null + pointer in the case of error. + + -- Function: void gsl_poly_complex_workspace_free + (gsl_poly_complex_workspace * W) + This function frees all the memory associated with the workspace W. + + -- Function: int gsl_poly_complex_solve (const double * A, size_t N, + gsl_poly_complex_workspace * W, gsl_complex_packed_ptr Z) + This function computes the roots of the general polynomial 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 N specifies the + length of the coefficient array. The coefficient of the highest + order term must be non-zero. The function requires a workspace W + of the appropriate size. The n-1 roots are returned in the packed + complex array Z of length 2(n-1), alternating real and imaginary + parts. + + The function returns `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 `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). + + +File: gsl-ref.info, Node: Roots of Polynomials Examples, Next: Roots of Polynomials References and Further Reading, Prev: General Polynomial Equations, Up: Polynomials + +6.6 Examples +============ + +To demonstrate the use of the general polynomial solver we will take the +polynomial P(x) = x^5 - 1 which has the following roots, + + 1, e^{2\pi i /5}, e^{4\pi i /5}, e^{6\pi i /5}, e^{8\pi i /5} + +The following program will find these roots. + + #include <stdio.h> + #include <gsl/gsl_poly.h> + + int + main (void) + { + int i; + /* coefficients of P(x) = -1 + x^5 */ + double a[6] = { -1, 0, 0, 0, 0, 1 }; + double z[10]; + + gsl_poly_complex_workspace * w + = gsl_poly_complex_workspace_alloc (6); + + gsl_poly_complex_solve (a, 6, w, z); + + gsl_poly_complex_workspace_free (w); + + for (i = 0; i < 5; i++) + { + printf ("z%d = %+.18f %+.18f\n", + i, z[2*i], z[2*i+1]); + } + + return 0; + } + +The output of the program is, + + $ ./a.out + z0 = -0.809016994374947451 +0.587785252292473137 + z1 = -0.809016994374947451 -0.587785252292473137 + z2 = +0.309016994374947451 +0.951056516295153642 + z3 = +0.309016994374947451 -0.951056516295153642 + z4 = +1.000000000000000000 +0.000000000000000000 + +which agrees with the analytic result, z_n = \exp(2 \pi n i/5). + + +File: gsl-ref.info, Node: Roots of Polynomials References and Further Reading, Prev: Roots of Polynomials Examples, Up: Polynomials + +6.7 References and Further Reading +================================== + +The balanced-QR method and its error analysis are described in the +following papers, + + R.S. Martin, G. Peters and J.H. Wilkinson, "The QR Algorithm for + Real Hessenberg Matrices", `Numerische Mathematik', 14 (1970), + 219-231. + + B.N. Parlett and C. Reinsch, "Balancing a Matrix for Calculation of + Eigenvalues and Eigenvectors", `Numerische Mathematik', 13 (1969), + 293-304. + + A. Edelman and H. Murakami, "Polynomial roots from companion matrix + eigenvalues", `Mathematics of Computation', Vol. 64, No. 210 + (1995), 763-776. + +The formulas for divided differences are given in Abramowitz and Stegun, + + Abramowitz and Stegun, `Handbook of Mathematical Functions', + Sections 25.1.4 and 25.2.26. + + +File: gsl-ref.info, Node: Special Functions, Next: Vectors and Matrices, Prev: Polynomials, Up: Top + +7 Special Functions +******************* + +This chapter describes the GSL special function library. The library +includes routines for calculating the values of Airy functions, Bessel +functions, Clausen functions, Coulomb wave functions, Coupling +coefficients, the Dawson function, Debye functions, Dilogarithms, +Elliptic integrals, Jacobi elliptic functions, Error functions, +Exponential integrals, Fermi-Dirac functions, Gamma functions, +Gegenbauer functions, Hypergeometric functions, Laguerre functions, +Legendre functions and Spherical Harmonics, the Psi (Digamma) Function, +Synchrotron functions, Transport functions, Trigonometric functions and +Zeta functions. Each routine also computes an estimate of the numerical +error in the calculated value of the function. + + The functions in this chapter are declared in individual header +files, such as `gsl_sf_airy.h', `gsl_sf_bessel.h', etc. The complete +set of header files can be included using the file `gsl_sf.h'. + +* Menu: + +* Special Function Usage:: +* The gsl_sf_result struct:: +* Special Function Modes:: +* Airy Functions and Derivatives:: +* Bessel Functions:: +* Clausen Functions:: +* Coulomb Functions:: +* Coupling Coefficients:: +* Dawson Function:: +* Debye Functions:: +* Dilogarithm:: +* Elementary Operations:: +* Elliptic Integrals:: +* Elliptic Functions (Jacobi):: +* Error Functions:: +* Exponential Functions:: +* Exponential Integrals:: +* Fermi-Dirac Function:: +* Gamma and Beta Functions:: +* Gegenbauer Functions:: +* Hypergeometric Functions:: +* Laguerre Functions:: +* Lambert W Functions:: +* Legendre Functions and Spherical Harmonics:: +* Logarithm and Related Functions:: +* Mathieu Functions:: +* Power Function:: +* Psi (Digamma) Function:: +* Synchrotron Functions:: +* Transport Functions:: +* Trigonometric Functions:: +* Zeta Functions:: +* Special Functions Examples:: +* Special Functions References and Further Reading:: + + +File: gsl-ref.info, Node: Special Function Usage, Next: The gsl_sf_result struct, Up: Special Functions + +7.1 Usage +========= + +The special functions are available in two calling conventions, a +"natural form" which returns the numerical value of the function and an +"error-handling form" which returns an error code. The two types of +function provide alternative ways of accessing the same underlying code. + + The "natural form" returns only the value of the function and can be +used directly in mathematical expressions. For example, the following +function call will compute the value of the Bessel function J_0(x), + + double y = gsl_sf_bessel_J0 (x); + +There is no way to access an error code or to estimate the error using +this method. To allow access to this information the alternative +error-handling form stores the value and error in a modifiable argument, + + gsl_sf_result result; + int status = gsl_sf_bessel_J0_e (x, &result); + +The error-handling functions have the suffix `_e'. The returned status +value indicates error conditions such as overflow, underflow or loss of +precision. If there are no errors the error-handling functions return +`GSL_SUCCESS'. + + +File: gsl-ref.info, Node: The gsl_sf_result struct, Next: Special Function Modes, Prev: Special Function Usage, Up: Special Functions + +7.2 The gsl_sf_result struct +============================ + +The error handling form of the special functions always calculate an +error estimate along with the value of the result. Therefore, +structures are provided for amalgamating a value and error estimate. +These structures are declared in the header file `gsl_sf_result.h'. + + The `gsl_sf_result' struct contains value and error fields. + + typedef struct + { + double val; + double err; + } gsl_sf_result; + +The field VAL contains the value and the field ERR contains an estimate +of the absolute error in the value. + + In some cases, an overflow or underflow can be detected and handled +by a function. In this case, it may be possible to return a scaling +exponent as well as an error/value pair in order to save the result from +exceeding the dynamic range of the built-in types. The +`gsl_sf_result_e10' struct contains value and error fields as well as +an exponent field such that the actual result is obtained as `result * +10^(e10)'. + + typedef struct + { + double val; + double err; + int e10; + } gsl_sf_result_e10; + + +File: gsl-ref.info, Node: Special Function Modes, Next: Airy Functions and Derivatives, Prev: The gsl_sf_result struct, Up: Special Functions + +7.3 Modes +========= + +The goal of the library is to achieve double precision accuracy wherever +possible. However the cost of evaluating some special functions to +double precision can be significant, particularly where very high order +terms are required. In these cases a `mode' argument allows the +accuracy of the function to be reduced in order to improve performance. +The following precision levels are available for the mode argument, + +`GSL_PREC_DOUBLE' + Double-precision, a relative accuracy of approximately 2 * 10^-16. + +`GSL_PREC_SINGLE' + Single-precision, a relative accuracy of approximately 10^-7. + +`GSL_PREC_APPROX' + Approximate values, a relative accuracy of approximately 5 * 10^-4. + +The approximate mode provides the fastest evaluation at the lowest +accuracy. + + +File: gsl-ref.info, Node: Airy Functions and Derivatives, Next: Bessel Functions, Prev: Special Function Modes, Up: Special Functions + +7.4 Airy Functions and Derivatives +================================== + +The Airy functions Ai(x) and Bi(x) are defined by the integral +representations, + + Ai(x) = (1/\pi) \int_0^\infty \cos((1/3) t^3 + xt) dt + Bi(x) = (1/\pi) \int_0^\infty (e^(-(1/3) t^3) + \sin((1/3) t^3 + xt)) dt + +For further information see Abramowitz & Stegun, Section 10.4. The Airy +functions are defined in the header file `gsl_sf_airy.h'. + +* Menu: + +* Airy Functions:: +* Derivatives of Airy Functions:: +* Zeros of Airy Functions:: +* Zeros of Derivatives of Airy Functions:: + + +File: gsl-ref.info, Node: Airy Functions, Next: Derivatives of Airy Functions, Up: Airy Functions and Derivatives + +7.4.1 Airy Functions +-------------------- + + -- Function: double gsl_sf_airy_Ai (double X, gsl_mode_t MODE) + -- Function: int gsl_sf_airy_Ai_e (double X, gsl_mode_t MODE, + gsl_sf_result * RESULT) + These routines compute the Airy function Ai(x) with an accuracy + specified by MODE. + + -- Function: double gsl_sf_airy_Bi (double X, gsl_mode_t MODE) + -- Function: int gsl_sf_airy_Bi_e (double X, gsl_mode_t MODE, + gsl_sf_result * RESULT) + These routines compute the Airy function Bi(x) with an accuracy + specified by MODE. + + -- Function: double gsl_sf_airy_Ai_scaled (double X, gsl_mode_t MODE) + -- Function: int gsl_sf_airy_Ai_scaled_e (double X, gsl_mode_t MODE, + gsl_sf_result * RESULT) + These routines compute a scaled version of the Airy function + S_A(x) Ai(x). For x>0 the scaling factor S_A(x) is \exp(+(2/3) + x^(3/2)), and is 1 for x<0. + + -- Function: double gsl_sf_airy_Bi_scaled (double X, gsl_mode_t MODE) + -- Function: int gsl_sf_airy_Bi_scaled_e (double X, gsl_mode_t MODE, + gsl_sf_result * RESULT) + These routines compute a scaled version of the Airy function + S_B(x) Bi(x). For x>0 the scaling factor S_B(x) is exp(-(2/3) + x^(3/2)), and is 1 for x<0. + + +File: gsl-ref.info, Node: Derivatives of Airy Functions, Next: Zeros of Airy Functions, Prev: Airy Functions, Up: Airy Functions and Derivatives + +7.4.2 Derivatives of Airy Functions +----------------------------------- + + -- Function: double gsl_sf_airy_Ai_deriv (double X, gsl_mode_t MODE) + -- Function: int gsl_sf_airy_Ai_deriv_e (double X, gsl_mode_t MODE, + gsl_sf_result * RESULT) + These routines compute the Airy function derivative Ai'(x) with an + accuracy specified by MODE. + + -- Function: double gsl_sf_airy_Bi_deriv (double X, gsl_mode_t MODE) + -- Function: int gsl_sf_airy_Bi_deriv_e (double X, gsl_mode_t MODE, + gsl_sf_result * RESULT) + These routines compute the Airy function derivative Bi'(x) with an + accuracy specified by MODE. + + -- Function: double gsl_sf_airy_Ai_deriv_scaled (double X, gsl_mode_t + MODE) + -- Function: int gsl_sf_airy_Ai_deriv_scaled_e (double X, gsl_mode_t + MODE, gsl_sf_result * RESULT) + These routines compute the scaled Airy function derivative S_A(x) + Ai'(x). For x>0 the scaling factor S_A(x) is \exp(+(2/3) + x^(3/2)), and is 1 for x<0. + + -- Function: double gsl_sf_airy_Bi_deriv_scaled (double X, gsl_mode_t + MODE) + -- Function: int gsl_sf_airy_Bi_deriv_scaled_e (double X, gsl_mode_t + MODE, gsl_sf_result * RESULT) + These routines compute the scaled Airy function derivative S_B(x) + Bi'(x). For x>0 the scaling factor S_B(x) is exp(-(2/3) x^(3/2)), + and is 1 for x<0. + + +File: gsl-ref.info, Node: Zeros of Airy Functions, Next: Zeros of Derivatives of Airy Functions, Prev: Derivatives of Airy Functions, Up: Airy Functions and Derivatives + +7.4.3 Zeros of Airy Functions +----------------------------- + + -- Function: double gsl_sf_airy_zero_Ai (unsigned int S) + -- Function: int gsl_sf_airy_zero_Ai_e (unsigned int S, gsl_sf_result + * RESULT) + These routines compute the location of the S-th zero of the Airy + function Ai(x). + + -- Function: double gsl_sf_airy_zero_Bi (unsigned int S) + -- Function: int gsl_sf_airy_zero_Bi_e (unsigned int S, gsl_sf_result + * RESULT) + These routines compute the location of the S-th zero of the Airy + function Bi(x). + + +File: gsl-ref.info, Node: Zeros of Derivatives of Airy Functions, Prev: Zeros of Airy Functions, Up: Airy Functions and Derivatives + +7.4.4 Zeros of Derivatives of Airy Functions +-------------------------------------------- + + -- Function: double gsl_sf_airy_zero_Ai_deriv (unsigned int S) + -- Function: int gsl_sf_airy_zero_Ai_deriv_e (unsigned int S, + gsl_sf_result * RESULT) + These routines compute the location of the S-th zero of the Airy + function derivative Ai'(x). + + -- Function: double gsl_sf_airy_zero_Bi_deriv (unsigned int S) + -- Function: int gsl_sf_airy_zero_Bi_deriv_e (unsigned int S, + gsl_sf_result * RESULT) + These routines compute the location of the S-th zero of the Airy + function derivative Bi'(x). + + +File: gsl-ref.info, Node: Bessel Functions, Next: Clausen Functions, Prev: Airy Functions and Derivatives, Up: Special Functions + +7.5 Bessel Functions +==================== + +The routines described in this section compute the Cylindrical Bessel +functions J_n(x), Y_n(x), Modified cylindrical Bessel functions I_n(x), +K_n(x), Spherical Bessel functions j_l(x), y_l(x), and Modified +Spherical Bessel functions i_l(x), k_l(x). For more information see +Abramowitz & Stegun, Chapters 9 and 10. The Bessel functions are +defined in the header file `gsl_sf_bessel.h'. + +* Menu: + +* Regular Cylindrical Bessel Functions:: +* Irregular Cylindrical Bessel Functions:: +* Regular Modified Cylindrical Bessel Functions:: +* Irregular Modified Cylindrical Bessel Functions:: +* Regular Spherical Bessel Functions:: +* Irregular Spherical Bessel Functions:: +* Regular Modified Spherical Bessel Functions:: +* Irregular Modified Spherical Bessel Functions:: +* Regular Bessel Function - Fractional Order:: +* Irregular Bessel Functions - Fractional Order:: +* Regular Modified Bessel Functions - Fractional Order:: +* Irregular Modified Bessel Functions - Fractional Order:: +* Zeros of Regular Bessel Functions:: + + +File: gsl-ref.info, Node: Regular Cylindrical Bessel Functions, Next: Irregular Cylindrical Bessel Functions, Up: Bessel Functions + +7.5.1 Regular Cylindrical Bessel Functions +------------------------------------------ + + -- Function: double gsl_sf_bessel_J0 (double X) + -- Function: int gsl_sf_bessel_J0_e (double X, gsl_sf_result * RESULT) + These routines compute the regular cylindrical Bessel function of + zeroth order, J_0(x). + + -- Function: double gsl_sf_bessel_J1 (double X) + -- Function: int gsl_sf_bessel_J1_e (double X, gsl_sf_result * RESULT) + These routines compute the regular cylindrical Bessel function of + first order, J_1(x). + + -- Function: double gsl_sf_bessel_Jn (int N, double X) + -- Function: int gsl_sf_bessel_Jn_e (int N, double X, gsl_sf_result * + RESULT) + These routines compute the regular cylindrical Bessel function of + order N, J_n(x). + + -- Function: int gsl_sf_bessel_Jn_array (int NMIN, int NMAX, double X, + double RESULT_ARRAY[]) + This routine computes the values of the regular cylindrical Bessel + functions J_n(x) for n from NMIN to NMAX inclusive, storing the + results in the array RESULT_ARRAY. The values are computed using + recurrence relations for efficiency, and therefore may differ + slightly from the exact values. + + +File: gsl-ref.info, Node: Irregular Cylindrical Bessel Functions, Next: Regular Modified Cylindrical Bessel Functions, Prev: Regular Cylindrical Bessel Functions, Up: Bessel Functions + +7.5.2 Irregular Cylindrical Bessel Functions +-------------------------------------------- + + -- Function: double gsl_sf_bessel_Y0 (double X) + -- Function: int gsl_sf_bessel_Y0_e (double X, gsl_sf_result * RESULT) + These routines compute the irregular cylindrical Bessel function + of zeroth order, Y_0(x), for x>0. + + -- Function: double gsl_sf_bessel_Y1 (double X) + -- Function: int gsl_sf_bessel_Y1_e (double X, gsl_sf_result * RESULT) + These routines compute the irregular cylindrical Bessel function + of first order, Y_1(x), for x>0. + + -- Function: double gsl_sf_bessel_Yn (int N,double X) + -- Function: int gsl_sf_bessel_Yn_e (int N,double X, gsl_sf_result * + RESULT) + These routines compute the irregular cylindrical Bessel function of + order N, Y_n(x), for x>0. + + -- Function: int gsl_sf_bessel_Yn_array (int NMIN, int NMAX, double X, + double RESULT_ARRAY[]) + This routine computes the values of the irregular cylindrical + Bessel functions Y_n(x) for n from NMIN to NMAX inclusive, storing + the results in the array RESULT_ARRAY. The domain of the function + is x>0. The values are computed using recurrence relations for + efficiency, and therefore may differ slightly from the exact + values. + + +File: gsl-ref.info, Node: Regular Modified Cylindrical Bessel Functions, Next: Irregular Modified Cylindrical Bessel Functions, Prev: Irregular Cylindrical Bessel Functions, Up: Bessel Functions + +7.5.3 Regular Modified Cylindrical Bessel Functions +--------------------------------------------------- + + -- Function: double gsl_sf_bessel_I0 (double X) + -- Function: int gsl_sf_bessel_I0_e (double X, gsl_sf_result * RESULT) + These routines compute the regular modified cylindrical Bessel + function of zeroth order, I_0(x). + + -- Function: double gsl_sf_bessel_I1 (double X) + -- Function: int gsl_sf_bessel_I1_e (double X, gsl_sf_result * RESULT) + These routines compute the regular modified cylindrical Bessel + function of first order, I_1(x). + + -- Function: double gsl_sf_bessel_In (int N, double X) + -- Function: int gsl_sf_bessel_In_e (int N, double X, gsl_sf_result * + RESULT) + These routines compute the regular modified cylindrical Bessel + function of order N, I_n(x). + + -- Function: int gsl_sf_bessel_In_array (int NMIN, int NMAX, double X, + double RESULT_ARRAY[]) + This routine computes the values of the regular modified + cylindrical Bessel functions I_n(x) for n from NMIN to NMAX + inclusive, storing the results in the array RESULT_ARRAY. The + start of the range NMIN must be positive or zero. The values are + computed using recurrence relations for efficiency, and therefore + may differ slightly from the exact values. + + -- Function: double gsl_sf_bessel_I0_scaled (double X) + -- Function: int gsl_sf_bessel_I0_scaled_e (double X, gsl_sf_result * + RESULT) + These routines compute the scaled regular modified cylindrical + Bessel function of zeroth order \exp(-|x|) I_0(x). + + -- Function: double gsl_sf_bessel_I1_scaled (double X) + -- Function: int gsl_sf_bessel_I1_scaled_e (double X, gsl_sf_result * + RESULT) + These routines compute the scaled regular modified cylindrical + Bessel function of first order \exp(-|x|) I_1(x). + + -- Function: double gsl_sf_bessel_In_scaled (int N, double X) + -- Function: int gsl_sf_bessel_In_scaled_e (int N, double X, + gsl_sf_result * RESULT) + These routines compute the scaled regular modified cylindrical + Bessel function of order N, \exp(-|x|) I_n(x) + + -- Function: int gsl_sf_bessel_In_scaled_array (int NMIN, int NMAX, + double X, double RESULT_ARRAY[]) + This routine computes the values of the scaled regular cylindrical + Bessel functions \exp(-|x|) I_n(x) for n from NMIN to NMAX + inclusive, storing the results in the array RESULT_ARRAY. The + start of the range NMIN must be positive or zero. The values are + computed using recurrence relations for efficiency, and therefore + may differ slightly from the exact values. + + +File: gsl-ref.info, Node: Irregular Modified Cylindrical Bessel Functions, Next: Regular Spherical Bessel Functions, Prev: Regular Modified Cylindrical Bessel Functions, Up: Bessel Functions + +7.5.4 Irregular Modified Cylindrical Bessel Functions +----------------------------------------------------- + + -- Function: double gsl_sf_bessel_K0 (double X) + -- Function: int gsl_sf_bessel_K0_e (double X, gsl_sf_result * RESULT) + These routines compute the irregular modified cylindrical Bessel + function of zeroth order, K_0(x), for x > 0. + + -- Function: double gsl_sf_bessel_K1 (double X) + -- Function: int gsl_sf_bessel_K1_e (double X, gsl_sf_result * RESULT) + These routines compute the irregular modified cylindrical Bessel + function of first order, K_1(x), for x > 0. + + -- Function: double gsl_sf_bessel_Kn (int N, double X) + -- Function: int gsl_sf_bessel_Kn_e (int N, double X, gsl_sf_result * + RESULT) + These routines compute the irregular modified cylindrical Bessel + function of order N, K_n(x), for x > 0. + + -- Function: int gsl_sf_bessel_Kn_array (int NMIN, int NMAX, double X, + double RESULT_ARRAY[]) + This routine computes the values of the irregular modified + cylindrical Bessel functions K_n(x) for n from NMIN to NMAX + inclusive, storing the results in the array RESULT_ARRAY. The + start of the range NMIN must be positive or zero. The domain of + the function is x>0. The values are computed using recurrence + relations for efficiency, and therefore may differ slightly from + the exact values. + + -- Function: double gsl_sf_bessel_K0_scaled (double X) + -- Function: int gsl_sf_bessel_K0_scaled_e (double X, gsl_sf_result * + RESULT) + These routines compute the scaled irregular modified cylindrical + Bessel function of zeroth order \exp(x) K_0(x) for x>0. + + -- Function: double gsl_sf_bessel_K1_scaled (double X) + -- Function: int gsl_sf_bessel_K1_scaled_e (double X, gsl_sf_result * + RESULT) + These routines compute the scaled irregular modified cylindrical + Bessel function of first order \exp(x) K_1(x) for x>0. + + -- Function: double gsl_sf_bessel_Kn_scaled (int N, double X) + -- Function: int gsl_sf_bessel_Kn_scaled_e (int N, double X, + gsl_sf_result * RESULT) + These routines compute the scaled irregular modified cylindrical + Bessel function of order N, \exp(x) K_n(x), for x>0. + + -- Function: int gsl_sf_bessel_Kn_scaled_array (int NMIN, int NMAX, + double X, double RESULT_ARRAY[]) + This routine computes the values of the scaled irregular + cylindrical Bessel functions \exp(x) K_n(x) for n from NMIN to + NMAX inclusive, storing the results in the array RESULT_ARRAY. The + start of the range NMIN must be positive or zero. The domain of + the function is x>0. The values are computed using recurrence + relations for efficiency, and therefore may differ slightly from + the exact values. + + +File: gsl-ref.info, Node: Regular Spherical Bessel Functions, Next: Irregular Spherical Bessel Functions, Prev: Irregular Modified Cylindrical Bessel Functions, Up: Bessel Functions + +7.5.5 Regular Spherical Bessel Functions +---------------------------------------- + + -- Function: double gsl_sf_bessel_j0 (double X) + -- Function: int gsl_sf_bessel_j0_e (double X, gsl_sf_result * RESULT) + These routines compute the regular spherical Bessel function of + zeroth order, j_0(x) = \sin(x)/x. + + -- Function: double gsl_sf_bessel_j1 (double X) + -- Function: int gsl_sf_bessel_j1_e (double X, gsl_sf_result * RESULT) + These routines compute the regular spherical Bessel function of + first order, j_1(x) = (\sin(x)/x - \cos(x))/x. + + -- Function: double gsl_sf_bessel_j2 (double X) + -- Function: int gsl_sf_bessel_j2_e (double X, gsl_sf_result * RESULT) + These routines compute the regular spherical Bessel function of + second order, j_2(x) = ((3/x^2 - 1)\sin(x) - 3\cos(x)/x)/x. + + -- Function: double gsl_sf_bessel_jl (int L, double X) + -- Function: int gsl_sf_bessel_jl_e (int L, double X, gsl_sf_result * + RESULT) + These routines compute the regular spherical Bessel function of + order L, j_l(x), for l >= 0 and x >= 0. + + -- Function: int gsl_sf_bessel_jl_array (int LMAX, double X, double + RESULT_ARRAY[]) + This routine computes the values of the regular spherical Bessel + functions j_l(x) for l from 0 to LMAX inclusive for lmax >= 0 and + x >= 0, storing the results in the array RESULT_ARRAY. The values + are computed using recurrence relations for efficiency, and + therefore may differ slightly from the exact values. + + -- Function: int gsl_sf_bessel_jl_steed_array (int LMAX, double X, + double * JL_X_ARRAY) + This routine uses Steed's method to compute the values of the + regular spherical Bessel functions j_l(x) for l from 0 to LMAX + inclusive for lmax >= 0 and x >= 0, storing the results in the + array RESULT_ARRAY. The Steed/Barnett algorithm is described in + `Comp. Phys. Comm.' 21, 297 (1981). Steed's method is more stable + than the recurrence used in the other functions but is also slower. + + +File: gsl-ref.info, Node: Irregular Spherical Bessel Functions, Next: Regular Modified Spherical Bessel Functions, Prev: Regular Spherical Bessel Functions, Up: Bessel Functions + +7.5.6 Irregular Spherical Bessel Functions +------------------------------------------ + + -- Function: double gsl_sf_bessel_y0 (double X) + -- Function: int gsl_sf_bessel_y0_e (double X, gsl_sf_result * RESULT) + These routines compute the irregular spherical Bessel function of + zeroth order, y_0(x) = -\cos(x)/x. + + -- Function: double gsl_sf_bessel_y1 (double X) + -- Function: int gsl_sf_bessel_y1_e (double X, gsl_sf_result * RESULT) + These routines compute the irregular spherical Bessel function of + first order, y_1(x) = -(\cos(x)/x + \sin(x))/x. + + -- Function: double gsl_sf_bessel_y2 (double X) + -- Function: int gsl_sf_bessel_y2_e (double X, gsl_sf_result * RESULT) + These routines compute the irregular spherical Bessel function of + second order, y_2(x) = (-3/x^3 + 1/x)\cos(x) - (3/x^2)\sin(x). + + -- Function: double gsl_sf_bessel_yl (int L, double X) + -- Function: int gsl_sf_bessel_yl_e (int L, double X, gsl_sf_result * + RESULT) + These routines compute the irregular spherical Bessel function of + order L, y_l(x), for l >= 0. + + -- Function: int gsl_sf_bessel_yl_array (int LMAX, double X, double + RESULT_ARRAY[]) + This routine computes the values of the irregular spherical Bessel + functions y_l(x) for l from 0 to LMAX inclusive for lmax >= 0, + storing the results in the array RESULT_ARRAY. The values are + computed using recurrence relations for efficiency, and therefore + may differ slightly from the exact values. + + +File: gsl-ref.info, Node: Regular Modified Spherical Bessel Functions, Next: Irregular Modified Spherical Bessel Functions, Prev: Irregular Spherical Bessel Functions, Up: Bessel Functions + +7.5.7 Regular Modified Spherical Bessel Functions +------------------------------------------------- + +The regular modified spherical Bessel functions i_l(x) are related to +the modified Bessel functions of fractional order, i_l(x) = +\sqrt{\pi/(2x)} I_{l+1/2}(x) + + -- Function: double gsl_sf_bessel_i0_scaled (double X) + -- Function: int gsl_sf_bessel_i0_scaled_e (double X, gsl_sf_result * + RESULT) + These routines compute the scaled regular modified spherical Bessel + function of zeroth order, \exp(-|x|) i_0(x). + + -- Function: double gsl_sf_bessel_i1_scaled (double X) + -- Function: int gsl_sf_bessel_i1_scaled_e (double X, gsl_sf_result * + RESULT) + These routines compute the scaled regular modified spherical Bessel + function of first order, \exp(-|x|) i_1(x). + + -- Function: double gsl_sf_bessel_i2_scaled (double X) + -- Function: int gsl_sf_bessel_i2_scaled_e (double X, gsl_sf_result * + RESULT) + These routines compute the scaled regular modified spherical Bessel + function of second order, \exp(-|x|) i_2(x) + + -- Function: double gsl_sf_bessel_il_scaled (int L, double X) + -- Function: int gsl_sf_bessel_il_scaled_e (int L, double X, + gsl_sf_result * RESULT) + These routines compute the scaled regular modified spherical Bessel + function of order L, \exp(-|x|) i_l(x) + + -- Function: int gsl_sf_bessel_il_scaled_array (int LMAX, double X, + double RESULT_ARRAY[]) + This routine computes the values of the scaled regular modified + cylindrical Bessel functions \exp(-|x|) i_l(x) for l from 0 to + LMAX inclusive for lmax >= 0, storing the results in the array + RESULT_ARRAY. The values are computed using recurrence relations + for efficiency, and therefore may differ slightly from the exact + values. + + +File: gsl-ref.info, Node: Irregular Modified Spherical Bessel Functions, Next: Regular Bessel Function - Fractional Order, Prev: Regular Modified Spherical Bessel Functions, Up: Bessel Functions + +7.5.8 Irregular Modified Spherical Bessel Functions +--------------------------------------------------- + +The irregular modified spherical Bessel functions k_l(x) are related to +the irregular modified Bessel functions of fractional order, k_l(x) = +\sqrt{\pi/(2x)} K_{l+1/2}(x). + + -- Function: double gsl_sf_bessel_k0_scaled (double X) + -- Function: int gsl_sf_bessel_k0_scaled_e (double X, gsl_sf_result * + RESULT) + These routines compute the scaled irregular modified spherical + Bessel function of zeroth order, \exp(x) k_0(x), for x>0. + + -- Function: double gsl_sf_bessel_k1_scaled (double X) + -- Function: int gsl_sf_bessel_k1_scaled_e (double X, gsl_sf_result * + RESULT) + These routines compute the scaled irregular modified spherical + Bessel function of first order, \exp(x) k_1(x), for x>0. + + -- Function: double gsl_sf_bessel_k2_scaled (double X) + -- Function: int gsl_sf_bessel_k2_scaled_e (double X, gsl_sf_result * + RESULT) + These routines compute the scaled irregular modified spherical + Bessel function of second order, \exp(x) k_2(x), for x>0. + + -- Function: double gsl_sf_bessel_kl_scaled (int L, double X) + -- Function: int gsl_sf_bessel_kl_scaled_e (int L, double X, + gsl_sf_result * RESULT) + These routines compute the scaled irregular modified spherical + Bessel function of order L, \exp(x) k_l(x), for x>0. + + -- Function: int gsl_sf_bessel_kl_scaled_array (int LMAX, double X, + double RESULT_ARRAY[]) + This routine computes the values of the scaled irregular modified + spherical Bessel functions \exp(x) k_l(x) for l from 0 to LMAX + inclusive for lmax >= 0 and x>0, storing the results in the array + RESULT_ARRAY. The values are computed using recurrence relations + for efficiency, and therefore may differ slightly from the exact + values. + + +File: gsl-ref.info, Node: Regular Bessel Function - Fractional Order, Next: Irregular Bessel Functions - Fractional Order, Prev: Irregular Modified Spherical Bessel Functions, Up: Bessel Functions + +7.5.9 Regular Bessel Function--Fractional Order +----------------------------------------------- + + -- Function: double gsl_sf_bessel_Jnu (double NU, double X) + -- Function: int gsl_sf_bessel_Jnu_e (double NU, double X, + gsl_sf_result * RESULT) + These routines compute the regular cylindrical Bessel function of + fractional order \nu, J_\nu(x). + + -- Function: int gsl_sf_bessel_sequence_Jnu_e (double NU, gsl_mode_t + MODE, size_t SIZE, double V[]) + This function computes the regular cylindrical Bessel function of + fractional order \nu, J_\nu(x), evaluated at a series of x values. + The array V of length SIZE contains the x values. They are + assumed to be strictly ordered and positive. The array is + over-written with the values of J_\nu(x_i). + + +File: gsl-ref.info, Node: Irregular Bessel Functions - Fractional Order, Next: Regular Modified Bessel Functions - Fractional Order, Prev: Regular Bessel Function - Fractional Order, Up: Bessel Functions + +7.5.10 Irregular Bessel Functions--Fractional Order +--------------------------------------------------- + + -- Function: double gsl_sf_bessel_Ynu (double NU, double X) + -- Function: int gsl_sf_bessel_Ynu_e (double NU, double X, + gsl_sf_result * RESULT) + These routines compute the irregular cylindrical Bessel function of + fractional order \nu, Y_\nu(x). + + +File: gsl-ref.info, Node: Regular Modified Bessel Functions - Fractional Order, Next: Irregular Modified Bessel Functions - Fractional Order, Prev: Irregular Bessel Functions - Fractional Order, Up: Bessel Functions + +7.5.11 Regular Modified Bessel Functions--Fractional Order +---------------------------------------------------------- + + -- Function: double gsl_sf_bessel_Inu (double NU, double X) + -- Function: int gsl_sf_bessel_Inu_e (double NU, double X, + gsl_sf_result * RESULT) + These routines compute the regular modified Bessel function of + fractional order \nu, I_\nu(x) for x>0, \nu>0. + + -- Function: double gsl_sf_bessel_Inu_scaled (double NU, double X) + -- Function: int gsl_sf_bessel_Inu_scaled_e (double NU, double X, + gsl_sf_result * RESULT) + These routines compute the scaled regular modified Bessel function + of fractional order \nu, \exp(-|x|)I_\nu(x) for x>0, \nu>0. + + +File: gsl-ref.info, Node: Irregular Modified Bessel Functions - Fractional Order, Next: Zeros of Regular Bessel Functions, Prev: Regular Modified Bessel Functions - Fractional Order, Up: Bessel Functions + +7.5.12 Irregular Modified Bessel Functions--Fractional Order +------------------------------------------------------------ + + -- Function: double gsl_sf_bessel_Knu (double NU, double X) + -- Function: int gsl_sf_bessel_Knu_e (double NU, double X, + gsl_sf_result * RESULT) + These routines compute the irregular modified Bessel function of + fractional order \nu, K_\nu(x) for x>0, \nu>0. + + -- Function: double gsl_sf_bessel_lnKnu (double NU, double X) + -- Function: int gsl_sf_bessel_lnKnu_e (double NU, double X, + gsl_sf_result * RESULT) + These routines compute the logarithm of the irregular modified + Bessel function of fractional order \nu, \ln(K_\nu(x)) for x>0, + \nu>0. + + -- Function: double gsl_sf_bessel_Knu_scaled (double NU, double X) + -- Function: int gsl_sf_bessel_Knu_scaled_e (double NU, double X, + gsl_sf_result * RESULT) + These routines compute the scaled irregular modified Bessel + function of fractional order \nu, \exp(+|x|) K_\nu(x) for x>0, + \nu>0. + + +File: gsl-ref.info, Node: Zeros of Regular Bessel Functions, Prev: Irregular Modified Bessel Functions - Fractional Order, Up: Bessel Functions + +7.5.13 Zeros of Regular Bessel Functions +---------------------------------------- + + -- Function: double gsl_sf_bessel_zero_J0 (unsigned int S) + -- Function: int gsl_sf_bessel_zero_J0_e (unsigned int S, + gsl_sf_result * RESULT) + These routines compute the location of the S-th positive zero of + the Bessel function J_0(x). + + -- Function: double gsl_sf_bessel_zero_J1 (unsigned int S) + -- Function: int gsl_sf_bessel_zero_J1_e (unsigned int S, + gsl_sf_result * RESULT) + These routines compute the location of the S-th positive zero of + the Bessel function J_1(x). + + -- Function: double gsl_sf_bessel_zero_Jnu (double NU, unsigned int S) + -- Function: int gsl_sf_bessel_zero_Jnu_e (double NU, unsigned int S, + gsl_sf_result * RESULT) + These routines compute the location of the S-th positive zero of + the Bessel function J_\nu(x). The current implementation does not + support negative values of NU. + + +File: gsl-ref.info, Node: Clausen Functions, Next: Coulomb Functions, Prev: Bessel Functions, Up: Special Functions + +7.6 Clausen Functions +===================== + +The Clausen function is defined by the following integral, + + Cl_2(x) = - \int_0^x dt \log(2 \sin(t/2)) + +It is related to the dilogarithm by Cl_2(\theta) = \Im +Li_2(\exp(i\theta)). The Clausen functions are declared in the header +file `gsl_sf_clausen.h'. + + -- Function: double gsl_sf_clausen (double X) + -- Function: int gsl_sf_clausen_e (double X, gsl_sf_result * RESULT) + These routines compute the Clausen integral Cl_2(x). + + +File: gsl-ref.info, Node: Coulomb Functions, Next: Coupling Coefficients, Prev: Clausen Functions, Up: Special Functions + +7.7 Coulomb Functions +===================== + +The prototypes of the Coulomb functions are declared in the header file +`gsl_sf_coulomb.h'. Both bound state and scattering solutions are +available. + +* Menu: + +* Normalized Hydrogenic Bound States:: +* Coulomb Wave Functions:: +* Coulomb Wave Function Normalization Constant:: + + +File: gsl-ref.info, Node: Normalized Hydrogenic Bound States, Next: Coulomb Wave Functions, Up: Coulomb Functions + +7.7.1 Normalized Hydrogenic Bound States +---------------------------------------- + + -- Function: double gsl_sf_hydrogenicR_1 (double Z, double R) + -- Function: int gsl_sf_hydrogenicR_1_e (double Z, double R, + gsl_sf_result * RESULT) + These routines compute the lowest-order normalized hydrogenic bound + state radial wavefunction R_1 := 2Z \sqrt{Z} \exp(-Z r). + + -- Function: double gsl_sf_hydrogenicR (int N, int L, double Z, double + R) + -- Function: int gsl_sf_hydrogenicR_e (int N, int L, double Z, double + R, gsl_sf_result * RESULT) + These routines compute the N-th normalized hydrogenic bound state + radial wavefunction, + + R_n := 2 (Z^{3/2}/n^2) \sqrt{(n-l-1)!/(n+l)!} \exp(-Z r/n) (2Zr/n)^l + L^{2l+1}_{n-l-1}(2Zr/n). + + where L^a_b(x) is the generalized Laguerre polynomial (*note + Laguerre Functions::). The normalization is chosen such that the + wavefunction \psi is given by \psi(n,l,r) = R_n Y_{lm}. + + +File: gsl-ref.info, Node: Coulomb Wave Functions, Next: Coulomb Wave Function Normalization Constant, Prev: Normalized Hydrogenic Bound States, Up: Coulomb Functions + +7.7.2 Coulomb Wave Functions +---------------------------- + +The Coulomb wave functions F_L(\eta,x), G_L(\eta,x) are described in +Abramowitz & Stegun, Chapter 14. Because there can be a large dynamic +range of values for these functions, overflows are handled gracefully. +If an overflow occurs, `GSL_EOVRFLW' is signalled and exponent(s) are +returned through the modifiable parameters EXP_F, EXP_G. The full +solution can be reconstructed from the following relations, + + F_L(eta,x) = fc[k_L] * exp(exp_F) + G_L(eta,x) = gc[k_L] * exp(exp_G) + + F_L'(eta,x) = fcp[k_L] * exp(exp_F) + G_L'(eta,x) = gcp[k_L] * exp(exp_G) + + + -- Function: int gsl_sf_coulomb_wave_FG_e (double ETA, double X, + double L_F, int K, gsl_sf_result * F, gsl_sf_result * FP, + gsl_sf_result * G, gsl_sf_result * GP, double * EXP_F, double + * EXP_G) + This function computes the Coulomb wave functions F_L(\eta,x), + G_{L-k}(\eta,x) and their derivatives F'_L(\eta,x), + G'_{L-k}(\eta,x) with respect to x. The parameters are restricted + to L, L-k > -1/2, x > 0 and integer k. Note that L itself is not + restricted to being an integer. The results are stored in the + parameters F, G for the function values and FP, GP for the + derivative values. If an overflow occurs, `GSL_EOVRFLW' is + returned and scaling exponents are stored in the modifiable + parameters EXP_F, EXP_G. + + -- Function: int gsl_sf_coulomb_wave_F_array (double L_MIN, int KMAX, + double ETA, double X, double FC_ARRAY[], double * F_EXPONENT) + This function computes the Coulomb wave function F_L(\eta,x) for L + = Lmin \dots Lmin + kmax, storing the results in FC_ARRAY. In the + case of overflow the exponent is stored in F_EXPONENT. + + -- Function: int gsl_sf_coulomb_wave_FG_array (double L_MIN, int KMAX, + double ETA, double X, double FC_ARRAY[], double GC_ARRAY[], + double * F_EXPONENT, double * G_EXPONENT) + This function computes the functions F_L(\eta,x), G_L(\eta,x) for + L = Lmin \dots Lmin + kmax storing the results in FC_ARRAY and + GC_ARRAY. In the case of overflow the exponents are stored in + F_EXPONENT and G_EXPONENT. + + -- Function: int gsl_sf_coulomb_wave_FGp_array (double L_MIN, int + KMAX, double ETA, double X, double FC_ARRAY[], double + FCP_ARRAY[], double GC_ARRAY[], double GCP_ARRAY[], double * + F_EXPONENT, double * G_EXPONENT) + This function computes the functions F_L(\eta,x), G_L(\eta,x) and + their derivatives F'_L(\eta,x), G'_L(\eta,x) for L = Lmin \dots + Lmin + kmax storing the results in FC_ARRAY, GC_ARRAY, FCP_ARRAY + and GCP_ARRAY. In the case of overflow the exponents are stored + in F_EXPONENT and G_EXPONENT. + + -- Function: int gsl_sf_coulomb_wave_sphF_array (double L_MIN, int + KMAX, double ETA, double X, double FC_ARRAY[], double + F_EXPONENT[]) + This function computes the Coulomb wave function divided by the + argument F_L(\eta, x)/x for L = Lmin \dots Lmin + kmax, storing the + results in FC_ARRAY. In the case of overflow the exponent is + stored in F_EXPONENT. This function reduces to spherical Bessel + functions in the limit \eta \to 0. + + +File: gsl-ref.info, Node: Coulomb Wave Function Normalization Constant, Prev: Coulomb Wave Functions, Up: Coulomb Functions + +7.7.3 Coulomb Wave Function Normalization Constant +-------------------------------------------------- + +The Coulomb wave function normalization constant is defined in +Abramowitz 14.1.7. + + -- Function: int gsl_sf_coulomb_CL_e (double L, double ETA, + gsl_sf_result * RESULT) + This function computes the Coulomb wave function normalization + constant C_L(\eta) for L > -1. + + -- Function: int gsl_sf_coulomb_CL_array (double LMIN, int KMAX, + double ETA, double CL[]) + This function computes the Coulomb wave function normalization + constant C_L(\eta) for L = Lmin \dots Lmin + kmax, Lmin > -1. + + +File: gsl-ref.info, Node: Coupling Coefficients, Next: Dawson Function, Prev: Coulomb Functions, Up: Special Functions + +7.8 Coupling Coefficients +========================= + +The Wigner 3-j, 6-j and 9-j symbols give the coupling coefficients for +combined angular momentum vectors. Since the arguments of the standard +coupling coefficient functions are integer or half-integer, the +arguments of the following functions are, by convention, integers equal +to twice the actual spin value. For information on the 3-j coefficients +see Abramowitz & Stegun, Section 27.9. The functions described in this +section are declared in the header file `gsl_sf_coupling.h'. + +* Menu: + +* 3-j Symbols:: +* 6-j Symbols:: +* 9-j Symbols:: + + +File: gsl-ref.info, Node: 3-j Symbols, Next: 6-j Symbols, Up: Coupling Coefficients + +7.8.1 3-j Symbols +----------------- + + -- Function: double gsl_sf_coupling_3j (int TWO_JA, int TWO_JB, int + TWO_JC, int TWO_MA, int TWO_MB, int TWO_MC) + -- Function: int gsl_sf_coupling_3j_e (int TWO_JA, int TWO_JB, int + TWO_JC, int TWO_MA, int TWO_MB, int TWO_MC, gsl_sf_result * + RESULT) + These routines compute the Wigner 3-j coefficient, + + (ja jb jc + ma mb mc) + + where the arguments are given in half-integer units, ja = + TWO_JA/2, ma = TWO_MA/2, etc. + + +File: gsl-ref.info, Node: 6-j Symbols, Next: 9-j Symbols, Prev: 3-j Symbols, Up: Coupling Coefficients + +7.8.2 6-j Symbols +----------------- + + -- Function: double gsl_sf_coupling_6j (int TWO_JA, int TWO_JB, int + TWO_JC, int TWO_JD, int TWO_JE, int TWO_JF) + -- Function: int gsl_sf_coupling_6j_e (int TWO_JA, int TWO_JB, int + TWO_JC, int TWO_JD, int TWO_JE, int TWO_JF, gsl_sf_result * + RESULT) + These routines compute the Wigner 6-j coefficient, + + {ja jb jc + jd je jf} + + where the arguments are given in half-integer units, ja = + TWO_JA/2, ma = TWO_MA/2, etc. + + +File: gsl-ref.info, Node: 9-j Symbols, Prev: 6-j Symbols, Up: Coupling Coefficients + +7.8.3 9-j Symbols +----------------- + + -- Function: double gsl_sf_coupling_9j (int TWO_JA, int TWO_JB, int + TWO_JC, int TWO_JD, int TWO_JE, int TWO_JF, int TWO_JG, int + TWO_JH, int TWO_JI) + -- Function: int gsl_sf_coupling_9j_e (int TWO_JA, int TWO_JB, int + TWO_JC, int TWO_JD, int TWO_JE, int TWO_JF, int TWO_JG, int + TWO_JH, int TWO_JI, gsl_sf_result * RESULT) + These routines compute the Wigner 9-j coefficient, + + {ja jb jc + jd je jf + jg jh ji} + + where the arguments are given in half-integer units, ja = + TWO_JA/2, ma = TWO_MA/2, etc. + + +File: gsl-ref.info, Node: Dawson Function, Next: Debye Functions, Prev: Coupling Coefficients, Up: Special Functions + +7.9 Dawson Function +=================== + +The Dawson integral is defined by \exp(-x^2) \int_0^x dt \exp(t^2). A +table of Dawson's integral can be found in Abramowitz & Stegun, Table +7.5. The Dawson functions are declared in the header file +`gsl_sf_dawson.h'. + + -- Function: double gsl_sf_dawson (double X) + -- Function: int gsl_sf_dawson_e (double X, gsl_sf_result * RESULT) + These routines compute the value of Dawson's integral for X. + + +File: gsl-ref.info, Node: Debye Functions, Next: Dilogarithm, Prev: Dawson Function, Up: Special Functions + +7.10 Debye Functions +==================== + +The Debye functions D_n(x) are defined by the following integral, + + D_n(x) = n/x^n \int_0^x dt (t^n/(e^t - 1)) + +For further information see Abramowitz & Stegun, Section 27.1. The +Debye functions are declared in the header file `gsl_sf_debye.h'. + + -- Function: double gsl_sf_debye_1 (double X) + -- Function: int gsl_sf_debye_1_e (double X, gsl_sf_result * RESULT) + These routines compute the first-order Debye function D_1(x) = + (1/x) \int_0^x dt (t/(e^t - 1)). + + -- Function: double gsl_sf_debye_2 (double X) + -- Function: int gsl_sf_debye_2_e (double X, gsl_sf_result * RESULT) + These routines compute the second-order Debye function D_2(x) = + (2/x^2) \int_0^x dt (t^2/(e^t - 1)). + + -- Function: double gsl_sf_debye_3 (double X) + -- Function: int gsl_sf_debye_3_e (double X, gsl_sf_result * RESULT) + These routines compute the third-order Debye function D_3(x) = + (3/x^3) \int_0^x dt (t^3/(e^t - 1)). + + -- Function: double gsl_sf_debye_4 (double X) + -- Function: int gsl_sf_debye_4_e (double X, gsl_sf_result * RESULT) + These routines compute the fourth-order Debye function D_4(x) = + (4/x^4) \int_0^x dt (t^4/(e^t - 1)). + + -- Function: double gsl_sf_debye_5 (double X) + -- Function: int gsl_sf_debye_5_e (double X, gsl_sf_result * RESULT) + These routines compute the fifth-order Debye function D_5(x) = + (5/x^5) \int_0^x dt (t^5/(e^t - 1)). + + -- Function: double gsl_sf_debye_6 (double X) + -- Function: int gsl_sf_debye_6_e (double X, gsl_sf_result * RESULT) + These routines compute the sixth-order Debye function D_6(x) = + (6/x^6) \int_0^x dt (t^6/(e^t - 1)). + + +File: gsl-ref.info, Node: Dilogarithm, Next: Elementary Operations, Prev: Debye Functions, Up: Special Functions + +7.11 Dilogarithm +================ + +The functions described in this section are declared in the header file +`gsl_sf_dilog.h'. + +* Menu: + +* Real Argument:: +* Complex Argument:: + + +File: gsl-ref.info, Node: Real Argument, Next: Complex Argument, Up: Dilogarithm + +7.11.1 Real Argument +-------------------- + + -- Function: double gsl_sf_dilog (double X) + -- Function: int gsl_sf_dilog_e (double X, gsl_sf_result * RESULT) + These routines compute the dilogarithm for a real argument. In + Lewin's notation this is Li_2(x), the real part of the dilogarithm + of a real x. It is defined by the integral representation Li_2(x) + = - \Re \int_0^x ds \log(1-s) / s. Note that \Im(Li_2(x)) = 0 for + x <= 1, and -\pi\log(x) for x > 1. + + + +File: gsl-ref.info, Node: Complex Argument, Prev: Real Argument, Up: Dilogarithm + +7.11.2 Complex Argument +----------------------- + + -- Function: int gsl_sf_complex_dilog_e (double R, double THETA, + gsl_sf_result * RESULT_RE, gsl_sf_result * RESULT_IM) + This function computes the full complex-valued dilogarithm for the + complex argument z = r \exp(i \theta). The real and imaginary + parts of the result are returned in RESULT_RE, RESULT_IM. + + +File: gsl-ref.info, Node: Elementary Operations, Next: Elliptic Integrals, Prev: Dilogarithm, Up: Special Functions + +7.12 Elementary Operations +========================== + +The following functions allow for the propagation of errors when +combining quantities by multiplication. The functions are declared in +the header file `gsl_sf_elementary.h'. + + -- Function: int gsl_sf_multiply_e (double X, double Y, gsl_sf_result + * RESULT) + This function multiplies X and Y storing the product and its + associated error in RESULT. + + -- Function: int gsl_sf_multiply_err_e (double X, double DX, double Y, + double DY, gsl_sf_result * RESULT) + This function multiplies X and Y with associated absolute errors + DX and DY. The product xy +/- xy \sqrt((dx/x)^2 +(dy/y)^2) is + stored in RESULT. + + +File: gsl-ref.info, Node: Elliptic Integrals, Next: Elliptic Functions (Jacobi), Prev: Elementary Operations, Up: Special Functions + +7.13 Elliptic Integrals +======================= + +The functions described in this section are declared in the header file +`gsl_sf_ellint.h'. Further information about the elliptic integrals +can be found in Abramowitz & Stegun, Chapter 17. + +* Menu: + +* Definition of Legendre Forms:: +* Definition of Carlson Forms:: +* Legendre Form of Complete Elliptic Integrals:: +* Legendre Form of Incomplete Elliptic Integrals:: +* Carlson Forms:: + + +File: gsl-ref.info, Node: Definition of Legendre Forms, Next: Definition of Carlson Forms, Up: Elliptic Integrals + +7.13.1 Definition of Legendre Forms +----------------------------------- + +The Legendre forms of elliptic integrals F(\phi,k), E(\phi,k) and +\Pi(\phi,k,n) are defined by, + + F(\phi,k) = \int_0^\phi dt 1/\sqrt((1 - k^2 \sin^2(t))) + + E(\phi,k) = \int_0^\phi dt \sqrt((1 - k^2 \sin^2(t))) + + Pi(\phi,k,n) = \int_0^\phi dt 1/((1 + n \sin^2(t))\sqrt(1 - k^2 \sin^2(t))) + +The complete Legendre forms are denoted by K(k) = F(\pi/2, k) and E(k) += E(\pi/2, k). + + The notation used here is based on Carlson, `Numerische Mathematik' +33 (1979) 1 and differs slightly from that used by Abramowitz & Stegun, +where the functions are given in terms of the parameter m = k^2 and n +is replaced by -n. + + +File: gsl-ref.info, Node: Definition of Carlson Forms, Next: Legendre Form of Complete Elliptic Integrals, Prev: Definition of Legendre Forms, Up: Elliptic Integrals + +7.13.2 Definition of Carlson Forms +---------------------------------- + +The Carlson symmetric forms of elliptical integrals RC(x,y), RD(x,y,z), +RF(x,y,z) and RJ(x,y,z,p) are defined by, + + RC(x,y) = 1/2 \int_0^\infty dt (t+x)^(-1/2) (t+y)^(-1) + + RD(x,y,z) = 3/2 \int_0^\infty dt (t+x)^(-1/2) (t+y)^(-1/2) (t+z)^(-3/2) + + RF(x,y,z) = 1/2 \int_0^\infty dt (t+x)^(-1/2) (t+y)^(-1/2) (t+z)^(-1/2) + + RJ(x,y,z,p) = 3/2 \int_0^\infty dt + (t+x)^(-1/2) (t+y)^(-1/2) (t+z)^(-1/2) (t+p)^(-1) + + +File: gsl-ref.info, Node: Legendre Form of Complete Elliptic Integrals, Next: Legendre Form of Incomplete Elliptic Integrals, Prev: Definition of Carlson Forms, Up: Elliptic Integrals + +7.13.3 Legendre Form of Complete Elliptic Integrals +--------------------------------------------------- + + -- Function: double gsl_sf_ellint_Kcomp (double K, gsl_mode_t MODE) + -- Function: int gsl_sf_ellint_Kcomp_e (double K, gsl_mode_t MODE, + gsl_sf_result * RESULT) + These routines compute the complete elliptic integral K(k) to the + accuracy specified by the mode variable MODE. Note that + Abramowitz & Stegun define this function in terms of the parameter + m = k^2. + + -- Function: double gsl_sf_ellint_Ecomp (double K, gsl_mode_t MODE) + -- Function: int gsl_sf_ellint_Ecomp_e (double K, gsl_mode_t MODE, + gsl_sf_result * RESULT) + These routines compute the complete elliptic integral E(k) to the + accuracy specified by the mode variable MODE. Note that + Abramowitz & Stegun define this function in terms of the parameter + m = k^2. + + -- Function: double gsl_sf_ellint_Pcomp (double K, double N, + gsl_mode_t MODE) + -- Function: int gsl_sf_ellint_Pcomp_e (double K, double N, gsl_mode_t + MODE, gsl_sf_result * RESULT) + These routines compute the complete elliptic integral \Pi(k,n) to + the accuracy specified by the mode variable MODE. Note that + Abramowitz & Stegun define this function in terms of the + parameters m = k^2 and \sin^2(\alpha) = k^2, with the change of + sign n \to -n. + + +File: gsl-ref.info, Node: Legendre Form of Incomplete Elliptic Integrals, Next: Carlson Forms, Prev: Legendre Form of Complete Elliptic Integrals, Up: Elliptic Integrals + +7.13.4 Legendre Form of Incomplete Elliptic Integrals +----------------------------------------------------- + + -- Function: double gsl_sf_ellint_F (double PHI, double K, gsl_mode_t + MODE) + -- Function: int gsl_sf_ellint_F_e (double PHI, double K, gsl_mode_t + MODE, gsl_sf_result * RESULT) + These routines compute the incomplete elliptic integral F(\phi,k) + to the accuracy specified by the mode variable MODE. Note that + Abramowitz & Stegun define this function in terms of the parameter + m = k^2. + + -- Function: double gsl_sf_ellint_E (double PHI, double K, gsl_mode_t + MODE) + -- Function: int gsl_sf_ellint_E_e (double PHI, double K, gsl_mode_t + MODE, gsl_sf_result * RESULT) + These routines compute the incomplete elliptic integral E(\phi,k) + to the accuracy specified by the mode variable MODE. Note that + Abramowitz & Stegun define this function in terms of the parameter + m = k^2. + + -- Function: double gsl_sf_ellint_P (double PHI, double K, double N, + gsl_mode_t MODE) + -- Function: int gsl_sf_ellint_P_e (double PHI, double K, double N, + gsl_mode_t MODE, gsl_sf_result * RESULT) + These routines compute the incomplete elliptic integral + \Pi(\phi,k,n) to the accuracy specified by the mode variable MODE. + Note that Abramowitz & Stegun define this function in terms of the + parameters m = k^2 and \sin^2(\alpha) = k^2, with the change of + sign n \to -n. + + -- Function: double gsl_sf_ellint_D (double PHI, double K, double N, + gsl_mode_t MODE) + -- Function: int gsl_sf_ellint_D_e (double PHI, double K, double N, + gsl_mode_t MODE, gsl_sf_result * RESULT) + These functions compute the incomplete elliptic integral D(\phi,k) + which is defined through the Carlson form RD(x,y,z) by the + following relation, + + D(\phi,k,n) = (1/3)(\sin(\phi))^3 RD (1-\sin^2(\phi), 1-k^2 \sin^2(\phi), 1). + The argument N is not used and will be removed in a future release. + + + +File: gsl-ref.info, Node: Carlson Forms, Prev: Legendre Form of Incomplete Elliptic Integrals, Up: Elliptic Integrals + +7.13.5 Carlson Forms +-------------------- + + -- Function: double gsl_sf_ellint_RC (double X, double Y, gsl_mode_t + MODE) + -- Function: int gsl_sf_ellint_RC_e (double X, double Y, gsl_mode_t + MODE, gsl_sf_result * RESULT) + These routines compute the incomplete elliptic integral RC(x,y) to + the accuracy specified by the mode variable MODE. + + -- Function: double gsl_sf_ellint_RD (double X, double Y, double Z, + gsl_mode_t MODE) + -- Function: int gsl_sf_ellint_RD_e (double X, double Y, double Z, + gsl_mode_t MODE, gsl_sf_result * RESULT) + These routines compute the incomplete elliptic integral RD(x,y,z) + to the accuracy specified by the mode variable MODE. + + -- Function: double gsl_sf_ellint_RF (double X, double Y, double Z, + gsl_mode_t MODE) + -- Function: int gsl_sf_ellint_RF_e (double X, double Y, double Z, + gsl_mode_t MODE, gsl_sf_result * RESULT) + These routines compute the incomplete elliptic integral RF(x,y,z) + to the accuracy specified by the mode variable MODE. + + -- Function: double gsl_sf_ellint_RJ (double X, double Y, double Z, + double P, gsl_mode_t MODE) + -- Function: int gsl_sf_ellint_RJ_e (double X, double Y, double Z, + double P, gsl_mode_t MODE, gsl_sf_result * RESULT) + These routines compute the incomplete elliptic integral RJ(x,y,z,p) + to the accuracy specified by the mode variable MODE. + + +File: gsl-ref.info, Node: Elliptic Functions (Jacobi), Next: Error Functions, Prev: Elliptic Integrals, Up: Special Functions + +7.14 Elliptic Functions (Jacobi) +================================ + +The Jacobian Elliptic functions are defined in Abramowitz & Stegun, +Chapter 16. The functions are declared in the header file +`gsl_sf_elljac.h'. + + -- Function: int gsl_sf_elljac_e (double U, double M, double * SN, + double * CN, double * DN) + This function computes the Jacobian elliptic functions sn(u|m), + cn(u|m), dn(u|m) by descending Landen transformations. + + +File: gsl-ref.info, Node: Error Functions, Next: Exponential Functions, Prev: Elliptic Functions (Jacobi), Up: Special Functions + +7.15 Error Functions +==================== + +The error function is described in Abramowitz & Stegun, Chapter 7. The +functions in this section are declared in the header file +`gsl_sf_erf.h'. + +* Menu: + +* Error Function:: +* Complementary Error Function:: +* Log Complementary Error Function:: +* Probability functions:: + + +File: gsl-ref.info, Node: Error Function, Next: Complementary Error Function, Up: Error Functions + +7.15.1 Error Function +--------------------- + + -- Function: double gsl_sf_erf (double X) + -- Function: int gsl_sf_erf_e (double X, gsl_sf_result * RESULT) + These routines compute the error function erf(x), where erf(x) = + (2/\sqrt(\pi)) \int_0^x dt \exp(-t^2). + + +File: gsl-ref.info, Node: Complementary Error Function, Next: Log Complementary Error Function, Prev: Error Function, Up: Error Functions + +7.15.2 Complementary Error Function +----------------------------------- + + -- Function: double gsl_sf_erfc (double X) + -- Function: int gsl_sf_erfc_e (double X, gsl_sf_result * RESULT) + These routines compute the complementary error function erfc(x) = + 1 - erf(x) = (2/\sqrt(\pi)) \int_x^\infty \exp(-t^2). + + +File: gsl-ref.info, Node: Log Complementary Error Function, Next: Probability functions, Prev: Complementary Error Function, Up: Error Functions + +7.15.3 Log Complementary Error Function +--------------------------------------- + + -- Function: double gsl_sf_log_erfc (double X) + -- Function: int gsl_sf_log_erfc_e (double X, gsl_sf_result * RESULT) + These routines compute the logarithm of the complementary error + function \log(\erfc(x)). + + +File: gsl-ref.info, Node: Probability functions, Prev: Log Complementary Error Function, Up: Error Functions + +7.15.4 Probability functions +---------------------------- + +The probability functions for the Normal or Gaussian distribution are +described in Abramowitz & Stegun, Section 26.2. + + -- Function: double gsl_sf_erf_Z (double X) + -- Function: int gsl_sf_erf_Z_e (double X, gsl_sf_result * RESULT) + These routines compute the Gaussian probability density function + Z(x) = (1/\sqrt{2\pi}) \exp(-x^2/2). + + -- Function: double gsl_sf_erf_Q (double X) + -- Function: int gsl_sf_erf_Q_e (double X, gsl_sf_result * RESULT) + These routines compute the upper tail of the Gaussian probability + function Q(x) = (1/\sqrt{2\pi}) \int_x^\infty dt \exp(-t^2/2). + + The "hazard function" for the normal distribution, also known as the +inverse Mill's ratio, is defined as, + + h(x) = Z(x)/Q(x) = \sqrt{2/\pi} \exp(-x^2 / 2) / \erfc(x/\sqrt 2) + +It decreases rapidly as x approaches -\infty and asymptotes to h(x) +\sim x as x approaches +\infty. + + -- Function: double gsl_sf_hazard (double X) + -- Function: int gsl_sf_hazard_e (double X, gsl_sf_result * RESULT) + These routines compute the hazard function for the normal + distribution. + + +File: gsl-ref.info, Node: Exponential Functions, Next: Exponential Integrals, Prev: Error Functions, Up: Special Functions + +7.16 Exponential Functions +========================== + +The functions described in this section are declared in the header file +`gsl_sf_exp.h'. + +* Menu: + +* Exponential Function:: +* Relative Exponential Functions:: +* Exponentiation With Error Estimate:: + + +File: gsl-ref.info, Node: Exponential Function, Next: Relative Exponential Functions, Up: Exponential Functions + +7.16.1 Exponential Function +--------------------------- + + -- Function: double gsl_sf_exp (double X) + -- Function: int gsl_sf_exp_e (double X, gsl_sf_result * RESULT) + These routines provide an exponential function \exp(x) using GSL + semantics and error checking. + + -- Function: int gsl_sf_exp_e10_e (double X, gsl_sf_result_e10 * + RESULT) + This function computes the exponential \exp(x) using the + `gsl_sf_result_e10' type to return a result with extended range. + This function may be useful if the value of \exp(x) would overflow + the numeric range of `double'. + + -- Function: double gsl_sf_exp_mult (double X, double Y) + -- Function: int gsl_sf_exp_mult_e (double X, double Y, gsl_sf_result + * RESULT) + These routines exponentiate X and multiply by the factor Y to + return the product y \exp(x). + + -- Function: int gsl_sf_exp_mult_e10_e (const double X, const double + Y, gsl_sf_result_e10 * RESULT) + This function computes the product y \exp(x) using the + `gsl_sf_result_e10' type to return a result with extended numeric + range. + + +File: gsl-ref.info, Node: Relative Exponential Functions, Next: Exponentiation With Error Estimate, Prev: Exponential Function, Up: Exponential Functions + +7.16.2 Relative Exponential Functions +------------------------------------- + + -- Function: double gsl_sf_expm1 (double X) + -- Function: int gsl_sf_expm1_e (double X, gsl_sf_result * RESULT) + These routines compute the quantity \exp(x)-1 using an algorithm + that is accurate for small x. + + -- Function: double gsl_sf_exprel (double X) + -- Function: int gsl_sf_exprel_e (double X, gsl_sf_result * RESULT) + These routines compute the quantity (\exp(x)-1)/x using an + algorithm that is accurate for small x. For small x the algorithm + is based on the expansion (\exp(x)-1)/x = 1 + x/2 + x^2/(2*3) + + x^3/(2*3*4) + \dots. + + -- Function: double gsl_sf_exprel_2 (double X) + -- Function: int gsl_sf_exprel_2_e (double X, gsl_sf_result * RESULT) + These routines compute the quantity 2(\exp(x)-1-x)/x^2 using an + algorithm that is accurate for small x. For small x the algorithm + is based on the expansion 2(\exp(x)-1-x)/x^2 = 1 + x/3 + x^2/(3*4) + + x^3/(3*4*5) + \dots. + + -- Function: double gsl_sf_exprel_n (int N, double X) + -- Function: int gsl_sf_exprel_n_e (int N, double X, gsl_sf_result * + RESULT) + These routines compute the N-relative exponential, which is the + N-th generalization of the functions `gsl_sf_exprel' and + `gsl_sf_exprel2'. The N-relative exponential is given by, + + exprel_N(x) = N!/x^N (\exp(x) - \sum_{k=0}^{N-1} x^k/k!) + = 1 + x/(N+1) + x^2/((N+1)(N+2)) + ... + = 1F1 (1,1+N,x) + + +File: gsl-ref.info, Node: Exponentiation With Error Estimate, Prev: Relative Exponential Functions, Up: Exponential Functions + +7.16.3 Exponentiation With Error Estimate +----------------------------------------- + + -- Function: int gsl_sf_exp_err_e (double X, double DX, gsl_sf_result + * RESULT) + This function exponentiates X with an associated absolute error DX. + + -- Function: int gsl_sf_exp_err_e10_e (double X, double DX, + gsl_sf_result_e10 * RESULT) + This function exponentiates a quantity X with an associated + absolute error DX using the `gsl_sf_result_e10' type to return a + result with extended range. + + -- Function: int gsl_sf_exp_mult_err_e (double X, double DX, double Y, + double DY, gsl_sf_result * RESULT) + This routine computes the product y \exp(x) for the quantities X, + Y with associated absolute errors DX, DY. + + -- Function: int gsl_sf_exp_mult_err_e10_e (double X, double DX, + double Y, double DY, gsl_sf_result_e10 * RESULT) + This routine computes the product y \exp(x) for the quantities X, + Y with associated absolute errors DX, DY using the + `gsl_sf_result_e10' type to return a result with extended range. + + +File: gsl-ref.info, Node: Exponential Integrals, Next: Fermi-Dirac Function, Prev: Exponential Functions, Up: Special Functions + +7.17 Exponential Integrals +========================== + +Information on the exponential integrals can be found in Abramowitz & +Stegun, Chapter 5. These functions are declared in the header file +`gsl_sf_expint.h'. + +* Menu: + +* Exponential Integral:: +* Ei(x):: +* Hyperbolic Integrals:: +* Ei_3(x):: +* Trigonometric Integrals:: +* Arctangent Integral:: + + +File: gsl-ref.info, Node: Exponential Integral, Next: Ei(x), Up: Exponential Integrals + +7.17.1 Exponential Integral +--------------------------- + + -- Function: double gsl_sf_expint_E1 (double X) + -- Function: int gsl_sf_expint_E1_e (double X, gsl_sf_result * RESULT) + These routines compute the exponential integral E_1(x), + + E_1(x) := \Re \int_1^\infty dt \exp(-xt)/t. + + + + -- Function: double gsl_sf_expint_E2 (double X) + -- Function: int gsl_sf_expint_E2_e (double X, gsl_sf_result * RESULT) + These routines compute the second-order exponential integral + E_2(x), + + E_2(x) := \Re \int_1^\infty dt \exp(-xt)/t^2. + + + + +File: gsl-ref.info, Node: Ei(x), Next: Hyperbolic Integrals, Prev: Exponential Integral, Up: Exponential Integrals + +7.17.2 Ei(x) +------------ + + -- Function: double gsl_sf_expint_Ei (double X) + -- Function: int gsl_sf_expint_Ei_e (double X, gsl_sf_result * RESULT) + These routines compute the exponential integral Ei(x), + + Ei(x) := - PV(\int_{-x}^\infty dt \exp(-t)/t) + + where PV denotes the principal value of the integral. + + +File: gsl-ref.info, Node: Hyperbolic Integrals, Next: Ei_3(x), Prev: Ei(x), Up: Exponential Integrals + +7.17.3 Hyperbolic Integrals +--------------------------- + + -- Function: double gsl_sf_Shi (double X) + -- Function: int gsl_sf_Shi_e (double X, gsl_sf_result * RESULT) + These routines compute the integral Shi(x) = \int_0^x dt + \sinh(t)/t. + + -- Function: double gsl_sf_Chi (double X) + -- Function: int gsl_sf_Chi_e (double X, gsl_sf_result * RESULT) + These routines compute the integral Chi(x) := \Re[ \gamma_E + + \log(x) + \int_0^x dt (\cosh[t]-1)/t] , where \gamma_E is the + Euler constant (available as the macro `M_EULER'). + + +File: gsl-ref.info, Node: Ei_3(x), Next: Trigonometric Integrals, Prev: Hyperbolic Integrals, Up: Exponential Integrals + +7.17.4 Ei_3(x) +-------------- + + -- Function: double gsl_sf_expint_3 (double X) + -- Function: int gsl_sf_expint_3_e (double X, gsl_sf_result * RESULT) + These routines compute the third-order exponential integral + Ei_3(x) = \int_0^xdt \exp(-t^3) for x >= 0. + + +File: gsl-ref.info, Node: Trigonometric Integrals, Next: Arctangent Integral, Prev: Ei_3(x), Up: Exponential Integrals + +7.17.5 Trigonometric Integrals +------------------------------ + + -- Function: double gsl_sf_Si (const double X) + -- Function: int gsl_sf_Si_e (double X, gsl_sf_result * RESULT) + These routines compute the Sine integral Si(x) = \int_0^x dt + \sin(t)/t. + + -- Function: double gsl_sf_Ci (const double X) + -- Function: int gsl_sf_Ci_e (double X, gsl_sf_result * RESULT) + These routines compute the Cosine integral Ci(x) = -\int_x^\infty + dt \cos(t)/t for x > 0. + + +File: gsl-ref.info, Node: Arctangent Integral, Prev: Trigonometric Integrals, Up: Exponential Integrals + +7.17.6 Arctangent Integral +-------------------------- + + -- Function: double gsl_sf_atanint (double X) + -- Function: int gsl_sf_atanint_e (double X, gsl_sf_result * RESULT) + These routines compute the Arctangent integral, which is defined + as AtanInt(x) = \int_0^x dt \arctan(t)/t. + + +File: gsl-ref.info, Node: Fermi-Dirac Function, Next: Gamma and Beta Functions, Prev: Exponential Integrals, Up: Special Functions + +7.18 Fermi-Dirac Function +========================= + +The functions described in this section are declared in the header file +`gsl_sf_fermi_dirac.h'. + +* Menu: + +* Complete Fermi-Dirac Integrals:: +* Incomplete Fermi-Dirac Integrals:: + + +File: gsl-ref.info, Node: Complete Fermi-Dirac Integrals, Next: Incomplete Fermi-Dirac Integrals, Up: Fermi-Dirac Function + +7.18.1 Complete Fermi-Dirac Integrals +------------------------------------- + +The complete Fermi-Dirac integral F_j(x) is given by, + + F_j(x) := (1/r\Gamma(j+1)) \int_0^\infty dt (t^j / (\exp(t-x) + 1)) + + -- Function: double gsl_sf_fermi_dirac_m1 (double X) + -- Function: int gsl_sf_fermi_dirac_m1_e (double X, gsl_sf_result * + RESULT) + These routines compute the complete Fermi-Dirac integral with an + index of -1. This integral is given by F_{-1}(x) = e^x / (1 + + e^x). + + -- Function: double gsl_sf_fermi_dirac_0 (double X) + -- Function: int gsl_sf_fermi_dirac_0_e (double X, gsl_sf_result * + RESULT) + These routines compute the complete Fermi-Dirac integral with an + index of 0. This integral is given by F_0(x) = \ln(1 + e^x). + + -- Function: double gsl_sf_fermi_dirac_1 (double X) + -- Function: int gsl_sf_fermi_dirac_1_e (double X, gsl_sf_result * + RESULT) + These routines compute the complete Fermi-Dirac integral with an + index of 1, F_1(x) = \int_0^\infty dt (t /(\exp(t-x)+1)). + + -- Function: double gsl_sf_fermi_dirac_2 (double X) + -- Function: int gsl_sf_fermi_dirac_2_e (double X, gsl_sf_result * + RESULT) + These routines compute the complete Fermi-Dirac integral with an + index of 2, F_2(x) = (1/2) \int_0^\infty dt (t^2 /(\exp(t-x)+1)). + + -- Function: double gsl_sf_fermi_dirac_int (int J, double X) + -- Function: int gsl_sf_fermi_dirac_int_e (int J, double X, + gsl_sf_result * RESULT) + These routines compute the complete Fermi-Dirac integral with an + integer index of j, F_j(x) = (1/\Gamma(j+1)) \int_0^\infty dt (t^j + /(\exp(t-x)+1)). + + -- Function: double gsl_sf_fermi_dirac_mhalf (double X) + -- Function: int gsl_sf_fermi_dirac_mhalf_e (double X, gsl_sf_result * + RESULT) + These routines compute the complete Fermi-Dirac integral + F_{-1/2}(x). + + -- Function: double gsl_sf_fermi_dirac_half (double X) + -- Function: int gsl_sf_fermi_dirac_half_e (double X, gsl_sf_result * + RESULT) + These routines compute the complete Fermi-Dirac integral + F_{1/2}(x). + + -- Function: double gsl_sf_fermi_dirac_3half (double X) + -- Function: int gsl_sf_fermi_dirac_3half_e (double X, gsl_sf_result * + RESULT) + These routines compute the complete Fermi-Dirac integral + F_{3/2}(x). + + +File: gsl-ref.info, Node: Incomplete Fermi-Dirac Integrals, Prev: Complete Fermi-Dirac Integrals, Up: Fermi-Dirac Function + +7.18.2 Incomplete Fermi-Dirac Integrals +--------------------------------------- + +The incomplete Fermi-Dirac integral F_j(x,b) is given by, + + F_j(x,b) := (1/\Gamma(j+1)) \int_b^\infty dt (t^j / (\Exp(t-x) + 1)) + + -- Function: double gsl_sf_fermi_dirac_inc_0 (double X, double B) + -- Function: int gsl_sf_fermi_dirac_inc_0_e (double X, double B, + gsl_sf_result * RESULT) + These routines compute the incomplete Fermi-Dirac integral with an + index of zero, F_0(x,b) = \ln(1 + e^{b-x}) - (b-x). + + +File: gsl-ref.info, Node: Gamma and Beta Functions, Next: Gegenbauer Functions, Prev: Fermi-Dirac Function, Up: Special Functions + +7.19 Gamma and Beta Functions +============================= + +The functions described in this section are declared in the header +file `gsl_sf_gamma.h'. + +* Menu: + +* Gamma Functions:: +* Factorials:: +* Pochhammer Symbol:: +* Incomplete Gamma Functions:: +* Beta Functions:: +* Incomplete Beta Function:: + + +File: gsl-ref.info, Node: Gamma Functions, Next: Factorials, Up: Gamma and Beta Functions + +7.19.1 Gamma Functions +---------------------- + +The Gamma function is defined by the following integral, + + \Gamma(x) = \int_0^\infty dt t^{x-1} \exp(-t) + +It is related to the factorial function by \Gamma(n)=(n-1)! for +positive integer n. Further information on the Gamma function can be +found in Abramowitz & Stegun, Chapter 6. The functions described in +this section are declared in the header file `gsl_sf_gamma.h'. + + -- Function: double gsl_sf_gamma (double X) + -- Function: int gsl_sf_gamma_e (double X, gsl_sf_result * RESULT) + These routines compute the Gamma function \Gamma(x), subject to x + not being a negative integer or zero. The function is computed + using the real Lanczos method. The maximum value of x such that + \Gamma(x) is not considered an overflow is given by the macro + `GSL_SF_GAMMA_XMAX' and is 171.0. + + -- Function: double gsl_sf_lngamma (double X) + -- Function: int gsl_sf_lngamma_e (double X, gsl_sf_result * RESULT) + These routines compute the logarithm of the Gamma function, + \log(\Gamma(x)), subject to x not being a negative integer or + zero. For x<0 the real part of \log(\Gamma(x)) is returned, which + is equivalent to \log(|\Gamma(x)|). The function is computed + using the real Lanczos method. + + -- Function: int gsl_sf_lngamma_sgn_e (double X, gsl_sf_result * + RESULT_LG, double * SGN) + This routine computes the sign of the gamma function and the + logarithm of its magnitude, subject to x not being a negative + integer or zero. The function is computed using the real Lanczos + method. The value of the gamma function can be reconstructed + using the relation \Gamma(x) = sgn * \exp(resultlg). + + -- Function: double gsl_sf_gammastar (double X) + -- Function: int gsl_sf_gammastar_e (double X, gsl_sf_result * RESULT) + These routines compute the regulated Gamma Function \Gamma^*(x) + for x > 0. The regulated gamma function is given by, + + \Gamma^*(x) = \Gamma(x)/(\sqrt{2\pi} x^{(x-1/2)} \exp(-x)) + = (1 + (1/12x) + ...) for x \to \infty + and is a useful suggestion of Temme. + + -- Function: double gsl_sf_gammainv (double X) + -- Function: int gsl_sf_gammainv_e (double X, gsl_sf_result * RESULT) + These routines compute the reciprocal of the gamma function, + 1/\Gamma(x) using the real Lanczos method. + + -- Function: int gsl_sf_lngamma_complex_e (double ZR, double ZI, + gsl_sf_result * LNR, gsl_sf_result * ARG) + This routine computes \log(\Gamma(z)) for complex z=z_r+i z_i and + z not a negative integer or zero, using the complex Lanczos + method. The returned parameters are lnr = \log|\Gamma(z)| and arg + = \arg(\Gamma(z)) in (-\pi,\pi]. Note that the phase part (ARG) + is not well-determined when |z| is very large, due to inevitable + roundoff in restricting to (-\pi,\pi]. This will result in a + `GSL_ELOSS' error when it occurs. The absolute value part (LNR), + however, never suffers from loss of precision. + + +File: gsl-ref.info, Node: Factorials, Next: Pochhammer Symbol, Prev: Gamma Functions, Up: Gamma and Beta Functions + +7.19.2 Factorials +----------------- + +Although factorials can be computed from the Gamma function, using the +relation n! = \Gamma(n+1) for non-negative integer n, it is usually +more efficient to call the functions in this section, particularly for +small values of n, whose factorial values are maintained in hardcoded +tables. + + -- Function: double gsl_sf_fact (unsigned int N) + -- Function: int gsl_sf_fact_e (unsigned int N, gsl_sf_result * RESULT) + These routines compute the factorial n!. The factorial is related + to the Gamma function by n! = \Gamma(n+1). The maximum value of n + such that n! is not considered an overflow is given by the macro + `GSL_SF_FACT_NMAX' and is 170. + + -- Function: double gsl_sf_doublefact (unsigned int N) + -- Function: int gsl_sf_doublefact_e (unsigned int N, gsl_sf_result * + RESULT) + These routines compute the double factorial n!! = n(n-2)(n-4) + \dots. The maximum value of n such that n!! is not considered an + overflow is given by the macro `GSL_SF_DOUBLEFACT_NMAX' and is 297. + + -- Function: double gsl_sf_lnfact (unsigned int N) + -- Function: int gsl_sf_lnfact_e (unsigned int N, gsl_sf_result * + RESULT) + These routines compute the logarithm of the factorial of N, + \log(n!). The algorithm is faster than computing \ln(\Gamma(n+1)) + via `gsl_sf_lngamma' for n < 170, but defers for larger N. + + -- Function: double gsl_sf_lndoublefact (unsigned int N) + -- Function: int gsl_sf_lndoublefact_e (unsigned int N, gsl_sf_result + * RESULT) + These routines compute the logarithm of the double factorial of N, + \log(n!!). + + -- Function: double gsl_sf_choose (unsigned int N, unsigned int M) + -- Function: int gsl_sf_choose_e (unsigned int N, unsigned int M, + gsl_sf_result * RESULT) + These routines compute the combinatorial factor `n choose m' = + n!/(m!(n-m)!) + + -- Function: double gsl_sf_lnchoose (unsigned int N, unsigned int M) + -- Function: int gsl_sf_lnchoose_e (unsigned int N, unsigned int M, + gsl_sf_result * RESULT) + These routines compute the logarithm of `n choose m'. This is + equivalent to the sum \log(n!) - \log(m!) - \log((n-m)!). + + -- Function: double gsl_sf_taylorcoeff (int N, double X) + -- Function: int gsl_sf_taylorcoeff_e (int N, double X, gsl_sf_result + * RESULT) + These routines compute the Taylor coefficient x^n / n! for x >= 0, + n >= 0. + + +File: gsl-ref.info, Node: Pochhammer Symbol, Next: Incomplete Gamma Functions, Prev: Factorials, Up: Gamma and Beta Functions + +7.19.3 Pochhammer Symbol +------------------------ + + -- Function: double gsl_sf_poch (double A, double X) + -- Function: int gsl_sf_poch_e (double A, double X, gsl_sf_result * + RESULT) + These routines compute the Pochhammer symbol (a)_x = \Gamma(a + + x)/\Gamma(a), subject to a and a+x not being negative integers or + zero. The Pochhammer symbol is also known as the Apell symbol and + sometimes written as (a,x). + + -- Function: double gsl_sf_lnpoch (double A, double X) + -- Function: int gsl_sf_lnpoch_e (double A, double X, gsl_sf_result * + RESULT) + These routines compute the logarithm of the Pochhammer symbol, + \log((a)_x) = \log(\Gamma(a + x)/\Gamma(a)) for a > 0, a+x > 0. + + -- Function: int gsl_sf_lnpoch_sgn_e (double A, double X, + gsl_sf_result * RESULT, double * SGN) + These routines compute the sign of the Pochhammer symbol and the + logarithm of its magnitude. The computed parameters are result = + \log(|(a)_x|) and sgn = \sgn((a)_x) where (a)_x = \Gamma(a + + x)/\Gamma(a), subject to a, a+x not being negative integers or + zero. + + -- Function: double gsl_sf_pochrel (double A, double X) + -- Function: int gsl_sf_pochrel_e (double A, double X, gsl_sf_result * + RESULT) + These routines compute the relative Pochhammer symbol ((a)_x - + 1)/x where (a)_x = \Gamma(a + x)/\Gamma(a). + + +File: gsl-ref.info, Node: Incomplete Gamma Functions, Next: Beta Functions, Prev: Pochhammer Symbol, Up: Gamma and Beta Functions + +7.19.4 Incomplete Gamma Functions +--------------------------------- + + -- Function: double gsl_sf_gamma_inc (double A, double X) + -- Function: int gsl_sf_gamma_inc_e (double A, double X, gsl_sf_result + * RESULT) + These functions compute the unnormalized incomplete Gamma Function + \Gamma(a,x) = \int_x^\infty dt t^{a-1} \exp(-t) for a real and x + >= 0. + + -- Function: double gsl_sf_gamma_inc_Q (double A, double X) + -- Function: int gsl_sf_gamma_inc_Q_e (double A, double X, + gsl_sf_result * RESULT) + These routines compute the normalized incomplete Gamma Function + Q(a,x) = 1/\Gamma(a) \int_x^\infty dt t^{a-1} \exp(-t) for a > 0, + x >= 0. + + -- Function: double gsl_sf_gamma_inc_P (double A, double X) + -- Function: int gsl_sf_gamma_inc_P_e (double A, double X, + gsl_sf_result * RESULT) + These routines compute the complementary normalized incomplete + Gamma Function P(a,x) = 1 - Q(a,x) = 1/\Gamma(a) \int_0^x dt + t^{a-1} \exp(-t) for a > 0, x >= 0. + + Note that Abramowitz & Stegun call P(a,x) the incomplete gamma + function (section 6.5). + + +File: gsl-ref.info, Node: Beta Functions, Next: Incomplete Beta Function, Prev: Incomplete Gamma Functions, Up: Gamma and Beta Functions + +7.19.5 Beta Functions +--------------------- + + -- Function: double gsl_sf_beta (double A, double B) + -- Function: int gsl_sf_beta_e (double A, double B, gsl_sf_result * + RESULT) + These routines compute the Beta Function, B(a,b) = + \Gamma(a)\Gamma(b)/\Gamma(a+b) subject to a and b not being + negative integers. + + -- Function: double gsl_sf_lnbeta (double A, double B) + -- Function: int gsl_sf_lnbeta_e (double A, double B, gsl_sf_result * + RESULT) + These routines compute the logarithm of the Beta Function, + \log(B(a,b)) subject to a and b not being negative integers. + + +File: gsl-ref.info, Node: Incomplete Beta Function, Prev: Beta Functions, Up: Gamma and Beta Functions + +7.19.6 Incomplete Beta Function +------------------------------- + + -- Function: double gsl_sf_beta_inc (double A, double B, double X) + -- Function: int gsl_sf_beta_inc_e (double A, double B, double X, + gsl_sf_result * RESULT) + These routines compute the normalized incomplete Beta function + I_x(a,b)=B_x(a,b)/B(a,b) where B_x(a,b) = \int_0^x t^{a-1} + (1-t)^{b-1} dt for a > 0, b > 0, and 0 <= x <= 1. + + +File: gsl-ref.info, Node: Gegenbauer Functions, Next: Hypergeometric Functions, Prev: Gamma and Beta Functions, Up: Special Functions + +7.20 Gegenbauer Functions +========================= + +The Gegenbauer polynomials are defined in Abramowitz & Stegun, Chapter +22, where they are known as Ultraspherical polynomials. The functions +described in this section are declared in the header file +`gsl_sf_gegenbauer.h'. + + -- Function: double gsl_sf_gegenpoly_1 (double LAMBDA, double X) + -- Function: double gsl_sf_gegenpoly_2 (double LAMBDA, double X) + -- Function: double gsl_sf_gegenpoly_3 (double LAMBDA, double X) + -- Function: int gsl_sf_gegenpoly_1_e (double LAMBDA, double X, + gsl_sf_result * RESULT) + -- Function: int gsl_sf_gegenpoly_2_e (double LAMBDA, double X, + gsl_sf_result * RESULT) + -- Function: int gsl_sf_gegenpoly_3_e (double LAMBDA, double X, + gsl_sf_result * RESULT) + These functions evaluate the Gegenbauer polynomials + C^{(\lambda)}_n(x) using explicit representations for n =1, 2, 3. + + -- Function: double gsl_sf_gegenpoly_n (int N, double LAMBDA, double X) + -- Function: int gsl_sf_gegenpoly_n_e (int N, double LAMBDA, double X, + gsl_sf_result * RESULT) + These functions evaluate the Gegenbauer polynomial + C^{(\lambda)}_n(x) for a specific value of N, LAMBDA, X subject to + \lambda > -1/2, n >= 0. + + -- Function: int gsl_sf_gegenpoly_array (int NMAX, double LAMBDA, + double X, double RESULT_ARRAY[]) + This function computes an array of Gegenbauer polynomials + C^{(\lambda)}_n(x) for n = 0, 1, 2, \dots, nmax, subject to + \lambda > -1/2, nmax >= 0. + + +File: gsl-ref.info, Node: Hypergeometric Functions, Next: Laguerre Functions, Prev: Gegenbauer Functions, Up: Special Functions + +7.21 Hypergeometric Functions +============================= + +Hypergeometric functions are described in Abramowitz & Stegun, Chapters +13 and 15. These functions are declared in the header file +`gsl_sf_hyperg.h'. + + -- Function: double gsl_sf_hyperg_0F1 (double C, double X) + -- Function: int gsl_sf_hyperg_0F1_e (double C, double X, + gsl_sf_result * RESULT) + These routines compute the hypergeometric function 0F1(c,x). + + -- Function: double gsl_sf_hyperg_1F1_int (int M, int N, double X) + -- Function: int gsl_sf_hyperg_1F1_int_e (int M, int N, double X, + gsl_sf_result * RESULT) + These routines compute the confluent hypergeometric function + 1F1(m,n,x) = M(m,n,x) for integer parameters M, N. + + -- Function: double gsl_sf_hyperg_1F1 (double A, double B, double X) + -- Function: int gsl_sf_hyperg_1F1_e (double A, double B, double X, + gsl_sf_result * RESULT) + These routines compute the confluent hypergeometric function + 1F1(a,b,x) = M(a,b,x) for general parameters A, B. + + -- Function: double gsl_sf_hyperg_U_int (int M, int N, double X) + -- Function: int gsl_sf_hyperg_U_int_e (int M, int N, double X, + gsl_sf_result * RESULT) + These routines compute the confluent hypergeometric function + U(m,n,x) for integer parameters M, N. + + -- Function: int gsl_sf_hyperg_U_int_e10_e (int M, int N, double X, + gsl_sf_result_e10 * RESULT) + This routine computes the confluent hypergeometric function + U(m,n,x) for integer parameters M, N using the `gsl_sf_result_e10' + type to return a result with extended range. + + -- Function: double gsl_sf_hyperg_U (double A, double B, double X) + -- Function: int gsl_sf_hyperg_U_e (double A, double B, double X, + gsl_sf_result * RESULT) + These routines compute the confluent hypergeometric function + U(a,b,x). + + -- Function: int gsl_sf_hyperg_U_e10_e (double A, double B, double X, + gsl_sf_result_e10 * RESULT) + This routine computes the confluent hypergeometric function + U(a,b,x) using the `gsl_sf_result_e10' type to return a result + with extended range. + + -- Function: double gsl_sf_hyperg_2F1 (double A, double B, double C, + double X) + -- Function: int gsl_sf_hyperg_2F1_e (double A, double B, double C, + double X, gsl_sf_result * RESULT) + These routines compute the Gauss hypergeometric function + 2F1(a,b,c,x) for |x| < 1. + + If the arguments (a,b,c,x) are too close to a singularity then the + function can return the error code `GSL_EMAXITER' when the series + approximation converges too slowly. This occurs in the region of + x=1, c - a - b = m for integer m. + + -- Function: double gsl_sf_hyperg_2F1_conj (double AR, double AI, + double C, double X) + -- Function: int gsl_sf_hyperg_2F1_conj_e (double AR, double AI, + double C, double X, gsl_sf_result * RESULT) + These routines compute the Gauss hypergeometric function 2F1(a_R + + i a_I, a_R - i a_I, c, x) with complex parameters for |x| < 1. + exceptions: + + -- Function: double gsl_sf_hyperg_2F1_renorm (double A, double B, + double C, double X) + -- Function: int gsl_sf_hyperg_2F1_renorm_e (double A, double B, + double C, double X, gsl_sf_result * RESULT) + These routines compute the renormalized Gauss hypergeometric + function 2F1(a,b,c,x) / \Gamma(c) for |x| < 1. + + -- Function: double gsl_sf_hyperg_2F1_conj_renorm (double AR, double + AI, double C, double X) + -- Function: int gsl_sf_hyperg_2F1_conj_renorm_e (double AR, double + AI, double C, double X, gsl_sf_result * RESULT) + These routines compute the renormalized Gauss hypergeometric + function 2F1(a_R + i a_I, a_R - i a_I, c, x) / \Gamma(c) for |x| < + 1. + + -- Function: double gsl_sf_hyperg_2F0 (double A, double B, double X) + -- Function: int gsl_sf_hyperg_2F0_e (double A, double B, double X, + gsl_sf_result * RESULT) + These routines compute the hypergeometric function 2F0(a,b,x). + The series representation is a divergent hypergeometric series. + However, for x < 0 we have 2F0(a,b,x) = (-1/x)^a U(a,1+a-b,-1/x) + + +File: gsl-ref.info, Node: Laguerre Functions, Next: Lambert W Functions, Prev: Hypergeometric Functions, Up: Special Functions + +7.22 Laguerre Functions +======================= + +The generalized Laguerre polynomials are defined in terms of confluent +hypergeometric functions as L^a_n(x) = ((a+1)_n / n!) 1F1(-n,a+1,x), +and are sometimes referred to as the associated Laguerre polynomials. +They are related to the plain Laguerre polynomials L_n(x) by L^0_n(x) = +L_n(x) and L^k_n(x) = (-1)^k (d^k/dx^k) L_(n+k)(x). For more +information see Abramowitz & Stegun, Chapter 22. + + The functions described in this section are declared in the header +file `gsl_sf_laguerre.h'. + + -- Function: double gsl_sf_laguerre_1 (double A, double X) + -- Function: double gsl_sf_laguerre_2 (double A, double X) + -- Function: double gsl_sf_laguerre_3 (double A, double X) + -- Function: int gsl_sf_laguerre_1_e (double A, double X, + gsl_sf_result * RESULT) + -- Function: int gsl_sf_laguerre_2_e (double A, double X, + gsl_sf_result * RESULT) + -- Function: int gsl_sf_laguerre_3_e (double A, double X, + gsl_sf_result * RESULT) + These routines evaluate the generalized Laguerre polynomials + L^a_1(x), L^a_2(x), L^a_3(x) using explicit representations. + + -- Function: double gsl_sf_laguerre_n (const int N, const double A, + const double X) + -- Function: int gsl_sf_laguerre_n_e (int N, double A, double X, + gsl_sf_result * RESULT) + These routines evaluate the generalized Laguerre polynomials + L^a_n(x) for a > -1, n >= 0. + + + +File: gsl-ref.info, Node: Lambert W Functions, Next: Legendre Functions and Spherical Harmonics, Prev: Laguerre Functions, Up: Special Functions + +7.23 Lambert W Functions +======================== + +Lambert's W functions, W(x), are defined to be solutions of the +equation W(x) \exp(W(x)) = x. This function has multiple branches for x +< 0; however, it has only two real-valued branches. We define W_0(x) to +be the principal branch, where W > -1 for x < 0, and W_{-1}(x) to be +the other real branch, where W < -1 for x < 0. The Lambert functions +are declared in the header file `gsl_sf_lambert.h'. + + -- Function: double gsl_sf_lambert_W0 (double X) + -- Function: int gsl_sf_lambert_W0_e (double X, gsl_sf_result * RESULT) + These compute the principal branch of the Lambert W function, + W_0(x). + + -- Function: double gsl_sf_lambert_Wm1 (double X) + -- Function: int gsl_sf_lambert_Wm1_e (double X, gsl_sf_result * + RESULT) + These compute the secondary real-valued branch of the Lambert W + function, W_{-1}(x). + + +File: gsl-ref.info, Node: Legendre Functions and Spherical Harmonics, Next: Logarithm and Related Functions, Prev: Lambert W Functions, Up: Special Functions + +7.24 Legendre Functions and Spherical Harmonics +=============================================== + +The Legendre Functions and Legendre Polynomials are described in +Abramowitz & Stegun, Chapter 8. These functions are declared in the +header file `gsl_sf_legendre.h'. + +* Menu: + +* Legendre Polynomials:: +* Associated Legendre Polynomials and Spherical Harmonics:: +* Conical Functions:: +* Radial Functions for Hyperbolic Space:: + + +File: gsl-ref.info, Node: Legendre Polynomials, Next: Associated Legendre Polynomials and Spherical Harmonics, Up: Legendre Functions and Spherical Harmonics + +7.24.1 Legendre Polynomials +--------------------------- + + -- Function: double gsl_sf_legendre_P1 (double X) + -- Function: double gsl_sf_legendre_P2 (double X) + -- Function: double gsl_sf_legendre_P3 (double X) + -- Function: int gsl_sf_legendre_P1_e (double X, gsl_sf_result * + RESULT) + -- Function: int gsl_sf_legendre_P2_e (double X, gsl_sf_result * + RESULT) + -- Function: int gsl_sf_legendre_P3_e (double X, gsl_sf_result * + RESULT) + These functions evaluate the Legendre polynomials P_l(x) using + explicit representations for l=1, 2, 3. + + -- Function: double gsl_sf_legendre_Pl (int L, double X) + -- Function: int gsl_sf_legendre_Pl_e (int L, double X, gsl_sf_result + * RESULT) + These functions evaluate the Legendre polynomial P_l(x) for a + specific value of L, X subject to l >= 0, |x| <= 1 + + -- Function: int gsl_sf_legendre_Pl_array (int LMAX, double X, double + RESULT_ARRAY[]) + -- Function: int gsl_sf_legendre_Pl_deriv_array (int LMAX, double X, + double RESULT_ARRAY[], double RESULT_DERIV_ARRAY[]) + These functions compute an array of Legendre polynomials P_l(x), + and optionally their derivatives dP_l(x)/dx, for l = 0, \dots, + lmax, |x| <= 1 + + -- Function: double gsl_sf_legendre_Q0 (double X) + -- Function: int gsl_sf_legendre_Q0_e (double X, gsl_sf_result * + RESULT) + These routines compute the Legendre function Q_0(x) for x > -1, x + != 1. + + -- Function: double gsl_sf_legendre_Q1 (double X) + -- Function: int gsl_sf_legendre_Q1_e (double X, gsl_sf_result * + RESULT) + These routines compute the Legendre function Q_1(x) for x > -1, x + != 1. + + -- Function: double gsl_sf_legendre_Ql (int L, double X) + -- Function: int gsl_sf_legendre_Ql_e (int L, double X, gsl_sf_result + * RESULT) + These routines compute the Legendre function Q_l(x) for x > -1, x + != 1 and l >= 0. + + +File: gsl-ref.info, Node: Associated Legendre Polynomials and Spherical Harmonics, Next: Conical Functions, Prev: Legendre Polynomials, Up: Legendre Functions and Spherical Harmonics + +7.24.2 Associated Legendre Polynomials and Spherical Harmonics +-------------------------------------------------------------- + +The following functions compute the associated Legendre Polynomials +P_l^m(x). Note that this function grows combinatorially with l and can +overflow for l larger than about 150. There is no trouble for small m, +but overflow occurs when m and l are both large. Rather than allow +overflows, these functions refuse to calculate P_l^m(x) and return +`GSL_EOVRFLW' when they can sense that l and m are too big. + + If you want to calculate a spherical harmonic, then _do not_ use +these functions. Instead use `gsl_sf_legendre_sphPlm' below, which +uses a similar recursion, but with the normalized functions. + + -- Function: double gsl_sf_legendre_Plm (int L, int M, double X) + -- Function: int gsl_sf_legendre_Plm_e (int L, int M, double X, + gsl_sf_result * RESULT) + These routines compute the associated Legendre polynomial P_l^m(x) + for m >= 0, l >= m, |x| <= 1. + + -- Function: int gsl_sf_legendre_Plm_array (int LMAX, int M, double X, + double RESULT_ARRAY[]) + -- Function: int gsl_sf_legendre_Plm_deriv_array (int LMAX, int M, + double X, double RESULT_ARRAY[], double RESULT_DERIV_ARRAY[]) + These functions compute an array of Legendre polynomials P_l^m(x), + and optionally their derivatives dP_l^m(x)/dx, for m >= 0, l = + |m|, ..., lmax, |x| <= 1. + + -- Function: double gsl_sf_legendre_sphPlm (int L, int M, double X) + -- Function: int gsl_sf_legendre_sphPlm_e (int L, int M, double X, + gsl_sf_result * RESULT) + These routines compute the normalized associated Legendre + polynomial $\sqrt{(2l+1)/(4\pi)} \sqrt{(l-m)!/(l+m)!} P_l^m(x)$ + suitable for use in spherical harmonics. The parameters must + satisfy m >= 0, l >= m, |x| <= 1. Theses routines avoid the + overflows that occur for the standard normalization of P_l^m(x). + + -- Function: int gsl_sf_legendre_sphPlm_array (int LMAX, int M, double + X, double RESULT_ARRAY[]) + -- Function: int gsl_sf_legendre_sphPlm_deriv_array (int LMAX, int M, + double X, double RESULT_ARRAY[], double RESULT_DERIV_ARRAY[]) + These functions compute an array of normalized associated Legendre + functions $\sqrt{(2l+1)/(4\pi)} \sqrt{(l-m)!/(l+m)!} P_l^m(x)$, + and optionally their derivatives, for m >= 0, l = |m|, ..., lmax, + |x| <= 1.0 + + -- Function: int gsl_sf_legendre_array_size (const int LMAX, const int + M) + This function returns the size of RESULT_ARRAY[] needed for the + array versions of P_l^m(x), LMAX - M + 1. + + +File: gsl-ref.info, Node: Conical Functions, Next: Radial Functions for Hyperbolic Space, Prev: Associated Legendre Polynomials and Spherical Harmonics, Up: Legendre Functions and Spherical Harmonics + +7.24.3 Conical Functions +------------------------ + +The Conical Functions P^\mu_{-(1/2)+i\lambda}(x) and +Q^\mu_{-(1/2)+i\lambda} are described in Abramowitz & Stegun, Section +8.12. + + -- Function: double gsl_sf_conicalP_half (double LAMBDA, double X) + -- Function: int gsl_sf_conicalP_half_e (double LAMBDA, double X, + gsl_sf_result * RESULT) + These routines compute the irregular Spherical Conical Function + P^{1/2}_{-1/2 + i \lambda}(x) for x > -1. + + -- Function: double gsl_sf_conicalP_mhalf (double LAMBDA, double X) + -- Function: int gsl_sf_conicalP_mhalf_e (double LAMBDA, double X, + gsl_sf_result * RESULT) + These routines compute the regular Spherical Conical Function + P^{-1/2}_{-1/2 + i \lambda}(x) for x > -1. + + -- Function: double gsl_sf_conicalP_0 (double LAMBDA, double X) + -- Function: int gsl_sf_conicalP_0_e (double LAMBDA, double X, + gsl_sf_result * RESULT) + These routines compute the conical function P^0_{-1/2 + i + \lambda}(x) for x > -1. + + -- Function: double gsl_sf_conicalP_1 (double LAMBDA, double X) + -- Function: int gsl_sf_conicalP_1_e (double LAMBDA, double X, + gsl_sf_result * RESULT) + These routines compute the conical function P^1_{-1/2 + i + \lambda}(x) for x > -1. + + -- Function: double gsl_sf_conicalP_sph_reg (int L, double LAMBDA, + double X) + -- Function: int gsl_sf_conicalP_sph_reg_e (int L, double LAMBDA, + double X, gsl_sf_result * RESULT) + These routines compute the Regular Spherical Conical Function + P^{-1/2-l}_{-1/2 + i \lambda}(x) for x > -1, l >= -1. + + -- Function: double gsl_sf_conicalP_cyl_reg (int M, double LAMBDA, + double X) + -- Function: int gsl_sf_conicalP_cyl_reg_e (int M, double LAMBDA, + double X, gsl_sf_result * RESULT) + These routines compute the Regular Cylindrical Conical Function + P^{-m}_{-1/2 + i \lambda}(x) for x > -1, m >= -1. + + +File: gsl-ref.info, Node: Radial Functions for Hyperbolic Space, Prev: Conical Functions, Up: Legendre Functions and Spherical Harmonics + +7.24.4 Radial Functions for Hyperbolic Space +-------------------------------------------- + +The following spherical functions are specializations of Legendre +functions which give the regular eigenfunctions of the Laplacian on a +3-dimensional hyperbolic space H3d. Of particular interest is the flat +limit, \lambda \to \infty, \eta \to 0, \lambda\eta fixed. + + -- Function: double gsl_sf_legendre_H3d_0 (double LAMBDA, double ETA) + -- Function: int gsl_sf_legendre_H3d_0_e (double LAMBDA, double ETA, + gsl_sf_result * RESULT) + These routines compute the zeroth radial eigenfunction of the + Laplacian on the 3-dimensional hyperbolic space, + L^{H3d}_0(\lambda,\eta) := \sin(\lambda\eta)/(\lambda\sinh(\eta)) + for \eta >= 0. In the flat limit this takes the form + L^{H3d}_0(\lambda,\eta) = j_0(\lambda\eta). + + -- Function: double gsl_sf_legendre_H3d_1 (double LAMBDA, double ETA) + -- Function: int gsl_sf_legendre_H3d_1_e (double LAMBDA, double ETA, + gsl_sf_result * RESULT) + These routines compute the first radial eigenfunction of the + Laplacian on the 3-dimensional hyperbolic space, + L^{H3d}_1(\lambda,\eta) := 1/\sqrt{\lambda^2 + 1} \sin(\lambda + \eta)/(\lambda \sinh(\eta)) (\coth(\eta) - \lambda + \cot(\lambda\eta)) for \eta >= 0. In the flat limit this takes + the form L^{H3d}_1(\lambda,\eta) = j_1(\lambda\eta). + + -- Function: double gsl_sf_legendre_H3d (int L, double LAMBDA, double + ETA) + -- Function: int gsl_sf_legendre_H3d_e (int L, double LAMBDA, double + ETA, gsl_sf_result * RESULT) + These routines compute the L-th radial eigenfunction of the + Laplacian on the 3-dimensional hyperbolic space \eta >= 0, l >= 0. + In the flat limit this takes the form L^{H3d}_l(\lambda,\eta) = + j_l(\lambda\eta). + + -- Function: int gsl_sf_legendre_H3d_array (int LMAX, double LAMBDA, + double ETA, double RESULT_ARRAY[]) + This function computes an array of radial eigenfunctions + L^{H3d}_l(\lambda, \eta) for 0 <= l <= lmax. + + +File: gsl-ref.info, Node: Logarithm and Related Functions, Next: Mathieu Functions, Prev: Legendre Functions and Spherical Harmonics, Up: Special Functions + +7.25 Logarithm and Related Functions +==================================== + +Information on the properties of the Logarithm function can be found in +Abramowitz & Stegun, Chapter 4. The functions described in this section +are declared in the header file `gsl_sf_log.h'. + + -- Function: double gsl_sf_log (double X) + -- Function: int gsl_sf_log_e (double X, gsl_sf_result * RESULT) + These routines compute the logarithm of X, \log(x), for x > 0. + + -- Function: double gsl_sf_log_abs (double X) + -- Function: int gsl_sf_log_abs_e (double X, gsl_sf_result * RESULT) + These routines compute the logarithm of the magnitude of X, + \log(|x|), for x \ne 0. + + -- Function: int gsl_sf_complex_log_e (double ZR, double ZI, + gsl_sf_result * LNR, gsl_sf_result * THETA) + This routine computes the complex logarithm of z = z_r + i z_i. + The results are returned as LNR, THETA such that \exp(lnr + i + \theta) = z_r + i z_i, where \theta lies in the range [-\pi,\pi]. + + -- Function: double gsl_sf_log_1plusx (double X) + -- Function: int gsl_sf_log_1plusx_e (double X, gsl_sf_result * RESULT) + These routines compute \log(1 + x) for x > -1 using an algorithm + that is accurate for small x. + + -- Function: double gsl_sf_log_1plusx_mx (double X) + -- Function: int gsl_sf_log_1plusx_mx_e (double X, gsl_sf_result * + RESULT) + These routines compute \log(1 + x) - x for x > -1 using an + algorithm that is accurate for small x. + + +File: gsl-ref.info, Node: Mathieu Functions, Next: Power Function, Prev: Logarithm and Related Functions, Up: Special Functions + +7.26 Mathieu Functions +====================== + +The routines described in this section compute the angular and radial +Mathieu functions, and their characteristic values. Mathieu functions +are the solutions of the following two differential equations: + + d^2y/dv^2 + (a - 2q\cos 2v)y = 0 + d^2f/du^2 - (a - 2q\cosh 2u)f = 0 + +The angular Mathieu functions ce_r(x,q), se_r(x,q) are the even and odd +periodic solutions of the first equation, which is known as Mathieu's +equation. These exist only for the discrete sequence of characteristic +values a=a_r(q) (even-periodic) and a=b_r(q) (odd-periodic). + + The radial Mathieu functions Mc^{(j)}_{r}(z,q), Ms^{(j)}_{r}(z,q) +are the solutions of the second equation, which is referred to as +Mathieu's modified equation. The radial Mathieu functions of the +first, second, third and fourth kind are denoted by the parameter j, +which takes the value 1, 2, 3 or 4. + + For more information on the Mathieu functions, see Abramowitz and +Stegun, Chapter 20. These functions are defined in the header file +`gsl_sf_mathieu.h'. + +* Menu: + +* Mathieu Function Workspace:: +* Mathieu Function Characteristic Values:: +* Angular Mathieu Functions:: +* Radial Mathieu Functions:: + + +File: gsl-ref.info, Node: Mathieu Function Workspace, Next: Mathieu Function Characteristic Values, Up: Mathieu Functions + +7.26.1 Mathieu Function Workspace +--------------------------------- + +The Mathieu functions can be computed for a single order or for +multiple orders, using array-based routines. The array-based routines +require a preallocated workspace. + + -- Function: gsl_sf_mathieu_workspace * gsl_sf_mathieu_alloc (size_t + N, double QMAX) + This function returns a workspace for the array versions of the + Mathieu routines. The arguments N and QMAX specify the maximum + order and q-value of Mathieu functions which can be computed with + this workspace. + + + -- Function: void gsl_sf_mathieu_free (gsl_sf_mathieu_workspace *WORK) + This function frees the workspace WORK. + + +File: gsl-ref.info, Node: Mathieu Function Characteristic Values, Next: Angular Mathieu Functions, Prev: Mathieu Function Workspace, Up: Mathieu Functions + +7.26.2 Mathieu Function Characteristic Values +--------------------------------------------- + + -- Function: int gsl_sf_mathieu_a (int N, double Q, gsl_sf_result + *RESULT) + -- Function: int gsl_sf_mathieu_b (int N, double Q, gsl_sf_result + *RESULT) + These routines compute the characteristic values a_n(q), b_n(q) of + the Mathieu functions ce_n(q,x) and se_n(q,x), respectively. + + -- Function: int gsl_sf_mathieu_a_array (int ORDER_MIN, int ORDER_MAX, + double Q, gsl_sf_mathieu_workspace *WORK, double + RESULT_ARRAY[]) + -- Function: int gsl_sf_mathieu_b_array (int ORDER_MIN, int ORDER_MAX, + double Q, gsl_sf_mathieu_workspace *WORK, double + RESULT_ARRAY[]) + These routines compute a series of Mathieu characteristic values + a_n(q), b_n(q) for n from ORDER_MIN to ORDER_MAX inclusive, + storing the results in the array RESULT_ARRAY. + + +File: gsl-ref.info, Node: Angular Mathieu Functions, Next: Radial Mathieu Functions, Prev: Mathieu Function Characteristic Values, Up: Mathieu Functions + +7.26.3 Angular Mathieu Functions +-------------------------------- + + -- Function: int gsl_sf_mathieu_ce (int N, double Q, double X, + gsl_sf_result *RESULT) + -- Function: int gsl_sf_mathieu_se (int N, double Q, double X, + gsl_sf_result *RESULT) + These routines compute the angular Mathieu functions ce_n(q,x) and + se_n(q,x), respectively. + + -- Function: int gsl_sf_mathieu_ce_array (int NMIN, int NMAX, double + Q, double X, gsl_sf_mathieu_workspace *WORK, double + RESULT_ARRAY[]) + -- Function: int gsl_sf_mathieu_se_array (int NMIN, int NMAX, double + Q, double X, gsl_sf_mathieu_workspace *WORK, double + RESULT_ARRAY[]) + These routines compute a series of the angular Mathieu functions + ce_n(q,x) and se_n(q,x) of order n from NMIN to NMAX inclusive, + storing the results in the array RESULT_ARRAY. + + +File: gsl-ref.info, Node: Radial Mathieu Functions, Prev: Angular Mathieu Functions, Up: Mathieu Functions + +7.26.4 Radial Mathieu Functions +------------------------------- + + -- Function: int gsl_sf_mathieu_Mc (int J, int N, double Q, double X, + gsl_sf_result *RESULT) + -- Function: int gsl_sf_mathieu_Ms (int J, int N, double Q, double X, + gsl_sf_result *RESULT) + These routines compute the radial J-th kind Mathieu functions + Mc_n^{(j)}(q,x) and Ms_n^{(j)}(q,x) of order N. + + The allowed values of J are 1 and 2. The functions for j = 3,4 + can be computed as M_n^{(3)} = M_n^{(1)} + iM_n^{(2)} and + M_n^{(4)} = M_n^{(1)} - iM_n^{(2)}, where M_n^{(j)} = Mc_n^{(j)} or + Ms_n^{(j)}. + + -- Function: int gsl_sf_mathieu_Mc_array (int J, int NMIN, int NMAX, + double Q, double X, gsl_sf_mathieu_workspace *WORK, double + RESULT_ARRAY[]) + -- Function: int gsl_sf_mathieu_Ms_array (int J, int NMIN, int NMAX, + double Q, double X, gsl_sf_mathieu_workspace *WORK, double + RESULT_ARRAY[]) + These routines compute a series of the radial Mathieu functions of + kind J, with order from NMIN to NMAX inclusive, storing the + results in the array RESULT_ARRAY. + + +File: gsl-ref.info, Node: Power Function, Next: Psi (Digamma) Function, Prev: Mathieu Functions, Up: Special Functions + +7.27 Power Function +=================== + +The following functions are equivalent to the function `gsl_pow_int' +(*note Small integer powers::) with an error estimate. These functions +are declared in the header file `gsl_sf_pow_int.h'. + + -- Function: double gsl_sf_pow_int (double X, int N) + -- Function: int gsl_sf_pow_int_e (double X, int N, gsl_sf_result * + RESULT) + These routines compute the power x^n for integer N. The power is + computed using the minimum number of multiplications. For example, + x^8 is computed as ((x^2)^2)^2, requiring only 3 multiplications. + For reasons of efficiency, these functions do not check for + overflow or underflow conditions. + + #include <gsl/gsl_sf_pow_int.h> + /* compute 3.0**12 */ + double y = gsl_sf_pow_int(3.0, 12); + + +File: gsl-ref.info, Node: Psi (Digamma) Function, Next: Synchrotron Functions, Prev: Power Function, Up: Special Functions + +7.28 Psi (Digamma) Function +=========================== + +The polygamma functions of order n are defined by + + \psi^{(n)}(x) = (d/dx)^n \psi(x) = (d/dx)^{n+1} \log(\Gamma(x)) + +where \psi(x) = \Gamma'(x)/\Gamma(x) is known as the digamma function. +These functions are declared in the header file `gsl_sf_psi.h'. + +* Menu: + +* Digamma Function:: +* Trigamma Function:: +* Polygamma Function:: + + +File: gsl-ref.info, Node: Digamma Function, Next: Trigamma Function, Up: Psi (Digamma) Function + +7.28.1 Digamma Function +----------------------- + + -- Function: double gsl_sf_psi_int (int N) + -- Function: int gsl_sf_psi_int_e (int N, gsl_sf_result * RESULT) + These routines compute the digamma function \psi(n) for positive + integer N. The digamma function is also called the Psi function. + + -- Function: double gsl_sf_psi (double X) + -- Function: int gsl_sf_psi_e (double X, gsl_sf_result * RESULT) + These routines compute the digamma function \psi(x) for general x, + x \ne 0. + + -- Function: double gsl_sf_psi_1piy (double Y) + -- Function: int gsl_sf_psi_1piy_e (double Y, gsl_sf_result * RESULT) + These routines compute the real part of the digamma function on + the line 1+i y, \Re[\psi(1 + i y)]. + + +File: gsl-ref.info, Node: Trigamma Function, Next: Polygamma Function, Prev: Digamma Function, Up: Psi (Digamma) Function + +7.28.2 Trigamma Function +------------------------ + + -- Function: double gsl_sf_psi_1_int (int N) + -- Function: int gsl_sf_psi_1_int_e (int N, gsl_sf_result * RESULT) + These routines compute the Trigamma function \psi'(n) for positive + integer n. + + -- Function: double gsl_sf_psi_1 (double X) + -- Function: int gsl_sf_psi_1_e (double X, gsl_sf_result * RESULT) + These routines compute the Trigamma function \psi'(x) for general + x. + + +File: gsl-ref.info, Node: Polygamma Function, Prev: Trigamma Function, Up: Psi (Digamma) Function + +7.28.3 Polygamma Function +------------------------- + + -- Function: double gsl_sf_psi_n (int N, double X) + -- Function: int gsl_sf_psi_n_e (int N, double X, gsl_sf_result * + RESULT) + These routines compute the polygamma function \psi^{(n)}(x) for n + >= 0, x > 0. + + +File: gsl-ref.info, Node: Synchrotron Functions, Next: Transport Functions, Prev: Psi (Digamma) Function, Up: Special Functions + +7.29 Synchrotron Functions +========================== + +The functions described in this section are declared in the header file +`gsl_sf_synchrotron.h'. + + -- Function: double gsl_sf_synchrotron_1 (double X) + -- Function: int gsl_sf_synchrotron_1_e (double X, gsl_sf_result * + RESULT) + These routines compute the first synchrotron function x + \int_x^\infty dt K_{5/3}(t) for x >= 0. + + -- Function: double gsl_sf_synchrotron_2 (double X) + -- Function: int gsl_sf_synchrotron_2_e (double X, gsl_sf_result * + RESULT) + These routines compute the second synchrotron function x + K_{2/3}(x) for x >= 0. + + +File: gsl-ref.info, Node: Transport Functions, Next: Trigonometric Functions, Prev: Synchrotron Functions, Up: Special Functions + +7.30 Transport Functions +======================== + +The transport functions J(n,x) are defined by the integral +representations J(n,x) := \int_0^x dt t^n e^t /(e^t - 1)^2. They are +declared in the header file `gsl_sf_transport.h'. + + -- Function: double gsl_sf_transport_2 (double X) + -- Function: int gsl_sf_transport_2_e (double X, gsl_sf_result * + RESULT) + These routines compute the transport function J(2,x). + + -- Function: double gsl_sf_transport_3 (double X) + -- Function: int gsl_sf_transport_3_e (double X, gsl_sf_result * + RESULT) + These routines compute the transport function J(3,x). + + -- Function: double gsl_sf_transport_4 (double X) + -- Function: int gsl_sf_transport_4_e (double X, gsl_sf_result * + RESULT) + These routines compute the transport function J(4,x). + + -- Function: double gsl_sf_transport_5 (double X) + -- Function: int gsl_sf_transport_5_e (double X, gsl_sf_result * + RESULT) + These routines compute the transport function J(5,x). + + +File: gsl-ref.info, Node: Trigonometric Functions, Next: Zeta Functions, Prev: Transport Functions, Up: Special Functions + +7.31 Trigonometric Functions +============================ + +The library includes its own trigonometric functions in order to provide +consistency across platforms and reliable error estimates. These +functions are declared in the header file `gsl_sf_trig.h'. + +* Menu: + +* Circular Trigonometric Functions:: +* Trigonometric Functions for Complex Arguments:: +* Hyperbolic Trigonometric Functions:: +* Conversion Functions:: +* Restriction Functions:: +* Trigonometric Functions With Error Estimates:: + + +File: gsl-ref.info, Node: Circular Trigonometric Functions, Next: Trigonometric Functions for Complex Arguments, Up: Trigonometric Functions + +7.31.1 Circular Trigonometric Functions +--------------------------------------- + + -- Function: double gsl_sf_sin (double X) + -- Function: int gsl_sf_sin_e (double X, gsl_sf_result * RESULT) + These routines compute the sine function \sin(x). + + -- Function: double gsl_sf_cos (double X) + -- Function: int gsl_sf_cos_e (double X, gsl_sf_result * RESULT) + These routines compute the cosine function \cos(x). + + -- Function: double gsl_sf_hypot (double X, double Y) + -- Function: int gsl_sf_hypot_e (double X, double Y, gsl_sf_result * + RESULT) + These routines compute the hypotenuse function \sqrt{x^2 + y^2} + avoiding overflow and underflow. + + -- Function: double gsl_sf_sinc (double X) + -- Function: int gsl_sf_sinc_e (double X, gsl_sf_result * RESULT) + These routines compute \sinc(x) = \sin(\pi x) / (\pi x) for any + value of X. + + +File: gsl-ref.info, Node: Trigonometric Functions for Complex Arguments, Next: Hyperbolic Trigonometric Functions, Prev: Circular Trigonometric Functions, Up: Trigonometric Functions + +7.31.2 Trigonometric Functions for Complex Arguments +---------------------------------------------------- + + -- Function: int gsl_sf_complex_sin_e (double ZR, double ZI, + gsl_sf_result * SZR, gsl_sf_result * SZI) + This function computes the complex sine, \sin(z_r + i z_i) storing + the real and imaginary parts in SZR, SZI. + + -- Function: int gsl_sf_complex_cos_e (double ZR, double ZI, + gsl_sf_result * CZR, gsl_sf_result * CZI) + This function computes the complex cosine, \cos(z_r + i z_i) + storing the real and imaginary parts in SZR, SZI. + + -- Function: int gsl_sf_complex_logsin_e (double ZR, double ZI, + gsl_sf_result * LSZR, gsl_sf_result * LSZI) + This function computes the logarithm of the complex sine, + \log(\sin(z_r + i z_i)) storing the real and imaginary parts in + SZR, SZI. + + +File: gsl-ref.info, Node: Hyperbolic Trigonometric Functions, Next: Conversion Functions, Prev: Trigonometric Functions for Complex Arguments, Up: Trigonometric Functions + +7.31.3 Hyperbolic Trigonometric Functions +----------------------------------------- + + -- Function: double gsl_sf_lnsinh (double X) + -- Function: int gsl_sf_lnsinh_e (double X, gsl_sf_result * RESULT) + These routines compute \log(\sinh(x)) for x > 0. + + -- Function: double gsl_sf_lncosh (double X) + -- Function: int gsl_sf_lncosh_e (double X, gsl_sf_result * RESULT) + These routines compute \log(\cosh(x)) for any X. + + +File: gsl-ref.info, Node: Conversion Functions, Next: Restriction Functions, Prev: Hyperbolic Trigonometric Functions, Up: Trigonometric Functions + +7.31.4 Conversion Functions +--------------------------- + + -- Function: int gsl_sf_polar_to_rect (double R, double THETA, + gsl_sf_result * X, gsl_sf_result * Y); + This function converts the polar coordinates (R,THETA) to + rectilinear coordinates (X,Y), x = r\cos(\theta), y = + r\sin(\theta). + + -- Function: int gsl_sf_rect_to_polar (double X, double Y, + gsl_sf_result * R, gsl_sf_result * THETA) + This function converts the rectilinear coordinates (X,Y) to polar + coordinates (R,THETA), such that x = r\cos(\theta), y = + r\sin(\theta). The argument THETA lies in the range [-\pi, \pi]. + + +File: gsl-ref.info, Node: Restriction Functions, Next: Trigonometric Functions With Error Estimates, Prev: Conversion Functions, Up: Trigonometric Functions + +7.31.5 Restriction Functions +---------------------------- + + -- Function: double gsl_sf_angle_restrict_symm (double THETA) + -- Function: int gsl_sf_angle_restrict_symm_e (double * THETA) + These routines force the angle THETA to lie in the range + (-\pi,\pi]. + + Note that the mathematical value of \pi is slightly greater than + `M_PI', so the machine numbers `M_PI' and `-M_PI' are included in + the range. + + -- Function: double gsl_sf_angle_restrict_pos (double THETA) + -- Function: int gsl_sf_angle_restrict_pos_e (double * THETA) + These routines force the angle THETA to lie in the range [0, 2\pi). + + Note that the mathematical value of 2\pi is slightly greater than + `2*M_PI', so the machine number `2*M_PI' is included in the range. + + + +File: gsl-ref.info, Node: Trigonometric Functions With Error Estimates, Prev: Restriction Functions, Up: Trigonometric Functions + +7.31.6 Trigonometric Functions With Error Estimates +--------------------------------------------------- + + -- Function: int gsl_sf_sin_err_e (double X, double DX, gsl_sf_result + * RESULT) + This routine computes the sine of an angle X with an associated + absolute error DX, \sin(x \pm dx). Note that this function is + provided in the error-handling form only since its purpose is to + compute the propagated error. + + -- Function: int gsl_sf_cos_err_e (double X, double DX, gsl_sf_result + * RESULT) + This routine computes the cosine of an angle X with an associated + absolute error DX, \cos(x \pm dx). Note that this function is + provided in the error-handling form only since its purpose is to + compute the propagated error. + + +File: gsl-ref.info, Node: Zeta Functions, Next: Special Functions Examples, Prev: Trigonometric Functions, Up: Special Functions + +7.32 Zeta Functions +=================== + +The Riemann zeta function is defined in Abramowitz & Stegun, Section +23.2. The functions described in this section are declared in the +header file `gsl_sf_zeta.h'. + +* Menu: + +* Riemann Zeta Function:: +* Riemann Zeta Function Minus One:: +* Hurwitz Zeta Function:: +* Eta Function:: + + +File: gsl-ref.info, Node: Riemann Zeta Function, Next: Riemann Zeta Function Minus One, Up: Zeta Functions + +7.32.1 Riemann Zeta Function +---------------------------- + +The Riemann zeta function is defined by the infinite sum \zeta(s) = +\sum_{k=1}^\infty k^{-s}. + + -- Function: double gsl_sf_zeta_int (int N) + -- Function: int gsl_sf_zeta_int_e (int N, gsl_sf_result * RESULT) + These routines compute the Riemann zeta function \zeta(n) for + integer N, n \ne 1. + + -- Function: double gsl_sf_zeta (double S) + -- Function: int gsl_sf_zeta_e (double S, gsl_sf_result * RESULT) + These routines compute the Riemann zeta function \zeta(s) for + arbitrary S, s \ne 1. + + +File: gsl-ref.info, Node: Riemann Zeta Function Minus One, Next: Hurwitz Zeta Function, Prev: Riemann Zeta Function, Up: Zeta Functions + +7.32.2 Riemann Zeta Function Minus One +-------------------------------------- + +For large positive argument, the Riemann zeta function approaches one. +In this region the fractional part is interesting, and therefore we +need a function to evaluate it explicitly. + + -- Function: double gsl_sf_zetam1_int (int N) + -- Function: int gsl_sf_zetam1_int_e (int N, gsl_sf_result * RESULT) + These routines compute \zeta(n) - 1 for integer N, n \ne 1. + + -- Function: double gsl_sf_zetam1 (double S) + -- Function: int gsl_sf_zetam1_e (double S, gsl_sf_result * RESULT) + These routines compute \zeta(s) - 1 for arbitrary S, s \ne 1. + + +File: gsl-ref.info, Node: Hurwitz Zeta Function, Next: Eta Function, Prev: Riemann Zeta Function Minus One, Up: Zeta Functions + +7.32.3 Hurwitz Zeta Function +---------------------------- + +The Hurwitz zeta function is defined by \zeta(s,q) = \sum_0^\infty +(k+q)^{-s}. + + -- Function: double gsl_sf_hzeta (double S, double Q) + -- Function: int gsl_sf_hzeta_e (double S, double Q, gsl_sf_result * + RESULT) + These routines compute the Hurwitz zeta function \zeta(s,q) for s + > 1, q > 0. + + +File: gsl-ref.info, Node: Eta Function, Prev: Hurwitz Zeta Function, Up: Zeta Functions + +7.32.4 Eta Function +------------------- + +The eta function is defined by \eta(s) = (1-2^{1-s}) \zeta(s). + + -- Function: double gsl_sf_eta_int (int N) + -- Function: int gsl_sf_eta_int_e (int N, gsl_sf_result * RESULT) + These routines compute the eta function \eta(n) for integer N. + + -- Function: double gsl_sf_eta (double S) + -- Function: int gsl_sf_eta_e (double S, gsl_sf_result * RESULT) + These routines compute the eta function \eta(s) for arbitrary S. + + +File: gsl-ref.info, Node: Special Functions Examples, Next: Special Functions References and Further Reading, Prev: Zeta Functions, Up: Special Functions + +7.33 Examples +============= + +The following example demonstrates the use of the error handling form of +the special functions, in this case to compute the Bessel function +J_0(5.0), + + #include <stdio.h> + #include <gsl/gsl_errno.h> + #include <gsl/gsl_sf_bessel.h> + + int + main (void) + { + double x = 5.0; + gsl_sf_result result; + + double expected = -0.17759677131433830434739701; + + int status = gsl_sf_bessel_J0_e (x, &result); + + printf ("status = %s\n", gsl_strerror(status)); + printf ("J0(5.0) = %.18f\n" + " +/- % .18f\n", + result.val, result.err); + printf ("exact = %.18f\n", expected); + return status; + } + +Here are the results of running the program, + + $ ./a.out + status = success + J0(5.0) = -0.177596771314338292 + +/- 0.000000000000000193 + exact = -0.177596771314338292 + +The next program computes the same quantity using the natural form of +the function. In this case the error term RESULT.ERR and return status +are not accessible. + + #include <stdio.h> + #include <gsl/gsl_sf_bessel.h> + + int + main (void) + { + double x = 5.0; + double expected = -0.17759677131433830434739701; + + double y = gsl_sf_bessel_J0 (x); + + printf ("J0(5.0) = %.18f\n", y); + printf ("exact = %.18f\n", expected); + return 0; + } + +The results of the function are the same, + + $ ./a.out + J0(5.0) = -0.177596771314338292 + exact = -0.177596771314338292 + + +File: gsl-ref.info, Node: Special Functions References and Further Reading, Prev: Special Functions Examples, Up: Special Functions + +7.34 References and Further Reading +=================================== + +The library follows the conventions of `Abramowitz & Stegun' where +possible, + Abramowitz & Stegun (eds.), `Handbook of Mathematical Functions' + +The following papers contain information on the algorithms used to +compute the special functions, + MISCFUN: A software package to compute uncommon special functions. + `ACM Trans. Math. Soft.', vol. 22, 1996, 288-301 + + G.N. Watson, A Treatise on the Theory of Bessel Functions, 2nd + Edition (Cambridge University Press, 1944). + + G. Nemeth, Mathematical Approximations of Special Functions, Nova + Science Publishers, ISBN 1-56072-052-2 + + B.C. Carlson, Special Functions of Applied Mathematics (1977) + + W.J. Thompson, Atlas for Computing Mathematical Functions, John + Wiley & Sons, New York (1997). + + Y.Y. Luke, Algorithms for the Computation of Mathematical + Functions, Academic Press, New York (1977). + + + +File: gsl-ref.info, Node: Vectors and Matrices, Next: Permutations, Prev: Special Functions, Up: Top + +8 Vectors and Matrices +********************** + +The functions described in this chapter provide a simple vector and +matrix interface to ordinary C arrays. The memory management of these +arrays is implemented using a single underlying type, known as a block. +By writing your functions in terms of vectors and matrices you can pass +a single structure containing both data and dimensions as an argument +without needing additional function parameters. The structures are +compatible with the vector and matrix formats used by BLAS routines. + +* Menu: + +* Data types:: +* Blocks:: +* Vectors:: +* Matrices:: +* Vector and Matrix References and Further Reading:: + + +File: gsl-ref.info, Node: Data types, Next: Blocks, Up: Vectors and Matrices + +8.1 Data types +============== + +All the functions are available for each of the standard data-types. +The versions for `double' have the prefix `gsl_block', `gsl_vector' and +`gsl_matrix'. Similarly the versions for single-precision `float' +arrays have the prefix `gsl_block_float', `gsl_vector_float' and +`gsl_matrix_float'. The full list of available types is given below, + + gsl_block double + gsl_block_float float + gsl_block_long_double long double + gsl_block_int int + gsl_block_uint unsigned int + gsl_block_long long + gsl_block_ulong unsigned long + gsl_block_short short + gsl_block_ushort unsigned short + gsl_block_char char + gsl_block_uchar unsigned char + gsl_block_complex complex double + gsl_block_complex_float complex float + gsl_block_complex_long_double complex long double + +Corresponding types exist for the `gsl_vector' and `gsl_matrix' +functions. + + +File: gsl-ref.info, Node: Blocks, Next: Vectors, Prev: Data types, Up: Vectors and Matrices + +8.2 Blocks +========== + +For consistency all memory is allocated through a `gsl_block' +structure. The structure contains two components, the size of an area +of memory and a pointer to the memory. The `gsl_block' structure looks +like this, + + typedef struct + { + size_t size; + double * data; + } gsl_block; + +Vectors and matrices are made by "slicing" an underlying block. A slice +is a set of elements formed from an initial offset and a combination of +indices and step-sizes. In the case of a matrix the step-size for the +column index represents the row-length. The step-size for a vector is +known as the "stride". + + The functions for allocating and deallocating blocks are defined in +`gsl_block.h' + +* Menu: + +* Block allocation:: +* Reading and writing blocks:: +* Example programs for blocks:: + + +File: gsl-ref.info, Node: Block allocation, Next: Reading and writing blocks, Up: Blocks + +8.2.1 Block allocation +---------------------- + +The functions for allocating memory to a block follow the style of +`malloc' and `free'. In addition they also perform their own error +checking. If there is insufficient memory available to allocate a +block then the functions call the GSL error handler (with an error +number of `GSL_ENOMEM') in addition to returning a null pointer. Thus +if you use the library error handler to abort your program then it +isn't necessary to check every `alloc'. + + -- Function: gsl_block * gsl_block_alloc (size_t N) + This function allocates memory for a block of N double-precision + elements, returning a pointer to the block struct. The block is + not initialized and so the values of its elements are undefined. + Use the function `gsl_block_calloc' if you want to ensure that all + the elements are initialized to zero. + + A null pointer is returned if insufficient memory is available to + create the block. + + -- Function: gsl_block * gsl_block_calloc (size_t N) + This function allocates memory for a block and initializes all the + elements of the block to zero. + + -- Function: void gsl_block_free (gsl_block * B) + This function frees the memory used by a block B previously + allocated with `gsl_block_alloc' or `gsl_block_calloc'. The block + B must be a valid block object (a null pointer is not allowed). + + +File: gsl-ref.info, Node: Reading and writing blocks, Next: Example programs for blocks, Prev: Block allocation, Up: Blocks + +8.2.2 Reading and writing blocks +-------------------------------- + +The library provides functions for reading and writing blocks to a file +as binary data or formatted text. + + -- Function: int gsl_block_fwrite (FILE * STREAM, const gsl_block * B) + This function writes the elements of the block B to the stream + STREAM in binary format. The return value is 0 for success and + `GSL_EFAILED' if there was a problem writing to the file. Since + the data is written in the native binary format it may not be + portable between different architectures. + + -- Function: int gsl_block_fread (FILE * STREAM, gsl_block * B) + This function reads into the block B from the open stream STREAM + in binary format. The block B must be preallocated with the + correct length since the function uses the size of B to determine + how many bytes to read. The return value is 0 for success and + `GSL_EFAILED' if there was a problem reading from the file. The + data is assumed to have been written in the native binary format + on the same architecture. + + -- Function: int gsl_block_fprintf (FILE * STREAM, const gsl_block * + B, const char * FORMAT) + This function writes the elements of the block B line-by-line to + the stream STREAM using the format specifier FORMAT, which should + be one of the `%g', `%e' or `%f' formats for floating point + numbers and `%d' for integers. The function returns 0 for success + and `GSL_EFAILED' if there was a problem writing to the file. + + -- Function: int gsl_block_fscanf (FILE * STREAM, gsl_block * B) + This function reads formatted data from the stream STREAM into the + block B. The block B must be preallocated with the correct length + since the function uses the size of B to determine how many + numbers to read. The function returns 0 for success and + `GSL_EFAILED' if there was a problem reading from the file. + + +File: gsl-ref.info, Node: Example programs for blocks, Prev: Reading and writing blocks, Up: Blocks + +8.2.3 Example programs for blocks +--------------------------------- + +The following program shows how to allocate a block, + + #include <stdio.h> + #include <gsl/gsl_block.h> + + int + main (void) + { + gsl_block * b = gsl_block_alloc (100); + + printf ("length of block = %u\n", b->size); + printf ("block data address = %#x\n", b->data); + + gsl_block_free (b); + return 0; + } + +Here is the output from the program, + + length of block = 100 + block data address = 0x804b0d8 + + +File: gsl-ref.info, Node: Vectors, Next: Matrices, Prev: Blocks, Up: Vectors and Matrices + +8.3 Vectors +=========== + +Vectors are defined by a `gsl_vector' structure which describes a slice +of a block. Different vectors can be created which point to the same +block. A vector slice is a set of equally-spaced elements of an area +of memory. + + The `gsl_vector' structure contains five components, the "size", the +"stride", a pointer to the memory where the elements are stored, DATA, +a pointer to the block owned by the vector, BLOCK, if any, and an +ownership flag, OWNER. The structure is very simple and looks like +this, + + typedef struct + { + size_t size; + size_t stride; + double * data; + gsl_block * block; + int owner; + } gsl_vector; + +The SIZE is simply the number of vector elements. The range of valid +indices runs from 0 to `size-1'. The STRIDE is the step-size from one +element to the next in physical memory, measured in units of the +appropriate datatype. The pointer DATA gives the location of the first +element of the vector in memory. The pointer BLOCK stores the location +of the memory block in which the vector elements are located (if any). +If the vector owns this block then the OWNER field is set to one and +the block will be deallocated when the vector is freed. If the vector +points to a block owned by another object then the OWNER field is zero +and any underlying block will not be deallocated with the vector. + + The functions for allocating and accessing vectors are defined in +`gsl_vector.h' + +* Menu: + +* Vector allocation:: +* Accessing vector elements:: +* Initializing vector elements:: +* Reading and writing vectors:: +* Vector views:: +* Copying vectors:: +* Exchanging elements:: +* Vector operations:: +* Finding maximum and minimum elements of vectors:: +* Vector properties:: +* Example programs for vectors:: + + +File: gsl-ref.info, Node: Vector allocation, Next: Accessing vector elements, Up: Vectors + +8.3.1 Vector allocation +----------------------- + +The functions for allocating memory to a vector follow the style of +`malloc' and `free'. In addition they also perform their own error +checking. If there is insufficient memory available to allocate a +vector then the functions call the GSL error handler (with an error +number of `GSL_ENOMEM') in addition to returning a null pointer. Thus +if you use the library error handler to abort your program then it +isn't necessary to check every `alloc'. + + -- Function: gsl_vector * gsl_vector_alloc (size_t N) + This function creates a vector of length N, returning a pointer to + a newly initialized vector struct. A new block is allocated for the + elements of the vector, and stored in the BLOCK component of the + vector struct. The block is "owned" by the vector, and will be + deallocated when the vector is deallocated. + + -- Function: gsl_vector * gsl_vector_calloc (size_t N) + This function allocates memory for a vector of length N and + initializes all the elements of the vector to zero. + + -- Function: void gsl_vector_free (gsl_vector * V) + This function frees a previously allocated vector V. If the + vector was created using `gsl_vector_alloc' then the block + underlying the vector will also be deallocated. If the vector has + been created from another object then the memory is still owned by + that object and will not be deallocated. The vector V must be a + valid vector object (a null pointer is not allowed). + + +File: gsl-ref.info, Node: Accessing vector elements, Next: Initializing vector elements, Prev: Vector allocation, Up: Vectors + +8.3.2 Accessing vector elements +------------------------------- + +Unlike FORTRAN compilers, C compilers do not usually provide support +for range checking of vectors and matrices. Range checking is +available in the GNU C Compiler bounds-checking extension, but it is not +part of the default installation of GCC. The functions +`gsl_vector_get' and `gsl_vector_set' can perform portable range +checking for you and report an error if you attempt to access elements +outside the allowed range. + + The functions for accessing the elements of a vector or matrix are +defined in `gsl_vector.h' and declared `extern inline' to eliminate +function-call overhead. You must compile your program with the macro +`HAVE_INLINE' defined to use these functions. + + If necessary you can turn off range checking completely without +modifying any source files by recompiling your program with the +preprocessor definition `GSL_RANGE_CHECK_OFF'. Provided your compiler +supports inline functions the effect of turning off range checking is +to replace calls to `gsl_vector_get(v,i)' by `v->data[i*v->stride]' and +calls to `gsl_vector_set(v,i,x)' by `v->data[i*v->stride]=x'. Thus +there should be no performance penalty for using the range checking +functions when range checking is turned off. + + -- Function: double gsl_vector_get (const gsl_vector * V, size_t I) + This function returns the I-th element of a vector V. If I lies + outside the allowed range of 0 to N-1 then the error handler is + invoked and 0 is returned. + + -- Function: void gsl_vector_set (gsl_vector * V, size_t I, double X) + This function sets the value of the I-th element of a vector V to + X. If I lies outside the allowed range of 0 to N-1 then the error + handler is invoked. + + -- Function: double * gsl_vector_ptr (gsl_vector * V, size_t I) + -- Function: const double * gsl_vector_const_ptr (const gsl_vector * + V, size_t I) + These functions return a pointer to the I-th element of a vector + V. If I lies outside the allowed range of 0 to N-1 then the error + handler is invoked and a null pointer is returned. + + +File: gsl-ref.info, Node: Initializing vector elements, Next: Reading and writing vectors, Prev: Accessing vector elements, Up: Vectors + +8.3.3 Initializing vector elements +---------------------------------- + + -- Function: void gsl_vector_set_all (gsl_vector * V, double X) + This function sets all the elements of the vector V to the value X. + + -- Function: void gsl_vector_set_zero (gsl_vector * V) + This function sets all the elements of the vector V to zero. + + -- Function: int gsl_vector_set_basis (gsl_vector * V, size_t I) + This function makes a basis vector by setting all the elements of + the vector V to zero except for the I-th element which is set to + one. + + +File: gsl-ref.info, Node: Reading and writing vectors, Next: Vector views, Prev: Initializing vector elements, Up: Vectors + +8.3.4 Reading and writing vectors +--------------------------------- + +The library provides functions for reading and writing vectors to a file +as binary data or formatted text. + + -- Function: int gsl_vector_fwrite (FILE * STREAM, const gsl_vector * + V) + This function writes the elements of the vector V to the stream + STREAM in binary format. The return value is 0 for success and + `GSL_EFAILED' if there was a problem writing to the file. Since + the data is written in the native binary format it may not be + portable between different architectures. + + -- Function: int gsl_vector_fread (FILE * STREAM, gsl_vector * V) + This function reads into the vector V from the open stream STREAM + in binary format. The vector V must be preallocated with the + correct length since the function uses the size of V to determine + how many bytes to read. The return value is 0 for success and + `GSL_EFAILED' if there was a problem reading from the file. The + data is assumed to have been written in the native binary format + on the same architecture. + + -- Function: int gsl_vector_fprintf (FILE * STREAM, const gsl_vector * + V, const char * FORMAT) + This function writes the elements of the vector V line-by-line to + the stream STREAM using the format specifier FORMAT, which should + be one of the `%g', `%e' or `%f' formats for floating point + numbers and `%d' for integers. The function returns 0 for success + and `GSL_EFAILED' if there was a problem writing to the file. + + -- Function: int gsl_vector_fscanf (FILE * STREAM, gsl_vector * V) + This function reads formatted data from the stream STREAM into the + vector V. The vector V must be preallocated with the correct + length since the function uses the size of V to determine how many + numbers to read. The function returns 0 for success and + `GSL_EFAILED' if there was a problem reading from the file. + + +File: gsl-ref.info, Node: Vector views, Next: Copying vectors, Prev: Reading and writing vectors, Up: Vectors + +8.3.5 Vector views +------------------ + +In addition to creating vectors from slices of blocks it is also +possible to slice vectors and create vector views. For example, a +subvector of another vector can be described with a view, or two views +can be made which provide access to the even and odd elements of a +vector. + + A vector view is a temporary object, stored on the stack, which can +be used to operate on a subset of vector elements. Vector views can be +defined for both constant and non-constant vectors, using separate types +that preserve constness. A vector view has the type `gsl_vector_view' +and a constant vector view has the type `gsl_vector_const_view'. In +both cases the elements of the view can be accessed as a `gsl_vector' +using the `vector' component of the view object. A pointer to a vector +of type `gsl_vector *' or `const gsl_vector *' can be obtained by +taking the address of this component with the `&' operator. + + When using this pointer it is important to ensure that the view +itself remains in scope--the simplest way to do so is by always writing +the pointer as `&'VIEW`.vector', and never storing this value in +another variable. + + -- Function: gsl_vector_view gsl_vector_subvector (gsl_vector * V, + size_t OFFSET, size_t N) + -- Function: gsl_vector_const_view gsl_vector_const_subvector (const + gsl_vector * V, size_t OFFSET, size_t N) + These functions return a vector view of a subvector of another + vector V. The start of the new vector is offset by OFFSET elements + from the start of the original vector. The new vector has N + elements. Mathematically, the I-th element of the new vector V' + is given by, + + v'(i) = v->data[(offset + i)*v->stride] + + where the index I runs from 0 to `n-1'. + + The `data' pointer of the returned vector struct is set to null if + the combined parameters (OFFSET,N) overrun the end of the original + vector. + + The new vector is only a view of the block underlying the original + vector, V. The block containing the elements of V is not owned by + the new vector. When the view goes out of scope the original + vector V and its block will continue to exist. The original + memory can only be deallocated by freeing the original vector. Of + course, the original vector should not be deallocated while the + view is still in use. + + The function `gsl_vector_const_subvector' is equivalent to + `gsl_vector_subvector' but can be used for vectors which are + declared `const'. + + -- Function: gsl_vector_view gsl_vector_subvector_with_stride + (gsl_vector * V, size_t OFFSET, size_t STRIDE, size_t N) + -- Function: gsl_vector_const_view +gsl_vector_const_subvector_with_stride (const gsl_vector * V, size_t + OFFSET, size_t STRIDE, size_t N) + These functions return a vector view of a subvector of another + vector V with an additional stride argument. The subvector is + formed in the same way as for `gsl_vector_subvector' but the new + vector has N elements with a step-size of STRIDE from one element + to the next in the original vector. Mathematically, the I-th + element of the new vector V' is given by, + + v'(i) = v->data[(offset + i*stride)*v->stride] + + where the index I runs from 0 to `n-1'. + + Note that subvector views give direct access to the underlying + elements of the original vector. For example, the following code + will zero the even elements of the vector `v' of length `n', while + leaving the odd elements untouched, + + gsl_vector_view v_even + = gsl_vector_subvector_with_stride (v, 0, 2, n/2); + gsl_vector_set_zero (&v_even.vector); + + A vector view can be passed to any subroutine which takes a vector + argument just as a directly allocated vector would be, using + `&'VIEW`.vector'. For example, the following code computes the + norm of the odd elements of `v' using the BLAS routine DNRM2, + + gsl_vector_view v_odd + = gsl_vector_subvector_with_stride (v, 1, 2, n/2); + double r = gsl_blas_dnrm2 (&v_odd.vector); + + The function `gsl_vector_const_subvector_with_stride' is equivalent + to `gsl_vector_subvector_with_stride' but can be used for vectors + which are declared `const'. + + -- Function: gsl_vector_view gsl_vector_complex_real + (gsl_vector_complex * V) + -- Function: gsl_vector_const_view gsl_vector_complex_const_real + (const gsl_vector_complex * V) + These functions return a vector view of the real parts of the + complex vector V. + + The function `gsl_vector_complex_const_real' is equivalent to + `gsl_vector_complex_real' but can be used for vectors which are + declared `const'. + + -- Function: gsl_vector_view gsl_vector_complex_imag + (gsl_vector_complex * V) + -- Function: gsl_vector_const_view gsl_vector_complex_const_imag + (const gsl_vector_complex * V) + These functions return a vector view of the imaginary parts of the + complex vector V. + + The function `gsl_vector_complex_const_imag' is equivalent to + `gsl_vector_complex_imag' but can be used for vectors which are + declared `const'. + + -- Function: gsl_vector_view gsl_vector_view_array (double * BASE, + size_t N) + -- Function: gsl_vector_const_view gsl_vector_const_view_array (const + double * BASE, size_t N) + These functions return a vector view of an array. The start of + the new vector is given by BASE and has N elements. + Mathematically, the I-th element of the new vector V' is given by, + + v'(i) = base[i] + + where the index I runs from 0 to `n-1'. + + The array containing the elements of V is not owned by the new + vector view. When the view goes out of scope the original array + will continue to exist. The original memory can only be + deallocated by freeing the original pointer BASE. Of course, the + original array should not be deallocated while the view is still + in use. + + The function `gsl_vector_const_view_array' is equivalent to + `gsl_vector_view_array' but can be used for arrays which are + declared `const'. + + -- Function: gsl_vector_view gsl_vector_view_array_with_stride (double + * BASE, size_t STRIDE, size_t N) + -- Function: gsl_vector_const_view +gsl_vector_const_view_array_with_stride (const double * BASE, size_t + STRIDE, size_t N) + These functions return a vector view of an array BASE with an + additional stride argument. The subvector is formed in the same + way as for `gsl_vector_view_array' but the new vector has N + elements with a step-size of STRIDE from one element to the next + in the original array. Mathematically, the I-th element of the new + vector V' is given by, + + v'(i) = base[i*stride] + + where the index I runs from 0 to `n-1'. + + Note that the view gives direct access to the underlying elements + of the original array. A vector view can be passed to any + subroutine which takes a vector argument just as a directly + allocated vector would be, using `&'VIEW`.vector'. + + The function `gsl_vector_const_view_array_with_stride' is + equivalent to `gsl_vector_view_array_with_stride' but can be used + for arrays which are declared `const'. + + +File: gsl-ref.info, Node: Copying vectors, Next: Exchanging elements, Prev: Vector views, Up: Vectors + +8.3.6 Copying vectors +--------------------- + +Common operations on vectors such as addition and multiplication are +available in the BLAS part of the library (*note BLAS Support::). +However, it is useful to have a small number of utility functions which +do not require the full BLAS code. The following functions fall into +this category. + + -- Function: int gsl_vector_memcpy (gsl_vector * DEST, const + gsl_vector * SRC) + This function copies the elements of the vector SRC into the + vector DEST. The two vectors must have the same length. + + -- Function: int gsl_vector_swap (gsl_vector * V, gsl_vector * W) + This function exchanges the elements of the vectors V and W by + copying. The two vectors must have the same length. + + +File: gsl-ref.info, Node: Exchanging elements, Next: Vector operations, Prev: Copying vectors, Up: Vectors + +8.3.7 Exchanging elements +------------------------- + +The following function can be used to exchange, or permute, the elements +of a vector. + + -- Function: int gsl_vector_swap_elements (gsl_vector * V, size_t I, + size_t J) + This function exchanges the I-th and J-th elements of the vector V + in-place. + + -- Function: int gsl_vector_reverse (gsl_vector * V) + This function reverses the order of the elements of the vector V. + + +File: gsl-ref.info, Node: Vector operations, Next: Finding maximum and minimum elements of vectors, Prev: Exchanging elements, Up: Vectors + +8.3.8 Vector operations +----------------------- + +The following operations are only defined for real vectors. + + -- Function: int gsl_vector_add (gsl_vector * A, const gsl_vector * B) + This function adds the elements of vector B to the elements of + vector A, a'_i = a_i + b_i. The two vectors must have the same + length. + + -- Function: int gsl_vector_sub (gsl_vector * A, const gsl_vector * B) + This function subtracts the elements of vector B from the elements + of vector A, a'_i = a_i - b_i. The two vectors must have the same + length. + + -- Function: int gsl_vector_mul (gsl_vector * A, const gsl_vector * B) + This function multiplies the elements of vector A by the elements + of vector B, a'_i = a_i * b_i. The two vectors must have the same + length. + + -- Function: int gsl_vector_div (gsl_vector * A, const gsl_vector * B) + This function divides the elements of vector A by the elements of + vector B, a'_i = a_i / b_i. The two vectors must have the same + length. + + -- Function: int gsl_vector_scale (gsl_vector * A, const double X) + This function multiplies the elements of vector A by the constant + factor X, a'_i = x a_i. + + -- Function: int gsl_vector_add_constant (gsl_vector * A, const double + X) + This function adds the constant value X to the elements of the + vector A, a'_i = a_i + x. + + +File: gsl-ref.info, Node: Finding maximum and minimum elements of vectors, Next: Vector properties, Prev: Vector operations, Up: Vectors + +8.3.9 Finding maximum and minimum elements of vectors +----------------------------------------------------- + + -- Function: double gsl_vector_max (const gsl_vector * V) + This function returns the maximum value in the vector V. + + -- Function: double gsl_vector_min (const gsl_vector * V) + This function returns the minimum value in the vector V. + + -- Function: void gsl_vector_minmax (const gsl_vector * V, double * + MIN_OUT, double * MAX_OUT) + This function returns the minimum and maximum values in the vector + V, storing them in MIN_OUT and MAX_OUT. + + -- Function: size_t gsl_vector_max_index (const gsl_vector * V) + This function returns the index of the maximum value in the vector + V. When there are several equal maximum elements then the lowest + index is returned. + + -- Function: size_t gsl_vector_min_index (const gsl_vector * V) + This function returns the index of the minimum value in the vector + V. When there are several equal minimum elements then the lowest + index is returned. + + -- Function: void gsl_vector_minmax_index (const gsl_vector * V, + size_t * IMIN, size_t * IMAX) + This function returns the indices of the minimum and maximum + values in the vector V, storing them in IMIN and IMAX. When there + are several equal minimum or maximum elements then the lowest + indices are returned. + + +File: gsl-ref.info, Node: Vector properties, Next: Example programs for vectors, Prev: Finding maximum and minimum elements of vectors, Up: Vectors + +8.3.10 Vector properties +------------------------ + + -- Function: int gsl_vector_isnull (const gsl_vector * V) + -- Function: int gsl_vector_ispos (const gsl_vector * V) + -- Function: int gsl_vector_isneg (const gsl_vector * V) + These functions return 1 if all the elements of the vector V are + zero, strictly positive, or strictly negative respectively, and 0 + otherwise. To test for a non-negative vector, use the expression + `!gsl_vector_isneg(v)'. + + +File: gsl-ref.info, Node: Example programs for vectors, Prev: Vector properties, Up: Vectors + +8.3.11 Example programs for vectors +----------------------------------- + +This program shows how to allocate, initialize and read from a vector +using the functions `gsl_vector_alloc', `gsl_vector_set' and +`gsl_vector_get'. + + #include <stdio.h> + #include <gsl/gsl_vector.h> + + int + main (void) + { + int i; + gsl_vector * v = gsl_vector_alloc (3); + + for (i = 0; i < 3; i++) + { + gsl_vector_set (v, i, 1.23 + i); + } + + for (i = 0; i < 100; i++) /* OUT OF RANGE ERROR */ + { + printf ("v_%d = %g\n", i, gsl_vector_get (v, i)); + } + + gsl_vector_free (v); + return 0; + } + +Here is the output from the program. The final loop attempts to read +outside the range of the vector `v', and the error is trapped by the +range-checking code in `gsl_vector_get'. + + $ ./a.out + v_0 = 1.23 + v_1 = 2.23 + v_2 = 3.23 + gsl: vector_source.c:12: ERROR: index out of range + Default GSL error handler invoked. + Aborted (core dumped) + +The next program shows how to write a vector to a file. + + #include <stdio.h> + #include <gsl/gsl_vector.h> + + int + main (void) + { + int i; + gsl_vector * v = gsl_vector_alloc (100); + + for (i = 0; i < 100; i++) + { + gsl_vector_set (v, i, 1.23 + i); + } + + { + FILE * f = fopen ("test.dat", "w"); + gsl_vector_fprintf (f, v, "%.5g"); + fclose (f); + } + + gsl_vector_free (v); + return 0; + } + +After running this program the file `test.dat' should contain the +elements of `v', written using the format specifier `%.5g'. The vector +could then be read back in using the function `gsl_vector_fscanf (f, +v)' as follows: + + #include <stdio.h> + #include <gsl/gsl_vector.h> + + int + main (void) + { + int i; + gsl_vector * v = gsl_vector_alloc (10); + + { + FILE * f = fopen ("test.dat", "r"); + gsl_vector_fscanf (f, v); + fclose (f); + } + + for (i = 0; i < 10; i++) + { + printf ("%g\n", gsl_vector_get(v, i)); + } + + gsl_vector_free (v); + return 0; + } + + +File: gsl-ref.info, Node: Matrices, Next: Vector and Matrix References and Further Reading, Prev: Vectors, Up: Vectors and Matrices + +8.4 Matrices +============ + +Matrices are defined by a `gsl_matrix' structure which describes a +generalized slice of a block. Like a vector it represents a set of +elements in an area of memory, but uses two indices instead of one. + + The `gsl_matrix' structure contains six components, the two +dimensions of the matrix, a physical dimension, a pointer to the memory +where the elements of the matrix are stored, DATA, a pointer to the +block owned by the matrix BLOCK, if any, and an ownership flag, OWNER. +The physical dimension determines the memory layout and can differ from +the matrix dimension to allow the use of submatrices. The `gsl_matrix' +structure is very simple and looks like this, + + typedef struct + { + size_t size1; + size_t size2; + size_t tda; + double * data; + gsl_block * block; + int owner; + } gsl_matrix; + +Matrices are stored in row-major order, meaning that each row of +elements forms a contiguous block in memory. This is the standard +"C-language ordering" of two-dimensional arrays. Note that FORTRAN +stores arrays in column-major order. The number of rows is SIZE1. The +range of valid row indices runs from 0 to `size1-1'. Similarly SIZE2 +is the number of columns. The range of valid column indices runs from +0 to `size2-1'. The physical row dimension TDA, or "trailing +dimension", specifies the size of a row of the matrix as laid out in +memory. + + For example, in the following matrix SIZE1 is 3, SIZE2 is 4, and TDA +is 8. The physical memory layout of the matrix begins in the top left +hand-corner and proceeds from left to right along each row in turn. + + 00 01 02 03 XX XX XX XX + 10 11 12 13 XX XX XX XX + 20 21 22 23 XX XX XX XX + +Each unused memory location is represented by "`XX'". The pointer DATA +gives the location of the first element of the matrix in memory. The +pointer BLOCK stores the location of the memory block in which the +elements of the matrix are located (if any). If the matrix owns this +block then the OWNER field is set to one and the block will be +deallocated when the matrix is freed. If the matrix is only a slice of +a block owned by another object then the OWNER field is zero and any +underlying block will not be freed. + + The functions for allocating and accessing matrices are defined in +`gsl_matrix.h' + +* Menu: + +* Matrix allocation:: +* Accessing matrix elements:: +* Initializing matrix elements:: +* Reading and writing matrices:: +* Matrix views:: +* Creating row and column views:: +* Copying matrices:: +* Copying rows and columns:: +* Exchanging rows and columns:: +* Matrix operations:: +* Finding maximum and minimum elements of matrices:: +* Matrix properties:: +* Example programs for matrices:: + + +File: gsl-ref.info, Node: Matrix allocation, Next: Accessing matrix elements, Up: Matrices + +8.4.1 Matrix allocation +----------------------- + +The functions for allocating memory to a matrix follow the style of +`malloc' and `free'. They also perform their own error checking. If +there is insufficient memory available to allocate a vector then the +functions call the GSL error handler (with an error number of +`GSL_ENOMEM') in addition to returning a null pointer. Thus if you use +the library error handler to abort your program then it isn't necessary +to check every `alloc'. + + -- Function: gsl_matrix * gsl_matrix_alloc (size_t N1, size_t N2) + This function creates a matrix of size N1 rows by N2 columns, + returning a pointer to a newly initialized matrix struct. A new + block is allocated for the elements of the matrix, and stored in + the BLOCK component of the matrix struct. The block is "owned" by + the matrix, and will be deallocated when the matrix is deallocated. + + -- Function: gsl_matrix * gsl_matrix_calloc (size_t N1, size_t N2) + This function allocates memory for a matrix of size N1 rows by N2 + columns and initializes all the elements of the matrix to zero. + + -- Function: void gsl_matrix_free (gsl_matrix * M) + This function frees a previously allocated matrix M. If the + matrix was created using `gsl_matrix_alloc' then the block + underlying the matrix will also be deallocated. If the matrix has + been created from another object then the memory is still owned by + that object and will not be deallocated. The matrix M must be a + valid matrix object (a null pointer is not allowed). + + +File: gsl-ref.info, Node: Accessing matrix elements, Next: Initializing matrix elements, Prev: Matrix allocation, Up: Matrices + +8.4.2 Accessing matrix elements +------------------------------- + +The functions for accessing the elements of a matrix use the same range +checking system as vectors. You can turn off range checking by +recompiling your program with the preprocessor definition +`GSL_RANGE_CHECK_OFF'. + + The elements of the matrix are stored in "C-order", where the second +index moves continuously through memory. More precisely, the element +accessed by the function `gsl_matrix_get(m,i,j)' and +`gsl_matrix_set(m,i,j,x)' is + + m->data[i * m->tda + j] + +where TDA is the physical row-length of the matrix. + + -- Function: double gsl_matrix_get (const gsl_matrix * M, size_t I, + size_t J) + This function returns the (i,j)-th element of a matrix M. If I or + J lie outside the allowed range of 0 to N1-1 and 0 to N2-1 then + the error handler is invoked and 0 is returned. + + -- Function: void gsl_matrix_set (gsl_matrix * M, size_t I, size_t J, + double X) + This function sets the value of the (i,j)-th element of a matrix M + to X. If I or J lies outside the allowed range of 0 to N1-1 and 0 + to N2-1 then the error handler is invoked. + + -- Function: double * gsl_matrix_ptr (gsl_matrix * M, size_t I, size_t + J) + -- Function: const double * gsl_matrix_const_ptr (const gsl_matrix * + M, size_t I, size_t J) + These functions return a pointer to the (i,j)-th element of a + matrix M. If I or J lie outside the allowed range of 0 to N1-1 + and 0 to N2-1 then the error handler is invoked and a null pointer + is returned. + + +File: gsl-ref.info, Node: Initializing matrix elements, Next: Reading and writing matrices, Prev: Accessing matrix elements, Up: Matrices + +8.4.3 Initializing matrix elements +---------------------------------- + + -- Function: void gsl_matrix_set_all (gsl_matrix * M, double X) + This function sets all the elements of the matrix M to the value X. + + -- Function: void gsl_matrix_set_zero (gsl_matrix * M) + This function sets all the elements of the matrix M to zero. + + -- Function: void gsl_matrix_set_identity (gsl_matrix * M) + This function sets the elements of the matrix M to the + corresponding elements of the identity matrix, m(i,j) = + \delta(i,j), i.e. a unit diagonal with all off-diagonal elements + zero. This applies to both square and rectangular matrices. + + +File: gsl-ref.info, Node: Reading and writing matrices, Next: Matrix views, Prev: Initializing matrix elements, Up: Matrices + +8.4.4 Reading and writing matrices +---------------------------------- + +The library provides functions for reading and writing matrices to a +file as binary data or formatted text. + + -- Function: int gsl_matrix_fwrite (FILE * STREAM, const gsl_matrix * + M) + This function writes the elements of the matrix M to the stream + STREAM in binary format. The return value is 0 for success and + `GSL_EFAILED' if there was a problem writing to the file. Since + the data is written in the native binary format it may not be + portable between different architectures. + + -- Function: int gsl_matrix_fread (FILE * STREAM, gsl_matrix * M) + This function reads into the matrix M from the open stream STREAM + in binary format. The matrix M must be preallocated with the + correct dimensions since the function uses the size of M to + determine how many bytes to read. The return value is 0 for + success and `GSL_EFAILED' if there was a problem reading from the + file. The data is assumed to have been written in the native + binary format on the same architecture. + + -- Function: int gsl_matrix_fprintf (FILE * STREAM, const gsl_matrix * + M, const char * FORMAT) + This function writes the elements of the matrix M line-by-line to + the stream STREAM using the format specifier FORMAT, which should + be one of the `%g', `%e' or `%f' formats for floating point + numbers and `%d' for integers. The function returns 0 for success + and `GSL_EFAILED' if there was a problem writing to the file. + + -- Function: int gsl_matrix_fscanf (FILE * STREAM, gsl_matrix * M) + This function reads formatted data from the stream STREAM into the + matrix M. The matrix M must be preallocated with the correct + dimensions since the function uses the size of M to determine how + many numbers to read. The function returns 0 for success and + `GSL_EFAILED' if there was a problem reading from the file. + + +File: gsl-ref.info, Node: Matrix views, Next: Creating row and column views, Prev: Reading and writing matrices, Up: Matrices + +8.4.5 Matrix views +------------------ + +A matrix view is a temporary object, stored on the stack, which can be +used to operate on a subset of matrix elements. Matrix views can be +defined for both constant and non-constant matrices using separate types +that preserve constness. A matrix view has the type `gsl_matrix_view' +and a constant matrix view has the type `gsl_matrix_const_view'. In +both cases the elements of the view can by accessed using the `matrix' +component of the view object. A pointer `gsl_matrix *' or `const +gsl_matrix *' can be obtained by taking the address of the `matrix' +component with the `&' operator. In addition to matrix views it is +also possible to create vector views of a matrix, such as row or column +views. + + -- Function: gsl_matrix_view gsl_matrix_submatrix (gsl_matrix * M, + size_t K1, size_t K2, size_t N1, size_t N2) + -- Function: gsl_matrix_const_view gsl_matrix_const_submatrix (const + gsl_matrix * M, size_t K1, size_t K2, size_t N1, size_t N2) + These functions return a matrix view of a submatrix of the matrix + M. The upper-left element of the submatrix is the element (K1,K2) + of the original matrix. The submatrix has N1 rows and N2 columns. + The physical number of columns in memory given by TDA is + unchanged. Mathematically, the (i,j)-th element of the new matrix + is given by, + + m'(i,j) = m->data[(k1*m->tda + k2) + i*m->tda + j] + + where the index I runs from 0 to `n1-1' and the index J runs from + 0 to `n2-1'. + + The `data' pointer of the returned matrix struct is set to null if + the combined parameters (I,J,N1,N2,TDA) overrun the ends of the + original matrix. + + The new matrix view is only a view of the block underlying the + existing matrix, M. The block containing the elements of M is not + owned by the new matrix view. When the view goes out of scope the + original matrix M and its block will continue to exist. The + original memory can only be deallocated by freeing the original + matrix. Of course, the original matrix should not be deallocated + while the view is still in use. + + The function `gsl_matrix_const_submatrix' is equivalent to + `gsl_matrix_submatrix' but can be used for matrices which are + declared `const'. + + -- Function: gsl_matrix_view gsl_matrix_view_array (double * BASE, + size_t N1, size_t N2) + -- Function: gsl_matrix_const_view gsl_matrix_const_view_array (const + double * BASE, size_t N1, size_t N2) + These functions return a matrix view of the array BASE. The + matrix has N1 rows and N2 columns. The physical number of columns + in memory is also given by N2. Mathematically, the (i,j)-th + element of the new matrix is given by, + + m'(i,j) = base[i*n2 + j] + + where the index I runs from 0 to `n1-1' and the index J runs from + 0 to `n2-1'. + + The new matrix is only a view of the array BASE. When the view + goes out of scope the original array BASE will continue to exist. + The original memory can only be deallocated by freeing the original + array. Of course, the original array should not be deallocated + while the view is still in use. + + The function `gsl_matrix_const_view_array' is equivalent to + `gsl_matrix_view_array' but can be used for matrices which are + declared `const'. + + -- Function: gsl_matrix_view gsl_matrix_view_array_with_tda (double * + BASE, size_t N1, size_t N2, size_t TDA) + -- Function: gsl_matrix_const_view + gsl_matrix_const_view_array_with_tda (const double * BASE, + size_t N1, size_t N2, size_t TDA) + These functions return a matrix view of the array BASE with a + physical number of columns TDA which may differ from the + corresponding dimension of the matrix. The matrix has N1 rows and + N2 columns, and the physical number of columns in memory is given + by TDA. Mathematically, the (i,j)-th element of the new matrix is + given by, + + m'(i,j) = base[i*tda + j] + + where the index I runs from 0 to `n1-1' and the index J runs from + 0 to `n2-1'. + + The new matrix is only a view of the array BASE. When the view + goes out of scope the original array BASE will continue to exist. + The original memory can only be deallocated by freeing the original + array. Of course, the original array should not be deallocated + while the view is still in use. + + The function `gsl_matrix_const_view_array_with_tda' is equivalent + to `gsl_matrix_view_array_with_tda' but can be used for matrices + which are declared `const'. + + -- Function: gsl_matrix_view gsl_matrix_view_vector (gsl_vector * V, + size_t N1, size_t N2) + -- Function: gsl_matrix_const_view gsl_matrix_const_view_vector (const + gsl_vector * V, size_t N1, size_t N2) + These functions return a matrix view of the vector V. The matrix + has N1 rows and N2 columns. The vector must have unit stride. The + physical number of columns in memory is also given by N2. + Mathematically, the (i,j)-th element of the new matrix is given by, + + m'(i,j) = v->data[i*n2 + j] + + where the index I runs from 0 to `n1-1' and the index J runs from + 0 to `n2-1'. + + The new matrix is only a view of the vector V. When the view goes + out of scope the original vector V will continue to exist. The + original memory can only be deallocated by freeing the original + vector. Of course, the original vector should not be deallocated + while the view is still in use. + + The function `gsl_matrix_const_view_vector' is equivalent to + `gsl_matrix_view_vector' but can be used for matrices which are + declared `const'. + + -- Function: gsl_matrix_view gsl_matrix_view_vector_with_tda + (gsl_vector * V, size_t N1, size_t N2, size_t TDA) + -- Function: gsl_matrix_const_view +gsl_matrix_const_view_vector_with_tda (const gsl_vector * V, size_t N1, + size_t N2, size_t TDA) + These functions return a matrix view of the vector V with a + physical number of columns TDA which may differ from the + corresponding matrix dimension. The vector must have unit stride. + The matrix has N1 rows and N2 columns, and the physical number of + columns in memory is given by TDA. Mathematically, the (i,j)-th + element of the new matrix is given by, + + m'(i,j) = v->data[i*tda + j] + + where the index I runs from 0 to `n1-1' and the index J runs from + 0 to `n2-1'. + + The new matrix is only a view of the vector V. When the view goes + out of scope the original vector V will continue to exist. The + original memory can only be deallocated by freeing the original + vector. Of course, the original vector should not be deallocated + while the view is still in use. + + The function `gsl_matrix_const_view_vector_with_tda' is equivalent + to `gsl_matrix_view_vector_with_tda' but can be used for matrices + which are declared `const'. + + +File: gsl-ref.info, Node: Creating row and column views, Next: Copying matrices, Prev: Matrix views, Up: Matrices + +8.4.6 Creating row and column views +----------------------------------- + +In general there are two ways to access an object, by reference or by +copying. The functions described in this section create vector views +which allow access to a row or column of a matrix by reference. +Modifying elements of the view is equivalent to modifying the matrix, +since both the vector view and the matrix point to the same memory +block. + + -- Function: gsl_vector_view gsl_matrix_row (gsl_matrix * M, size_t I) + -- Function: gsl_vector_const_view gsl_matrix_const_row (const + gsl_matrix * M, size_t I) + These functions return a vector view of the I-th row of the matrix + M. The `data' pointer of the new vector is set to null if I is + out of range. + + The function `gsl_vector_const_row' is equivalent to + `gsl_matrix_row' but can be used for matrices which are declared + `const'. + + -- Function: gsl_vector_view gsl_matrix_column (gsl_matrix * M, size_t + J) + -- Function: gsl_vector_const_view gsl_matrix_const_column (const + gsl_matrix * M, size_t J) + These functions return a vector view of the J-th column of the + matrix M. The `data' pointer of the new vector is set to null if + J is out of range. + + The function `gsl_vector_const_column' is equivalent to + `gsl_matrix_column' but can be used for matrices which are declared + `const'. + + -- Function: gsl_vector_view gsl_matrix_diagonal (gsl_matrix * M) + -- Function: gsl_vector_const_view gsl_matrix_const_diagonal (const + gsl_matrix * M) + These functions returns a vector view of the diagonal of the matrix + M. The matrix M is not required to be square. For a rectangular + matrix the length of the diagonal is the same as the smaller + dimension of the matrix. + + The function `gsl_matrix_const_diagonal' is equivalent to + `gsl_matrix_diagonal' but can be used for matrices which are + declared `const'. + + -- Function: gsl_vector_view gsl_matrix_subdiagonal (gsl_matrix * M, + size_t K) + -- Function: gsl_vector_const_view gsl_matrix_const_subdiagonal (const + gsl_matrix * M, size_t K) + These functions return a vector view of the K-th subdiagonal of + the matrix M. The matrix M is not required to be square. The + diagonal of the matrix corresponds to k = 0. + + The function `gsl_matrix_const_subdiagonal' is equivalent to + `gsl_matrix_subdiagonal' but can be used for matrices which are + declared `const'. + + -- Function: gsl_vector_view gsl_matrix_superdiagonal (gsl_matrix * M, + size_t K) + -- Function: gsl_vector_const_view gsl_matrix_const_superdiagonal + (const gsl_matrix * M, size_t K) + These functions return a vector view of the K-th superdiagonal of + the matrix M. The matrix M is not required to be square. The + diagonal of the matrix corresponds to k = 0. + + The function `gsl_matrix_const_superdiagonal' is equivalent to + `gsl_matrix_superdiagonal' but can be used for matrices which are + declared `const'. + + +File: gsl-ref.info, Node: Copying matrices, Next: Copying rows and columns, Prev: Creating row and column views, Up: Matrices + +8.4.7 Copying matrices +---------------------- + + -- Function: int gsl_matrix_memcpy (gsl_matrix * DEST, const + gsl_matrix * SRC) + This function copies the elements of the matrix SRC into the + matrix DEST. The two matrices must have the same size. + + -- Function: int gsl_matrix_swap (gsl_matrix * M1, gsl_matrix * M2) + This function exchanges the elements of the matrices M1 and M2 by + copying. The two matrices must have the same size. + + +File: gsl-ref.info, Node: Copying rows and columns, Next: Exchanging rows and columns, Prev: Copying matrices, Up: Matrices + +8.4.8 Copying rows and columns +------------------------------ + +The functions described in this section copy a row or column of a matrix +into a vector. This allows the elements of the vector and the matrix to +be modified independently. Note that if the matrix and the vector point +to overlapping regions of memory then the result will be undefined. The +same effect can be achieved with more generality using +`gsl_vector_memcpy' with vector views of rows and columns. + + -- Function: int gsl_matrix_get_row (gsl_vector * V, const gsl_matrix + * M, size_t I) + This function copies the elements of the I-th row of the matrix M + into the vector V. The length of the vector must be the same as + the length of the row. + + -- Function: int gsl_matrix_get_col (gsl_vector * V, const gsl_matrix + * M, size_t J) + This function copies the elements of the J-th column of the matrix + M into the vector V. The length of the vector must be the same as + the length of the column. + + -- Function: int gsl_matrix_set_row (gsl_matrix * M, size_t I, const + gsl_vector * V) + This function copies the elements of the vector V into the I-th + row of the matrix M. The length of the vector must be the same as + the length of the row. + + -- Function: int gsl_matrix_set_col (gsl_matrix * M, size_t J, const + gsl_vector * V) + This function copies the elements of the vector V into the J-th + column of the matrix M. The length of the vector must be the same + as the length of the column. + + +File: gsl-ref.info, Node: Exchanging rows and columns, Next: Matrix operations, Prev: Copying rows and columns, Up: Matrices + +8.4.9 Exchanging rows and columns +--------------------------------- + +The following functions can be used to exchange the rows and columns of +a matrix. + + -- Function: int gsl_matrix_swap_rows (gsl_matrix * M, size_t I, + size_t J) + This function exchanges the I-th and J-th rows of the matrix M + in-place. + + -- Function: int gsl_matrix_swap_columns (gsl_matrix * M, size_t I, + size_t J) + This function exchanges the I-th and J-th columns of the matrix M + in-place. + + -- Function: int gsl_matrix_swap_rowcol (gsl_matrix * M, size_t I, + size_t J) + This function exchanges the I-th row and J-th column of the matrix + M in-place. The matrix must be square for this operation to be + possible. + + -- Function: int gsl_matrix_transpose_memcpy (gsl_matrix * DEST, const + gsl_matrix * SRC) + This function makes the matrix DEST the transpose of the matrix + SRC by copying the elements of SRC into DEST. This function works + for all matrices provided that the dimensions of the matrix DEST + match the transposed dimensions of the matrix SRC. + + -- Function: int gsl_matrix_transpose (gsl_matrix * M) + This function replaces the matrix M by its transpose by copying + the elements of the matrix in-place. The matrix must be square + for this operation to be possible. + + +File: gsl-ref.info, Node: Matrix operations, Next: Finding maximum and minimum elements of matrices, Prev: Exchanging rows and columns, Up: Matrices + +8.4.10 Matrix operations +------------------------ + +The following operations are defined for real and complex matrices. + + -- Function: int gsl_matrix_add (gsl_matrix * A, const gsl_matrix * B) + This function adds the elements of matrix B to the elements of + matrix A, a'(i,j) = a(i,j) + b(i,j). The two matrices must have the + same dimensions. + + -- Function: int gsl_matrix_sub (gsl_matrix * A, const gsl_matrix * B) + This function subtracts the elements of matrix B from the elements + of matrix A, a'(i,j) = a(i,j) - b(i,j). The two matrices must have + the same dimensions. + + -- Function: int gsl_matrix_mul_elements (gsl_matrix * A, const + gsl_matrix * B) + This function multiplies the elements of matrix A by the elements + of matrix B, a'(i,j) = a(i,j) * b(i,j). The two matrices must have + the same dimensions. + + -- Function: int gsl_matrix_div_elements (gsl_matrix * A, const + gsl_matrix * B) + This function divides the elements of matrix A by the elements of + matrix B, a'(i,j) = a(i,j) / b(i,j). The two matrices must have the + same dimensions. + + -- Function: int gsl_matrix_scale (gsl_matrix * A, const double X) + This function multiplies the elements of matrix A by the constant + factor X, a'(i,j) = x a(i,j). + + -- Function: int gsl_matrix_add_constant (gsl_matrix * A, const double + X) + This function adds the constant value X to the elements of the + matrix A, a'(i,j) = a(i,j) + x. + + +File: gsl-ref.info, Node: Finding maximum and minimum elements of matrices, Next: Matrix properties, Prev: Matrix operations, Up: Matrices + +8.4.11 Finding maximum and minimum elements of matrices +------------------------------------------------------- + +The following operations are only defined for real matrices. + + -- Function: double gsl_matrix_max (const gsl_matrix * M) + This function returns the maximum value in the matrix M. + + -- Function: double gsl_matrix_min (const gsl_matrix * M) + This function returns the minimum value in the matrix M. + + -- Function: void gsl_matrix_minmax (const gsl_matrix * M, double * + MIN_OUT, double * MAX_OUT) + This function returns the minimum and maximum values in the matrix + M, storing them in MIN_OUT and MAX_OUT. + + -- Function: void gsl_matrix_max_index (const gsl_matrix * M, size_t * + IMAX, size_t * JMAX) + This function returns the indices of the maximum value in the + matrix M, storing them in IMAX and JMAX. When there are several + equal maximum elements then the first element found is returned, + searching in row-major order. + + -- Function: void gsl_matrix_min_index (const gsl_matrix * M, size_t * + IMIN, size_t * JMIN) + This function returns the indices of the minimum value in the + matrix M, storing them in IMIN and JMIN. When there are several + equal minimum elements then the first element found is returned, + searching in row-major order. + + -- Function: void gsl_matrix_minmax_index (const gsl_matrix * M, + size_t * IMIN, size_t * JMIN, size_t * IMAX, size_t * JMAX) + This function returns the indices of the minimum and maximum + values in the matrix M, storing them in (IMIN,JMIN) and + (IMAX,JMAX). When there are several equal minimum or maximum + elements then the first elements found are returned, searching in + row-major order. + + +File: gsl-ref.info, Node: Matrix properties, Next: Example programs for matrices, Prev: Finding maximum and minimum elements of matrices, Up: Matrices + +8.4.12 Matrix properties +------------------------ + + -- Function: int gsl_matrix_isnull (const gsl_matrix * M) + -- Function: int gsl_matrix_ispos (const gsl_matrix * M) + -- Function: int gsl_matrix_isneg (const gsl_matrix * M) + These functions return 1 if all the elements of the matrix M are + zero, strictly positive, or strictly negative respectively, and 0 + otherwise. To test for a non-negative matrix, use the expression + `!gsl_matrix_isneg(m)'. To test whether a matrix is + positive-definite, use the Cholesky decomposition (*note Cholesky + Decomposition::). + + +File: gsl-ref.info, Node: Example programs for matrices, Prev: Matrix properties, Up: Matrices + +8.4.13 Example programs for matrices +------------------------------------ + +The program below shows how to allocate, initialize and read from a +matrix using the functions `gsl_matrix_alloc', `gsl_matrix_set' and +`gsl_matrix_get'. + + #include <stdio.h> + #include <gsl/gsl_matrix.h> + + int + main (void) + { + int i, j; + gsl_matrix * m = gsl_matrix_alloc (10, 3); + + for (i = 0; i < 10; i++) + for (j = 0; j < 3; j++) + gsl_matrix_set (m, i, j, 0.23 + 100*i + j); + + for (i = 0; i < 100; i++) /* OUT OF RANGE ERROR */ + for (j = 0; j < 3; j++) + printf ("m(%d,%d) = %g\n", i, j, + gsl_matrix_get (m, i, j)); + + gsl_matrix_free (m); + + return 0; + } + +Here is the output from the program. The final loop attempts to read +outside the range of the matrix `m', and the error is trapped by the +range-checking code in `gsl_matrix_get'. + + $ ./a.out + m(0,0) = 0.23 + m(0,1) = 1.23 + m(0,2) = 2.23 + m(1,0) = 100.23 + m(1,1) = 101.23 + m(1,2) = 102.23 + ... + m(9,2) = 902.23 + gsl: matrix_source.c:13: ERROR: first index out of range + Default GSL error handler invoked. + Aborted (core dumped) + +The next program shows how to write a matrix to a file. + + #include <stdio.h> + #include <gsl/gsl_matrix.h> + + int + main (void) + { + int i, j, k = 0; + gsl_matrix * m = gsl_matrix_alloc (100, 100); + gsl_matrix * a = gsl_matrix_alloc (100, 100); + + for (i = 0; i < 100; i++) + for (j = 0; j < 100; j++) + gsl_matrix_set (m, i, j, 0.23 + i + j); + + { + FILE * f = fopen ("test.dat", "wb"); + gsl_matrix_fwrite (f, m); + fclose (f); + } + + { + FILE * f = fopen ("test.dat", "rb"); + gsl_matrix_fread (f, a); + fclose (f); + } + + for (i = 0; i < 100; i++) + for (j = 0; j < 100; j++) + { + double mij = gsl_matrix_get (m, i, j); + double aij = gsl_matrix_get (a, i, j); + if (mij != aij) k++; + } + + gsl_matrix_free (m); + gsl_matrix_free (a); + + printf ("differences = %d (should be zero)\n", k); + return (k > 0); + } + +After running this program the file `test.dat' should contain the +elements of `m', written in binary format. The matrix which is read +back in using the function `gsl_matrix_fread' should be exactly equal +to the original matrix. + + The following program demonstrates the use of vector views. The +program computes the column norms of a matrix. + + #include <math.h> + #include <stdio.h> + #include <gsl/gsl_matrix.h> + #include <gsl/gsl_blas.h> + + int + main (void) + { + size_t i,j; + + gsl_matrix *m = gsl_matrix_alloc (10, 10); + + for (i = 0; i < 10; i++) + for (j = 0; j < 10; j++) + gsl_matrix_set (m, i, j, sin (i) + cos (j)); + + for (j = 0; j < 10; j++) + { + gsl_vector_view column = gsl_matrix_column (m, j); + double d; + + d = gsl_blas_dnrm2 (&column.vector); + + printf ("matrix column %d, norm = %g\n", j, d); + } + + gsl_matrix_free (m); + + return 0; + } + +Here is the output of the program, + + $ ./a.out + matrix column 0, norm = 4.31461 + matrix column 1, norm = 3.1205 + matrix column 2, norm = 2.19316 + matrix column 3, norm = 3.26114 + matrix column 4, norm = 2.53416 + matrix column 5, norm = 2.57281 + matrix column 6, norm = 4.20469 + matrix column 7, norm = 3.65202 + matrix column 8, norm = 2.08524 + matrix column 9, norm = 3.07313 + +The results can be confirmed using GNU OCTAVE, + + $ octave + GNU Octave, version 2.0.16.92 + octave> m = sin(0:9)' * ones(1,10) + + ones(10,1) * cos(0:9); + octave> sqrt(sum(m.^2)) + ans = + 4.3146 3.1205 2.1932 3.2611 2.5342 2.5728 + 4.2047 3.6520 2.0852 3.0731 + + +File: gsl-ref.info, Node: Vector and Matrix References and Further Reading, Prev: Matrices, Up: Vectors and Matrices + +8.5 References and Further Reading +================================== + +The block, vector and matrix objects in GSL follow the `valarray' model +of C++. A description of this model can be found in the following +reference, + + B. Stroustrup, `The C++ Programming Language' (3rd Ed), Section + 22.4 Vector Arithmetic. Addison-Wesley 1997, ISBN 0-201-88954-4. + + +File: gsl-ref.info, Node: Permutations, Next: Combinations, Prev: Vectors and Matrices, Up: Top + +9 Permutations +************** + +This chapter describes functions for creating and manipulating +permutations. A permutation p is represented by an array of n integers +in the range 0 to n-1, where each value p_i occurs once and only once. +The application of a permutation p to a vector v yields a new vector v' +where v'_i = v_{p_i}. For example, the array (0,1,3,2) represents a +permutation which exchanges the last two elements of a four element +vector. The corresponding identity permutation is (0,1,2,3). + + Note that the permutations produced by the linear algebra routines +correspond to the exchange of matrix columns, and so should be +considered as applying to row-vectors in the form v' = v P rather than +column-vectors, when permuting the elements of a vector. + + The functions described in this chapter are defined in the header +file `gsl_permutation.h'. + +* Menu: + +* The Permutation struct:: +* Permutation allocation:: +* Accessing permutation elements:: +* Permutation properties:: +* Permutation functions:: +* Applying Permutations:: +* Reading and writing permutations:: +* Permutations in cyclic form:: +* Permutation Examples:: +* Permutation References and Further Reading:: + + +File: gsl-ref.info, Node: The Permutation struct, Next: Permutation allocation, Up: Permutations + +9.1 The Permutation struct +========================== + +A permutation is defined by a structure containing two components, the +size of the permutation and a pointer to the permutation array. The +elements of the permutation array are all of type `size_t'. The +`gsl_permutation' structure looks like this, + + typedef struct + { + size_t size; + size_t * data; + } gsl_permutation; + + + +File: gsl-ref.info, Node: Permutation allocation, Next: Accessing permutation elements, Prev: The Permutation struct, Up: Permutations + +9.2 Permutation allocation +========================== + + -- Function: gsl_permutation * gsl_permutation_alloc (size_t N) + This function allocates memory for a new permutation of size N. + The permutation is not initialized and its elements are undefined. + Use the function `gsl_permutation_calloc' if you want to create a + permutation which is initialized to the identity. A null pointer is + returned if insufficient memory is available to create the + permutation. + + -- Function: gsl_permutation * gsl_permutation_calloc (size_t N) + This function allocates memory for a new permutation of size N and + initializes it to the identity. A null pointer is returned if + insufficient memory is available to create the permutation. + + -- Function: void gsl_permutation_init (gsl_permutation * P) + This function initializes the permutation P to the identity, i.e. + (0,1,2,...,n-1). + + -- Function: void gsl_permutation_free (gsl_permutation * P) + This function frees all the memory used by the permutation P. + + -- Function: int gsl_permutation_memcpy (gsl_permutation * DEST, const + gsl_permutation * SRC) + This function copies the elements of the permutation SRC into the + permutation DEST. The two permutations must have the same size. + + +File: gsl-ref.info, Node: Accessing permutation elements, Next: Permutation properties, Prev: Permutation allocation, Up: Permutations + +9.3 Accessing permutation elements +================================== + +The following functions can be used to access and manipulate +permutations. + + -- Function: size_t gsl_permutation_get (const gsl_permutation * P, + const size_t I) + This function returns the value of the I-th element of the + permutation P. If I lies outside the allowed range of 0 to N-1 + then the error handler is invoked and 0 is returned. + + -- Function: int gsl_permutation_swap (gsl_permutation * P, const + size_t I, const size_t J) + This function exchanges the I-th and J-th elements of the + permutation P. + + +File: gsl-ref.info, Node: Permutation properties, Next: Permutation functions, Prev: Accessing permutation elements, Up: Permutations + +9.4 Permutation properties +========================== + + -- Function: size_t gsl_permutation_size (const gsl_permutation * P) + This function returns the size of the permutation P. + + -- Function: size_t * gsl_permutation_data (const gsl_permutation * P) + This function returns a pointer to the array of elements in the + permutation P. + + -- Function: int gsl_permutation_valid (gsl_permutation * P) + This function checks that the permutation P is valid. The N + elements should contain each of the numbers 0 to N-1 once and only + once. + + +File: gsl-ref.info, Node: Permutation functions, Next: Applying Permutations, Prev: Permutation properties, Up: Permutations + +9.5 Permutation functions +========================= + + -- Function: void gsl_permutation_reverse (gsl_permutation * P) + This function reverses the elements of the permutation P. + + -- Function: int gsl_permutation_inverse (gsl_permutation * INV, const + gsl_permutation * P) + This function computes the inverse of the permutation P, storing + the result in INV. + + -- Function: int gsl_permutation_next (gsl_permutation * P) + This function advances the permutation P to the next permutation + in lexicographic order and returns `GSL_SUCCESS'. If no further + permutations are available it returns `GSL_FAILURE' and leaves P + unmodified. Starting with the identity permutation and repeatedly + applying this function will iterate through all possible + permutations of a given order. + + -- Function: int gsl_permutation_prev (gsl_permutation * P) + This function steps backwards from the permutation P to the + previous permutation in lexicographic order, returning + `GSL_SUCCESS'. If no previous permutation is available it returns + `GSL_FAILURE' and leaves P unmodified. + + +File: gsl-ref.info, Node: Applying Permutations, Next: Reading and writing permutations, Prev: Permutation functions, Up: Permutations + +9.6 Applying Permutations +========================= + + -- Function: int gsl_permute (const size_t * P, double * DATA, size_t + STRIDE, size_t N) + This function applies the permutation P to the array DATA of size + N with stride STRIDE. + + -- Function: int gsl_permute_inverse (const size_t * P, double * DATA, + size_t STRIDE, size_t N) + This function applies the inverse of the permutation P to the + array DATA of size N with stride STRIDE. + + -- Function: int gsl_permute_vector (const gsl_permutation * P, + gsl_vector * V) + This function applies the permutation P to the elements of the + vector V, considered as a row-vector acted on by a permutation + matrix from the right, v' = v P. The j-th column of the + permutation matrix P is given by the p_j-th column of the identity + matrix. The permutation P and the vector V must have the same + length. + + -- Function: int gsl_permute_vector_inverse (const gsl_permutation * + P, gsl_vector * V) + This function applies the inverse of the permutation P to the + elements of the vector V, considered as a row-vector acted on by + an inverse permutation matrix from the right, v' = v P^T. Note + that for permutation matrices the inverse is the same as the + transpose. The j-th column of the permutation matrix P is given by + the p_j-th column of the identity matrix. The permutation P and + the vector V must have the same length. + + -- Function: int gsl_permutation_mul (gsl_permutation * P, const + gsl_permutation * PA, const gsl_permutation * PB) + This function combines the two permutations PA and PB into a + single permutation P, where p = pa . pb. The permutation P is + equivalent to applying pb first and then PA. + + +File: gsl-ref.info, Node: Reading and writing permutations, Next: Permutations in cyclic form, Prev: Applying Permutations, Up: Permutations + +9.7 Reading and writing permutations +==================================== + +The library provides functions for reading and writing permutations to a +file as binary data or formatted text. + + -- Function: int gsl_permutation_fwrite (FILE * STREAM, const + gsl_permutation * P) + This function writes the elements of the permutation P to the + stream STREAM in binary format. The function returns + `GSL_EFAILED' if there was a problem writing to the file. Since + the data is written in the native binary format it may not be + portable between different architectures. + + -- Function: int gsl_permutation_fread (FILE * STREAM, gsl_permutation + * P) + This function reads into the permutation P from the open stream + STREAM in binary format. The permutation P must be preallocated + with the correct length since the function uses the size of P to + determine how many bytes to read. The function returns + `GSL_EFAILED' if there was a problem reading from the file. The + data is assumed to have been written in the native binary format + on the same architecture. + + -- Function: int gsl_permutation_fprintf (FILE * STREAM, const + gsl_permutation * P, const char * FORMAT) + This function writes the elements of the permutation P + line-by-line to the stream STREAM using the format specifier + FORMAT, which should be suitable for a type of SIZE_T. On a GNU + system the type modifier `Z' represents `size_t', so `"%Zu\n"' is + a suitable format. The function returns `GSL_EFAILED' if there + was a problem writing to the file. + + -- Function: int gsl_permutation_fscanf (FILE * STREAM, + gsl_permutation * P) + This function reads formatted data from the stream STREAM into the + permutation P. The permutation P must be preallocated with the + correct length since the function uses the size of P to determine + how many numbers to read. The function returns `GSL_EFAILED' if + there was a problem reading from the file. + + +File: gsl-ref.info, Node: Permutations in cyclic form, Next: Permutation Examples, Prev: Reading and writing permutations, Up: Permutations + +9.8 Permutations in cyclic form +=============================== + +A permutation can be represented in both "linear" and "cyclic" +notations. The functions described in this section convert between the +two forms. The linear notation is an index mapping, and has already +been described above. The cyclic notation expresses a permutation as a +series of circular rearrangements of groups of elements, or "cycles". + + For example, under the cycle (1 2 3), 1 is replaced by 2, 2 is +replaced by 3 and 3 is replaced by 1 in a circular fashion. Cycles of +different sets of elements can be combined independently, for example +(1 2 3) (4 5) combines the cycle (1 2 3) with the cycle (4 5), which is +an exchange of elements 4 and 5. A cycle of length one represents an +element which is unchanged by the permutation and is referred to as a +"singleton". + + It can be shown that every permutation can be decomposed into +combinations of cycles. The decomposition is not unique, but can always +be rearranged into a standard "canonical form" by a reordering of +elements. The library uses the canonical form defined in Knuth's `Art +of Computer Programming' (Vol 1, 3rd Ed, 1997) Section 1.3.3, p.178. + + The procedure for obtaining the canonical form given by Knuth is, + + 1. Write all singleton cycles explicitly + + 2. Within each cycle, put the smallest number first + + 3. Order the cycles in decreasing order of the first number in the + cycle. + +For example, the linear representation (2 4 3 0 1) is represented as (1 +4) (0 2 3) in canonical form. The permutation corresponds to an +exchange of elements 1 and 4, and rotation of elements 0, 2 and 3. + + The important property of the canonical form is that it can be +reconstructed from the contents of each cycle without the brackets. In +addition, by removing the brackets it can be considered as a linear +representation of a different permutation. In the example given above +the permutation (2 4 3 0 1) would become (1 4 0 2 3). This mapping has +many applications in the theory of permutations. + + -- Function: int gsl_permutation_linear_to_canonical (gsl_permutation + * Q, const gsl_permutation * P) + This function computes the canonical form of the permutation P and + stores it in the output argument Q. + + -- Function: int gsl_permutation_canonical_to_linear (gsl_permutation + * P, const gsl_permutation * Q) + This function converts a permutation Q in canonical form back into + linear form storing it in the output argument P. + + -- Function: size_t gsl_permutation_inversions (const gsl_permutation + * P) + This function counts the number of inversions in the permutation + P. An inversion is any pair of elements that are not in order. + For example, the permutation 2031 has three inversions, + corresponding to the pairs (2,0) (2,1) and (3,1). The identity + permutation has no inversions. + + -- Function: size_t gsl_permutation_linear_cycles (const + gsl_permutation * P) + This function counts the number of cycles in the permutation P, + given in linear form. + + -- Function: size_t gsl_permutation_canonical_cycles (const + gsl_permutation * Q) + This function counts the number of cycles in the permutation Q, + given in canonical form. + + +File: gsl-ref.info, Node: Permutation Examples, Next: Permutation References and Further Reading, Prev: Permutations in cyclic form, Up: Permutations + +9.9 Examples +============ + +The example program below creates a random permutation (by shuffling the +elements of the identity) and finds its inverse. + + #include <stdio.h> + #include <gsl/gsl_rng.h> + #include <gsl/gsl_randist.h> + #include <gsl/gsl_permutation.h> + + int + main (void) + { + const size_t N = 10; + const gsl_rng_type * T; + gsl_rng * r; + + gsl_permutation * p = gsl_permutation_alloc (N); + gsl_permutation * q = gsl_permutation_alloc (N); + + gsl_rng_env_setup(); + T = gsl_rng_default; + r = gsl_rng_alloc (T); + + printf ("initial permutation:"); + gsl_permutation_init (p); + gsl_permutation_fprintf (stdout, p, " %u"); + printf ("\n"); + + printf (" random permutation:"); + gsl_ran_shuffle (r, p->data, N, sizeof(size_t)); + gsl_permutation_fprintf (stdout, p, " %u"); + printf ("\n"); + + printf ("inverse permutation:"); + gsl_permutation_inverse (q, p); + gsl_permutation_fprintf (stdout, q, " %u"); + printf ("\n"); + + gsl_permutation_free (p); + gsl_permutation_free (q); + gsl_rng_free (r); + + return 0; + } + +Here is the output from the program, + + $ ./a.out + initial permutation: 0 1 2 3 4 5 6 7 8 9 + random permutation: 1 3 5 2 7 6 0 4 9 8 + inverse permutation: 6 0 3 1 7 2 5 4 9 8 + +The random permutation `p[i]' and its inverse `q[i]' are related +through the identity `p[q[i]] = i', which can be verified from the +output. + + The next example program steps forwards through all possible third +order permutations, starting from the identity, + + #include <stdio.h> + #include <gsl/gsl_permutation.h> + + int + main (void) + { + gsl_permutation * p = gsl_permutation_alloc (3); + + gsl_permutation_init (p); + + do + { + gsl_permutation_fprintf (stdout, p, " %u"); + printf ("\n"); + } + while (gsl_permutation_next(p) == GSL_SUCCESS); + + gsl_permutation_free (p); + + return 0; + } + +Here is the output from the program, + + $ ./a.out + 0 1 2 + 0 2 1 + 1 0 2 + 1 2 0 + 2 0 1 + 2 1 0 + +The permutations are generated in lexicographic order. To reverse the +sequence, begin with the final permutation (which is the reverse of the +identity) and replace `gsl_permutation_next' with +`gsl_permutation_prev'. + + +File: gsl-ref.info, Node: Permutation References and Further Reading, Prev: Permutation Examples, Up: Permutations + +9.10 References and Further Reading +=================================== + +The subject of permutations is covered extensively in Knuth's `Sorting +and Searching', + + Donald E. Knuth, `The Art of Computer Programming: Sorting and + Searching' (Vol 3, 3rd Ed, 1997), Addison-Wesley, ISBN 0201896850. + +For the definition of the "canonical form" see, + + Donald E. Knuth, `The Art of Computer Programming: Fundamental + Algorithms' (Vol 1, 3rd Ed, 1997), Addison-Wesley, ISBN 0201896850. + Section 1.3.3, `An Unusual Correspondence', p.178-179. + + +File: gsl-ref.info, Node: Combinations, Next: Sorting, Prev: Permutations, Up: Top + +10 Combinations +*************** + +This chapter describes functions for creating and manipulating +combinations. A combination c is represented by an array of k integers +in the range 0 to n-1, where each value c_i occurs at most once. The +combination c corresponds to indices of k elements chosen from an n +element vector. Combinations are useful for iterating over all +k-element subsets of a set. + + The functions described in this chapter are defined in the header +file `gsl_combination.h'. + +* Menu: + +* The Combination struct:: +* Combination allocation:: +* Accessing combination elements:: +* Combination properties:: +* Combination functions:: +* Reading and writing combinations:: +* Combination Examples:: +* Combination References and Further Reading:: + + +File: gsl-ref.info, Node: The Combination struct, Next: Combination allocation, Up: Combinations + +10.1 The Combination struct +=========================== + +A combination is defined by a structure containing three components, the +values of n and k, and a pointer to the combination array. The +elements of the combination array are all of type `size_t', and are +stored in increasing order. The `gsl_combination' structure looks like +this, + + typedef struct + { + size_t n; + size_t k; + size_t *data; + } gsl_combination; + + + +File: gsl-ref.info, Node: Combination allocation, Next: Accessing combination elements, Prev: The Combination struct, Up: Combinations + +10.2 Combination allocation +=========================== + + -- Function: gsl_combination * gsl_combination_alloc (size_t N, size_t + K) + This function allocates memory for a new combination with + parameters N, K. The combination is not initialized and its + elements are undefined. Use the function `gsl_combination_calloc' + if you want to create a combination which is initialized to the + lexicographically first combination. A null pointer is returned if + insufficient memory is available to create the combination. + + -- Function: gsl_combination * gsl_combination_calloc (size_t N, + size_t K) + This function allocates memory for a new combination with + parameters N, K and initializes it to the lexicographically first + combination. A null pointer is returned if insufficient memory is + available to create the combination. + + -- Function: void gsl_combination_init_first (gsl_combination * C) + This function initializes the combination C to the + lexicographically first combination, i.e. (0,1,2,...,k-1). + + -- Function: void gsl_combination_init_last (gsl_combination * C) + This function initializes the combination C to the + lexicographically last combination, i.e. (n-k,n-k+1,...,n-1). + + -- Function: void gsl_combination_free (gsl_combination * C) + This function frees all the memory used by the combination C. + + -- Function: int gsl_combination_memcpy (gsl_combination * DEST, const + gsl_combination * SRC) + This function copies the elements of the combination SRC into the + combination DEST. The two combinations must have the same size. + + +File: gsl-ref.info, Node: Accessing combination elements, Next: Combination properties, Prev: Combination allocation, Up: Combinations + +10.3 Accessing combination elements +=================================== + +The following function can be used to access the elements of a +combination. + + -- Function: size_t gsl_combination_get (const gsl_combination * C, + const size_t I) + This function returns the value of the I-th element of the + combination C. If I lies outside the allowed range of 0 to K-1 + then the error handler is invoked and 0 is returned. + + +File: gsl-ref.info, Node: Combination properties, Next: Combination functions, Prev: Accessing combination elements, Up: Combinations + +10.4 Combination properties +=========================== + + -- Function: size_t gsl_combination_n (const gsl_combination * C) + This function returns the range (n) of the combination C. + + -- Function: size_t gsl_combination_k (const gsl_combination * C) + This function returns the number of elements (k) in the + combination C. + + -- Function: size_t * gsl_combination_data (const gsl_combination * C) + This function returns a pointer to the array of elements in the + combination C. + + -- Function: int gsl_combination_valid (gsl_combination * C) + This function checks that the combination C is valid. The K + elements should lie in the range 0 to N-1, with each value + occurring once at most and in increasing order. + + +File: gsl-ref.info, Node: Combination functions, Next: Reading and writing combinations, Prev: Combination properties, Up: Combinations + +10.5 Combination functions +========================== + + -- Function: int gsl_combination_next (gsl_combination * C) + This function advances the combination C to the next combination + in lexicographic order and returns `GSL_SUCCESS'. If no further + combinations are available it returns `GSL_FAILURE' and leaves C + unmodified. Starting with the first combination and repeatedly + applying this function will iterate through all possible + combinations of a given order. + + -- Function: int gsl_combination_prev (gsl_combination * C) + This function steps backwards from the combination C to the + previous combination in lexicographic order, returning + `GSL_SUCCESS'. If no previous combination is available it returns + `GSL_FAILURE' and leaves C unmodified. + + +File: gsl-ref.info, Node: Reading and writing combinations, Next: Combination Examples, Prev: Combination functions, Up: Combinations + +10.6 Reading and writing combinations +===================================== + +The library provides functions for reading and writing combinations to a +file as binary data or formatted text. + + -- Function: int gsl_combination_fwrite (FILE * STREAM, const + gsl_combination * C) + This function writes the elements of the combination C to the + stream STREAM in binary format. The function returns + `GSL_EFAILED' if there was a problem writing to the file. Since + the data is written in the native binary format it may not be + portable between different architectures. + + -- Function: int gsl_combination_fread (FILE * STREAM, gsl_combination + * C) + This function reads elements from the open stream STREAM into the + combination C in binary format. The combination C must be + preallocated with correct values of n and k since the function + uses the size of C to determine how many bytes to read. The + function returns `GSL_EFAILED' if there was a problem reading from + the file. The data is assumed to have been written in the native + binary format on the same architecture. + + -- Function: int gsl_combination_fprintf (FILE * STREAM, const + gsl_combination * C, const char * FORMAT) + This function writes the elements of the combination C + line-by-line to the stream STREAM using the format specifier + FORMAT, which should be suitable for a type of SIZE_T. On a GNU + system the type modifier `Z' represents `size_t', so `"%Zu\n"' is + a suitable format. The function returns `GSL_EFAILED' if there + was a problem writing to the file. + + -- Function: int gsl_combination_fscanf (FILE * STREAM, + gsl_combination * C) + This function reads formatted data from the stream STREAM into the + combination C. The combination C must be preallocated with + correct values of n and k since the function uses the size of C to + determine how many numbers to read. The function returns + `GSL_EFAILED' if there was a problem reading from the file. + + +File: gsl-ref.info, Node: Combination Examples, Next: Combination References and Further Reading, Prev: Reading and writing combinations, Up: Combinations + +10.7 Examples +============= + +The example program below prints all subsets of the set {0,1,2,3} +ordered by size. Subsets of the same size are ordered +lexicographically. + + #include <stdio.h> + #include <gsl/gsl_combination.h> + + int + main (void) + { + gsl_combination * c; + size_t i; + + printf ("All subsets of {0,1,2,3} by size:\n") ; + for (i = 0; i <= 4; i++) + { + c = gsl_combination_calloc (4, i); + do + { + printf ("{"); + gsl_combination_fprintf (stdout, c, " %u"); + printf (" }\n"); + } + while (gsl_combination_next (c) == GSL_SUCCESS); + gsl_combination_free (c); + } + + return 0; + } + +Here is the output from the program, + + $ ./a.out + All subsets of {0,1,2,3} by size: + { } + { 0 } + { 1 } + { 2 } + { 3 } + { 0 1 } + { 0 2 } + { 0 3 } + { 1 2 } + { 1 3 } + { 2 3 } + { 0 1 2 } + { 0 1 3 } + { 0 2 3 } + { 1 2 3 } + { 0 1 2 3 } + +All 16 subsets are generated, and the subsets of each size are sorted +lexicographically. + + +File: gsl-ref.info, Node: Combination References and Further Reading, Prev: Combination Examples, Up: Combinations + +10.8 References and Further Reading +=================================== + +Further information on combinations can be found in, + + Donald L. Kreher, Douglas R. Stinson, `Combinatorial Algorithms: + Generation, Enumeration and Search', 1998, CRC Press LLC, ISBN + 084933988X + + + +File: gsl-ref.info, Node: Sorting, Next: BLAS Support, Prev: Combinations, Up: Top + +11 Sorting +********** + +This chapter describes functions for sorting data, both directly and +indirectly (using an index). All the functions use the "heapsort" +algorithm. Heapsort is an O(N \log N) algorithm which operates +in-place and does not require any additional storage. It also provides +consistent performance, the running time for its worst-case (ordered +data) being not significantly longer than the average and best cases. +Note that the heapsort algorithm does not preserve the relative ordering +of equal elements--it is an "unstable" sort. However the resulting +order of equal elements will be consistent across different platforms +when using these functions. + +* Menu: + +* Sorting objects:: +* Sorting vectors:: +* Selecting the k smallest or largest elements:: +* Computing the rank:: +* Sorting Examples:: +* Sorting References and Further Reading:: + + +File: gsl-ref.info, Node: Sorting objects, Next: Sorting vectors, Up: Sorting + +11.1 Sorting objects +==================== + +The following function provides a simple alternative to the standard +library function `qsort'. It is intended for systems lacking `qsort', +not as a replacement for it. The function `qsort' should be used +whenever possible, as it will be faster and can provide stable ordering +of equal elements. Documentation for `qsort' is available in the `GNU +C Library Reference Manual'. + + The functions described in this section are defined in the header +file `gsl_heapsort.h'. + + -- Function: void gsl_heapsort (void * ARRAY, size_t COUNT, size_t + SIZE, gsl_comparison_fn_t COMPARE) + This function sorts the COUNT elements of the array ARRAY, each of + size SIZE, into ascending order using the comparison function + COMPARE. The type of the comparison function is defined by, + + int (*gsl_comparison_fn_t) (const void * a, + const void * b) + + A comparison function should return a negative integer if the first + argument is less than the second argument, `0' if the two arguments + are equal and a positive integer if the first argument is greater + than the second argument. + + For example, the following function can be used to sort doubles + into ascending numerical order. + + int + compare_doubles (const double * a, + const double * b) + { + if (*a > *b) + return 1; + else if (*a < *b) + return -1; + else + return 0; + } + + The appropriate function call to perform the sort is, + + gsl_heapsort (array, count, sizeof(double), + compare_doubles); + + Note that unlike `qsort' the heapsort algorithm cannot be made into + a stable sort by pointer arithmetic. The trick of comparing + pointers for equal elements in the comparison function does not + work for the heapsort algorithm. The heapsort algorithm performs + an internal rearrangement of the data which destroys its initial + ordering. + + -- Function: int gsl_heapsort_index (size_t * P, const void * ARRAY, + size_t COUNT, size_t SIZE, gsl_comparison_fn_t COMPARE) + This function indirectly sorts the COUNT elements of the array + ARRAY, each of size SIZE, into ascending order using the + comparison function COMPARE. The resulting permutation is stored + in P, an array of length N. The elements of P give the index of + the array element which would have been stored in that position if + the array had been sorted in place. The first element of P gives + the index of the least element in ARRAY, and the last element of P + gives the index of the greatest element in ARRAY. The array + itself is not changed. + + +File: gsl-ref.info, Node: Sorting vectors, Next: Selecting the k smallest or largest elements, Prev: Sorting objects, Up: Sorting + +11.2 Sorting vectors +==================== + +The following functions will sort the elements of an array or vector, +either directly or indirectly. They are defined for all real and +integer types using the normal suffix rules. For example, the `float' +versions of the array functions are `gsl_sort_float' and +`gsl_sort_float_index'. The corresponding vector functions are +`gsl_sort_vector_float' and `gsl_sort_vector_float_index'. The +prototypes are available in the header files `gsl_sort_float.h' +`gsl_sort_vector_float.h'. The complete set of prototypes can be +included using the header files `gsl_sort.h' and `gsl_sort_vector.h'. + + There are no functions for sorting complex arrays or vectors, since +the ordering of complex numbers is not uniquely defined. To sort a +complex vector by magnitude compute a real vector containing the +magnitudes of the complex elements, and sort this vector indirectly. +The resulting index gives the appropriate ordering of the original +complex vector. + + -- Function: void gsl_sort (double * DATA, size_t STRIDE, size_t N) + This function sorts the N elements of the array DATA with stride + STRIDE into ascending numerical order. + + -- Function: void gsl_sort_vector (gsl_vector * V) + This function sorts the elements of the vector V into ascending + numerical order. + + -- Function: void gsl_sort_index (size_t * P, const double * DATA, + size_t STRIDE, size_t N) + This function indirectly sorts the N elements of the array DATA + with stride STRIDE into ascending order, storing the resulting + permutation in P. The array P must be allocated with a sufficient + length to store the N elements of the permutation. The elements + of P give the index of the array element which would have been + stored in that position if the array had been sorted in place. + The array DATA is not changed. + + -- Function: int gsl_sort_vector_index (gsl_permutation * P, const + gsl_vector * V) + This function indirectly sorts the elements of the vector V into + ascending order, storing the resulting permutation in P. The + elements of P give the index of the vector element which would + have been stored in that position if the vector had been sorted in + place. The first element of P gives the index of the least element + in V, and the last element of P gives the index of the greatest + element in V. The vector V is not changed. + |