Lentz's algorithm

From testwiki
Jump to navigation Jump to search

In mathematics, Lentz's algorithm is an algorithm to evaluate continued fractions, and was originally devised to compute tables of spherical Bessel functions.[1][2]

The version usually employed now is due to Thompson and Barnett.[3]

History

The idea was introduced in 1973 by William J. Lentz[1] and was simplified by him in 1982.[4] Lentz suggested that calculating ratios of spherical Bessel functions of complex arguments can be difficult. He developed a new continued fraction technique for calculating the ratios of spherical Bessel functions of consecutive order. This method was an improvement compared to other methods because it started from the beginning of the continued fraction rather than the tail, had a built-in check for convergence, and was numerically stable. The original algorithm uses algebra to bypass a zero in either the numerator or denominator.[5] Simpler Improvements to overcome unwanted zero terms include an altered recurrence relation[6] suggested by Jaaskelainen and Ruuskanen in 1981 or a simple shift of the denominator by a very small number as suggested by Thompson and Barnett in 1986.[3]

Initial work

This theory was initially motivated by Lentz's need for accurate calculation of ratios of spherical Bessel function necessary for Mie scattering. He created a new continued fraction algorithm that starts from the beginning of the continued fraction and not at the tail-end. This eliminates guessing how many terms of the continued fraction are needed for convergence. In addition, continued fraction representations for both ratios of Bessel functions and spherical Bessel functions of consecutive order themselves can be computed with Lentz's algorithm.[5] The algorithm suggested that it is possible to terminate the evaluation of continued fractions when |fjfj1| is relatively small.[7]

Algorithm

Lentz's algorithm is based on the Wallis-Euler relations. If

f0=b0
f1=b0+a1b1
f2=b0+a1b1+a2b2
f3=b0+a1b1+a2b2+a3b3

etc., or using the big-K notation, if

fn=b0+Knj=1ajbj+

is the nth convergent to f then

fn=AnBn

where An and Bn are given by the Wallis-Euler recurrence relations

A1=1B1=0A0=b0B0=1An=bnAn1+anAn2Bn=bnBn1+anBn2

Lentz's method defines

Cn=AnAn1
Dn=Bn1Bn

so that the nth convergent is fn=CnDnfn1 with f0=A0B0=b0 and uses the recurrence relations

C0=A0A1=b0D0=B1B0=0Cn=bn+anCn1Dn=1bn+anDn1

When the product CnDn approaches unity with increasing n, it is hoped that fn has converged to f.[8]

Lentz's algorithm has the advantage of side-stepping an inconvenience of the Wallis-Euler relations, namely that the numerators An and denominators Bn are prone to grow or diminish very rapidly with increasing n. In direct numerical application of the Wallis-Euler relations, this means that An1, An2, Bn1, Bn2 must be periodically checked and rescaled to avoid floating-point overflow or underflow.[8]

Thompson and Barnett modification

In Lentz's original algorithm, it can happen that Cn=0, resulting in division by zero at the next step. The problem can be remedied simply by setting Cn=ε for some sufficiently small ε. This gives Cn+1=bn+1+an+1ε=an+1ε to within floating-point precision, and the product CnCn+1=an+1 irrespective of the precise value of ε. Accordingly, the value of f0=C0=b0 is also set to ε in the case of b0=0.

Similarly, if the denominator in Dn=1bn+anDn1 is zero, then setting Dn=1ε for small enough ε gives DnDn+1=1an+1 irrespective of the value of ε.[3][8]

Applications

Lentz's algorithm was used widely in the late twentieth century. It was suggested that it doesn't have any rigorous analysis of error propagation. However, a few empirical tests suggest that it's at least as good as the other methods.[9] As an example, it was applied to evaluate exponential integral functions. This application was then called modified Lentz algorithm.[10] It's also stated that the Lentz algorithm is not applicable for every calculation, and convergence can be quite rapid for some continued fractions and vice versa for others.[11]

References

Template:Reflist