NAG Library Function Document
nag_specfun_2f1_real_scaled (s22bfc)
1 Purpose
nag_specfun_2f1_real_scaled (s22bfc) returns a value for the Gauss hypergeometric function for real parameters and , and real argument . The result is returned in the scaled form .
2 Specification
#include <nag.h> |
#include <nags.h> |
void |
nag_specfun_2f1_real_scaled (double ani,
double adr,
double bni,
double bdr,
double cni,
double cdr,
double x,
double *frf,
Integer *scf,
NagError *fail) |
|
3 Description
nag_specfun_2f1_real_scaled (s22bfc) returns a value for the Gauss hypergeometric function for real parameters , and , and for real argument .
The Gauss hypergeometric function is a solution to the hypergeometric differential equation,
For
, it may be defined by the Gauss series,
where
is the rising factorial of
.
is undefined for
or
a negative integer.
For , the series is absolutely convergent and is finite.
For
, linear transformations of the form,
exist, where
,
.
and
are real valued functions of the parameters and argument, typically involving products of gamma functions. When these are degenerate, finite limiting cases exist. Hence for
,
is defined by analytic continuation, and for
,
is real and finite.
For
, the following apply:
- If , , and hence is finite. Solutions also exist for the degenerate cases where or are negative integers or zero.
- If , is infinite, and the sign of is determinable as approaches from below.
In the complex plane, the principal branch of is taken along the real axis from increasing. is multivalued along this branch, and for real parameters and is typically not real valued. As such, this function will not compute a solution when .
The solution strategy used by this function is primarily dependent upon the value of the argument . Once trivial cases and the case are eliminated, this proceeds as follows.
For
, sets of safe parameters
are determined, such that the values of
required for an appropriate transformation of the type
(3) may be calculated either directly or using recurrence relations from the solutions of
. If
is positive, then only transformations with
will be used, implying only
will be required, with the transformed argument
. If
is negative, in some cases a transformation with
will be used, with the argument
. The function then cycles through these sets until acceptable solutions are generated. If no computation produces an accurate answer, the least inaccurate answer is selected to complete the computation. See
Section 7.
For , an identical approach is first used with the argument . Should this fail, a linear transformation resulting in both transformed arguments satisfying is employed, and the above strategy for is utilized on both components. Further transformations in these sub-computations are however limited to single terms with no argument transformation.
For , a linear transformation mapping the argument to the interval is first employed. The strategy for is then used on each component, including possible further two term transforms. To avoid some degenerate cases, a transform mapping the argument to may also be used.
For improved precision in the final result, this function accepts and split into an integral and a decimal fractional component. Specifically, , where and is integral. The other parameters and are similarly deconstructed.
In addition to the above restrictions on
and
, an artificial bound,
arbnd, is placed on the magnitudes of
and
to minimize the occurrence of overflow in internal calculations, particularly those involving real to integer conversions.
, where
is the largest machine integer (see
nag_max_integer (X02BBC)). It should however not be assumed that this function will produce accurate answers for all values of
and
satisfying this criterion.
This function also tests for non-finite values of the parameters and argument on entry, and assigns non-finite values upon completion if appropriate. See
Section 9 and
Chapter x07.
Please consult the
NIST Digital Library of Mathematical Functions or the companion
(2010) for a detailed discussion of the Gauss hypergeometric function including special cases, transformations, relations and asymptotic approximations.
4 References
NIST Handbook of Mathematical Functions (2010) (eds F W J Olver, D W Lozier, R F Boisvert, C W Clark) Cambridge University Press
Pearson J (2009) Computation of hypergeometric functions MSc Dissertation, Mathematical Institute, University of Oxford
5 Arguments
- 1:
ani – doubleInput
On entry: , the nearest integer to , satisfying .
- 2:
adr – doubleInput
-
On entry: , the signed decimal remainder satisfying and .
Constraint:
.
- 3:
bni – doubleInput
-
On entry: , the nearest integer to , satisfying .
- 4:
bdr – doubleInput
-
On entry: , the signed decimal remainder satisfying and .
Constraint:
.
- 5:
cni – doubleInput
-
On entry: , the nearest integer to , satisfying .
Constraints:
- ;
- ;
- if , .
- 6:
cdr – doubleInput
-
On entry: , the signed decimal remainder satisfying and .
Constraint:
.
- 7:
x – doubleInput
-
On entry: the argument .
Constraint:
.
- 8:
frf – double *Output
-
On exit:
, the scaled real component of the solution satisfying
, i.e.,
. See
Section 9 for the behaviour of
when a finite or non-finite answer is returned.
- 9:
scf – Integer *Output
-
On exit:
, the scaling power of two, satisfying
, i.e.,
. See
Section 9 for the behaviour of
when a non-finite answer is returned.
- 10:
fail – NagError *Input/Output
-
The NAG error argument (see
Section 3.6 in the Essential Introduction).
6 Error Indicators and Warnings
- NE_ALLOC_FAIL
-
Dynamic memory allocation failed.
- NE_BAD_PARAM
-
On entry, argument had an illegal value.
- NE_CANNOT_CALCULATE
-
An internal calculation has resulted in an undefined result.
- NE_COMPLEX
-
On entry, .
In general, is not real valued when .
- NE_INFINITE
-
On entry, , , .
is infinite in the case .
- NE_INTERNAL_ERROR
-
An internal error has occurred in this function. Check the function call and any array sizes. If the call is correct then please contact
NAG for assistance.
- NE_OVERFLOW
-
Overflow occurred in a subcalculation of . The answer may be completely incorrect.
- NE_REAL
-
On entry,
adr does not satisfy
.
On entry,
bdr does not satisfy
.
On entry,
cdr does not satisfy
.
- NE_REAL_2
-
On entry, .
is undefined when is zero or a negative integer.
- NE_REAL_ARG_NON_INTEGRAL
-
ANI is non-integral.
On entry, .
Constraint: .
bni is non-integral.
On entry,
.
Constraint:
.
cni is non-integral.
On entry,
.
Constraint:
.
- NE_REAL_RANGE_CONS
-
On entry,
ani does not satisfy
.
On entry,
bni does not satisfy
.
On entry,
cni does not satisfy
.
On entry,
x does not satisfy
.
- NE_TOTAL_PRECISION_LOSS
-
All approximations have completed, and the final residual estimate indicates no accuracy can be guaranteed.
.
- NW_OVERFLOW_WARN
-
On completion, overflow occurred in the evaluation of .
- NW_SOME_PRECISION_LOSS
-
All approximations have completed, and the final residual estimate indicates some precision may have been lost.
.
- NW_UNDERFLOW_WARN
-
Underflow occurred during the evaluation of . The returned value may be inaccurate.
7 Accuracy
In general, if
NE_NOERROR, the value of
may be assumed accurate, with the possible loss of one or two decimal places. Assuming the result does not overflow, an error estimate
is made internally using equation
(1). If the magnitude of this residual
is sufficiently large, a
different
fail.code
will be returned. Specifically,
where
is the
machine precision as returned by
nag_machine_precision (X02AJC). Note that underflow may also have occurred if
NE_TOTAL_PRECISION_LOSS or
NW_SOME_PRECISION_LOSS.
A further estimate of the residual can be constructed using equation
(1), and the differential identity,
This estimate is however dependent upon the error involved in approximating and .
8 Parallelism and Performance
Not applicable.
nag_specfun_2f1_real_scaled (s22bfc) returns non-finite values when appropriate. See
Chapter x07 for more information on the definitions of non-finite values.
Should a non-finite value be returned, this will be indicated in the value of
fail, as detailed in the following cases.
If
NE_NOERROR or
NE_TOTAL_PRECISION_LOSS,
NW_SOME_PRECISION_LOSS or
NW_UNDERFLOW_WARN, a finite value will have been returned with approximate accuracy as detailed in
Section 7.
The values of and are implementation dependent. In most cases, if , and will be returned, and if is finite, the fractional component will be bound by , with chosen accordingly.
The values returned in
frf (
) and
scf (
) may be used to explicitly evaluate
, and may also be used to evaluate products and ratios of multiple values of
as follows,
If
NE_INFINITE then
is infinite. A signed infinity will have been returned for
frf, and
. The sign of
frf should be correct when taking the limit as
approaches
from below.
If
NW_OVERFLOW_WARN then upon completion,
, where
is given by
nag_max_integer (X02BBC), and hence is too large to be representable even in the scaled form. The scaled real component returned in
frf may still be correct, whilst
will have been returned.
If
NE_OVERFLOW then overflow occurred during a subcalculation of
. The same result as for
NW_OVERFLOW_WARN will have been returned, however there is no guarantee that this is representative of either the magnitude of the scaling power
, or the scaled component
of
.
If
NE_NOERROR,
frf and
scf were inaccessible to nag_specfun_2f1_real_scaled (s22bfc), and as such it is not possible to determine what their values may be following the call to nag_specfun_2f1_real_scaled (s22bfc).
For all other error exits,
will be returned and
frf will be returned as a signalling NaN (see
nag_create_nan (x07bbc)).
If
NE_CANNOT_CALCULATE an internal computation produced an undefined result. This may occur when two terms overflow with opposite signs, and the result is dependent upon their summation for example.
If
NE_REAL_2 then
is too close to a negative integer or zero on entry, and
is undefined. Note, this will also be the case when
is a negative integer, and a (possibly trivial) linear transformation of the form
(3) would result in either:
(i) |
all not being negative integers, |
(ii) |
for any which remain as negative integers, one of the corresponding parameters or is a negative integer of magnitude less than . |
In the first case, the transformation coefficients
are typically either infinite or undefined, preventing a solution being constructed. In the second case, the series
(2) will terminate before the degenerate term, resulting in a polynomial of fixed degree, and hence potentially a finite solution.
If
NE_REAL_RANGE_CONS then no computation will have been performed due to the risk of integer overflow. The actual solution may however be finite.
NE_COMPLEX indicates
, and hence the requested solution is on the boundary of the principal branch of
. Hence it is multivalued, typically with a non-zero imaginary component. It is however strictly finite.
10 Example
This example evaluates the Gauss hypergeometric function at two points in scaled form using nag_specfun_2f1_real_scaled (s22bfc), and subsequently calculates their product and ratio implicitly.
10.1 Program Text
Program Text (s22bfce.c)
10.2 Program Data
None.
10.3 Program Results
Program Results (s22bfce.r)