﻿ s19ab Method
s19ab returns a value for the Kelvin function $\mathrm{bei} x$.

# Syntax

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

s19ab returns a value for the Kelvin function $\mathrm{bei} x$.

# Description

s19ab evaluates an approximation to the Kelvin function $\mathrm{bei} x$.
Note:  $\mathrm{bei}\left(-x\right)=\mathrm{bei} x$, so the approximation need only consider $x\ge 0.0$.
The method is based on several Chebyshev expansions:
For $0\le x\le 5$,
 $bei x=x24∑r=0′arTrt, with ​t=2x54-1;$
For $x>5$,
 $bei x=ex/22πx1+1xatsin α-1xbtcos α$
 $+ex/22πx1+1xctcos β-1xdtsin β$
where $\alpha =\frac{x}{\sqrt{2}}-\frac{\pi }{8}$, $\beta =\frac{x}{\sqrt{2}}+\frac{\pi }{8}$,
and $a\left(t\right)$, $b\left(t\right)$, $c\left(t\right)$, and $d\left(t\right)$ are expansions in the variable $t=\frac{10}{x}-1$.
When $x$ is sufficiently close to zero, the result is computed as $\mathrm{bei} x=\frac{{x}^{2}}{4}$. If this result would underflow, the result returned is $\mathrm{bei} x=0.0$.
For large $x$, there is a danger of the result being totally inaccurate, as the error amplification factor grows in an essentially exponential manner; therefore the method must fail.

# References

Abramowitz M and Stegun I A (1972) Handbook of Mathematical Functions (3rd Edition) Dover Publications

# Error Indicators and Warnings

Errors or warnings detected by the method:
${\mathbf{ifail}}=1$
On entry, $\mathrm{abs}\left({\mathbf{x}}\right)$ is too large for an accurate result to be returned. On failure, the method returns zero. See also the Users' Note for your implementation.
${\mathbf{ifail}}=-9000$
An error occured, see message report.

# Accuracy

Since the function is oscillatory, the absolute error rather than the relative error is important. Let $E$ be the absolute error in the function, and $\delta$ be the relative error in the argument. If $\delta$ is somewhat larger than the machine precision, then we have:
 $E≃x2-ber1 x+bei1 xδ$
(provided $E$ is within machine bounds).
For small $x$ the error amplification is insignificant and thus the absolute error is effectively bounded by the machine precision.
For medium and large $x$, the error behaviour is oscillatory and its amplitude grows like $\sqrt{\frac{x}{2\pi }}{e}^{x/\sqrt{2}}$. Therefore it is impossible to calculate the functions with any accuracy when $\sqrt{x}{e}^{x/\sqrt{2}}>\frac{\sqrt{2\pi }}{\delta }$. Note that this value of $x$ is much smaller than the minimum value of $x$ for which the function overflows.

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

Example program data: s19abe.d

Example program results: s19abe.r