﻿ s17ae Method
s17ae returns the value of the Bessel function ${J}_{0}\left(x\right)$.

# Syntax

C#
```public static double s17ae(
double x,
out int ifail
)```
Visual Basic
```Public Shared Function s17ae ( _
x As Double, _
<OutAttribute> ByRef ifail As Integer _
) As Double```
Visual C++
```public:
static double s17ae(
double x,
[OutAttribute] int% ifail
)```
F#
```static member s17ae :
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

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

# Description

s17ae evaluates an approximation to the Bessel function of the first kind ${J}_{0}\left(x\right)$.
Note:  ${J}_{0}\left(-x\right)={J}_{0}\left(x\right)$, so the approximation need only consider $x\ge 0$.
The method is based on three Chebyshev expansions:
For $0,
 $J0x=∑′r=0arTrt, with ​t=2x82-1.$
For $x>8$,
 $J0x=2πxP0xcosx-π4-Q0xsinx-π4,$
where ${P}_{0}\left(x\right)=\underset{r=0}{{\sum }^{\prime }}\phantom{\rule{0.25em}{0ex}}{b}_{r}{T}_{r}\left(t\right)$,
and ${Q}_{0}\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}_{0}\left(x\right)\simeq 1$. 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}_{0}\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  (see the Users' Note for your implementation for details).

# References

Abramowitz M and Stegun I A (1972) Handbook of Mathematical Functions (3rd Edition) Dover Publications
Clenshaw 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}_{0}$ oscillation, $\sqrt{\frac{2}{\pi \left|x\right|}}$.
${\mathbf{ifail}}=-9000$
An error occured, see message report.

# Accuracy

Let $\delta$ be the relative error in the argument and $E$ be the absolute error in the result. (Since ${J}_{0}\left(x\right)$ oscillates about zero, absolute error and not relative error is significant.)
If $\delta$ is somewhat larger than the machine precision (e.g., if $\delta$ is due to data errors etc.), then $E$ and $\delta$ are approximately related by:
 $E≃xJ1xδ$
(provided $E$ is also within machine bounds). Figure 1 displays the behaviour of the amplification factor $\left|x{J}_{1}\left(x\right)\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}_{0}\left(x\right)\simeq \sqrt{\frac{2}{\pi \left|x\right|}}\mathrm{cos}\left(x-\frac{\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{\pi }{4}\right)$ cannot. If $x-\frac{\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{\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 inverse of the machine precision, it is impossible to calculate the phase of ${J}_{0}\left(x\right)$ and the method must fail.
Figure 1

None.

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#): s17aee.cs

Example program data: s17aee.d

Example program results: s17aee.r