# NAG FL Interfaces17aff (bessel_​j1_​real)

## ▸▿ Contents

Settings help

FL Name Style:

FL Specification Language:

## 1Purpose

s17aff returns the value of the Bessel function ${J}_{1}\left(x\right)$, via the function name.

## 2Specification

Fortran Interface
 Function s17aff ( x,
 Real (Kind=nag_wp) :: s17aff Integer, Intent (Inout) :: ifail Real (Kind=nag_wp), Intent (In) :: x
#include <nag.h>
 double s17aff_ (const double *x, Integer *ifail)
The routine may be called by the names s17aff or nagf_specfun_bessel_j1_real.

## 3Description

s17aff evaluates an approximation to the Bessel function of the first kind ${J}_{1}\left(x\right)$.
Note:  ${J}_{1}\left(-x\right)=-{J}_{1}\left(x\right)$, so the approximation need only consider $x\ge 0$.
The routine is based on three Chebyshev expansions:
For $0,
 $J1(x)=x8∑′r=0arTr(t), with ​t=2 (x8) 2-1.$
For $x>8$,
 $J1(x)=2πx {P1(x)cos(x-3π4)-Q1(x)sin(x-3π4)}$
where ${P}_{1}\left(x\right)=\underset{r=0}{{\sum }^{\prime }}\phantom{\rule{0.25em}{0ex}}{b}_{r}{T}_{r}\left(t\right)$,
and ${Q}_{1}\left(x\right)=\frac{8}{x}\underset{r=0}{{\sum }^{\prime }}\phantom{\rule{0.25em}{0ex}}{c}_{r}{T}_{r}\left(t\right)$,
with $t=2{\left(\frac{8}{x}\right)}^{2}-1$.
For $x$ near zero, ${J}_{1}\left(x\right)\simeq \frac{x}{2}$. This approximation is used when $x$ is sufficiently small for the result to be correct to machine precision.
For very large $x$, it becomes impossible to provide results with any reasonable accuracy (see Section 7), hence the routine fails. Such arguments contain insufficient information to determine the phase of oscillation of ${J}_{1}\left(x\right)$; only the amplitude, $\sqrt{\frac{2}{\pi |x|}}$, can be determined and this is returned on soft failure. The range for which this occurs is roughly related to machine precision; the routine will fail if (see the Users' Note for your implementation for details).

## 4References

NIST Digital Library of Mathematical Functions
Clenshaw C W (1962) Chebyshev Series for Mathematical Functions Mathematical tables HMSO

## 5Arguments

1: $\mathbf{x}$Real (Kind=nag_wp) Input
On entry: the argument $x$ of the function.
2: $\mathbf{ifail}$Integer Input/Output
On entry: ifail must be set to $0$, $-1$ or $1$ to set behaviour on detection of an error; these values have no effect when no error is detected.
A value of $0$ causes the printing of an error message and program execution will be halted; otherwise program execution continues. A value of $-1$ means that an error message is printed while a value of $1$ means that it is not.
If halting is not appropriate, the value $-1$ or $1$ is recommended. If message printing is undesirable, then the value $1$ is recommended. Otherwise, the value $0$ is recommended. When the value $-\mathbf{1}$ or $\mathbf{1}$ is used it is essential to test the value of ifail on exit.
On exit: ${\mathbf{ifail}}={\mathbf{0}}$ unless the routine detects an error or a warning has been flagged (see Section 6).

## 6Error Indicators and Warnings

If on entry ${\mathbf{ifail}}=0$ or $-1$, explanatory error messages are output on the current error message unit (as defined by x04aaf).
Errors or warnings detected by the routine:
${\mathbf{ifail}}=1$
On entry, ${\mathbf{x}}=⟨\mathit{\text{value}}⟩$.
Constraint: $|{\mathbf{x}}|\le ⟨\mathit{\text{value}}⟩$.
$|{\mathbf{x}}|$ is too large, the function returns the amplitude of the ${J}_{1}$ oscillation, $\sqrt{2/\left(\pi |x|\right)}$.
${\mathbf{ifail}}=-99$
See Section 7 in the Introduction to the NAG Library FL Interface for further information.
${\mathbf{ifail}}=-399$
Your licence key may have expired or may not have been installed correctly.
See Section 8 in the Introduction to the NAG Library FL Interface for further information.
${\mathbf{ifail}}=-999$
Dynamic memory allocation failed.
See Section 9 in the Introduction to the NAG Library FL Interface for further information.

## 7Accuracy

Let $\delta$ be the relative error in the argument and $E$ be the absolute error in the result. (Since ${J}_{1}\left(x\right)$ oscillates about zero, absolute error and not relative error is significant.)
If $\delta$ is somewhat larger than machine precision (e.g., if $\delta$ is due to data errors etc.), then $E$ and $\delta$ are approximately related by:
 $E≃|xJ0(x)-J1(x)|δ$
(provided $E$ is also within machine bounds). Figure 1 displays the behaviour of the amplification factor $|x{J}_{0}\left(x\right)-{J}_{1}\left(x\right)|$.
However, if $\delta$ is of the same order as machine precision, then rounding errors could make $E$ slightly larger than the above relation predicts.
For very large $x$, the above relation ceases to apply. In this region, ${J}_{1}\left(x\right)\simeq \sqrt{\frac{2}{\pi |x|}}\mathrm{cos}\left(x-\frac{3\pi }{4}\right)$. The amplitude $\sqrt{\frac{2}{\pi |x|}}$ can be calculated with reasonable accuracy for all $x$, but $\mathrm{cos}\left(x-\frac{3\pi }{4}\right)$ cannot. If $x-\frac{3\pi }{4}$ is written as $2N\pi +\theta$ where $N$ is an integer and $0\le \theta <2\pi$, then $\mathrm{cos}\left(x-\frac{3\pi }{4}\right)$ is determined by $\theta$ only. If $x\gtrsim {\delta }^{-1}$, $\theta$ cannot be determined with any accuracy at all. Thus if $x$ is greater than, or of the order of, the reciprocal of machine precision, it is impossible to calculate the phase of ${J}_{1}\left(x\right)$ and the routine must fail.

## 8Parallelism and Performance

s17aff is not threaded in any implementation.

None.

## 10Example

This example reads values of the argument $x$ from a file, evaluates the function at each value of $x$ and prints the results.

### 10.1Program Text

Program Text (s17affe.f90)

### 10.2Program Data

Program Data (s17affe.d)

### 10.3Program Results

Program Results (s17affe.r)