s17af returns the value of the Bessel function ${J}_{1}\left(x\right)$.

# Syntax

C# |
---|

public static double s17af( double x, out int ifail ) |

Visual Basic |
---|

Public Shared Function s17af ( _ x As Double, _ <OutAttribute> ByRef ifail As Integer _ ) As Double |

Visual C++ |
---|

public: static double s17af( double x, [OutAttribute] int% ifail ) |

F# |
---|

static member s17af : x : float * ifail : int byref -> float |

#### Parameters

- x
- Type: System..::..Double
*On entry*: the argument $x$ of the function.

- ifail
- Type: System..::..Int32%
*On exit*: ${\mathbf{ifail}}={0}$ unless the method detects an error or a warning has been flagged (see [Error Indicators and Warnings]).

#### Return Value

s17af returns the value of the Bessel function ${J}_{1}\left(x\right)$.

# Description

s17af 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 method is based on three Chebyshev expansions:

For $0<x\le 8$,

For $x>8$,

where ${P}_{1}\left(x\right)={\displaystyle \underset{r=0}{{\sum}^{\prime}}}\phantom{\rule{0.25em}{0ex}}{b}_{r}{T}_{r}\left(t\right)$,

$${J}_{1}\left(x\right)=\frac{x}{8}\underset{r=0}{{\sum}^{\prime}}\phantom{\rule{0.25em}{0ex}}{a}_{r}{T}_{r}\left(t\right)\text{, \hspace{1em} with}t=2{\left(\frac{x}{8}\right)}^{2}-1\text{.}$$ |

$${J}_{1}\left(x\right)=\sqrt{\frac{2}{\pi x}}\left\{{P}_{1}\left(x\right)\mathrm{cos}\left(x-\frac{3\pi}{4}\right)-{Q}_{1}\left(x\right)\mathrm{sin}\left(x-\frac{3\pi}{4}\right)\right\}$$ |

and ${Q}_{1}\left(x\right)=\frac{8}{x}{\displaystyle \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 [Accuracy]), hence the method 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 \left|x\right|}}$, can be determined and this is returned on failure. The range for which this occurs is roughly related to machine precision; the method will fail if $\left|x\right|\gtrsim 1/\mathit{machineprecision}$ (see the Users' Note for your implementation for details).

# References

Abramowitz M and Stegun I A (1972)

*Handbook of Mathematical Functions*(3rd Edition) Dover PublicationsClenshaw C W (1962) Chebyshev Series for Mathematical Functions

*Mathematical tables*HMSO# Error Indicators and Warnings

Errors or warnings detected by the method:

- ${\mathbf{ifail}}=1$
- x is too large. On failure the method returns the amplitude of the ${J}_{1}$ oscillation, $\sqrt{\frac{2}{\pi \left|x\right|}}$.

# Accuracy

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:

(provided $E$ is also within machine bounds). Figure 1 displays the behaviour of the amplification factor $\left|x{J}_{0}\left(x\right)-{J}_{1}\left(x\right)\right|$.

$$E\simeq \left|x{J}_{0}\left(x\right)-{J}_{1}\left(x\right)\right|\delta $$ |

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 \left|x\right|}}\mathrm{cos}\left(x-\frac{3\pi}{4}\right)$. The amplitude $\sqrt{\frac{2}{\pi \left|x\right|}}$ 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 method must fail.

# Parallelism and Performance

None.

# Further Comments

None.

# Example

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

Example program (C#): s17afe.cs