Lanczos Annäherung - Lanczos approximation

In der Mathematik ist die Lanczos-Näherung eine Methode zur numerischen Berechnung der Gammafunktion , die 1964 von Cornelius Lanczos veröffentlicht wurde. Sie ist eine praktische Alternative zur populäreren Stirling-Näherung zur Berechnung der Gammafunktion mit fester Genauigkeit.

Einführung

Die Lanczos-Näherung besteht aus der Formel

für die Gammafunktion mit

Hier ist g eine Konstante , die willkürlich gewählt werden kann, vorbehaltlich der Einschränkung, dass Re ( z )>  1 /. 2 . Die von g abhängigen Koeffizienten p sind etwas schwieriger zu berechnen (siehe unten). Obwohl die hier angegebene Formel nur für Argumente in der rechten komplexen Halbebene gilt , kann sie durch die Reflexionsformel auf die gesamte komplexe Ebene erweitert werden .

Die Reihe A ist konvergent und kann abgeschnitten werden, um eine Annäherung mit der gewünschten Genauigkeit zu erhalten. Durch die Wahl eines geeigneten g (typischerweise eine kleine ganze Zahl ist ), nur etwa 5-10 Glieder der Reihe nötig sind , um die Gamma - Funktion mit typischen zur Berechnung einzelner oder doppelter Fließkommagenauigkeit. Wenn ein festes g gewählt wird, können die Koeffizienten im Voraus berechnet werden und die Summe wird in die folgende Form umformuliert:

Die Berechnung der Gammafunktion wird somit zu einer Frage der Auswertung nur einer kleinen Anzahl von Elementarfunktionen und der Multiplikation mit gespeicherten Konstanten. Die Lanczos-Näherung wurde von Numerical Recipes populär gemacht , wonach die Berechnung der Gammafunktion "nicht viel schwieriger wird als andere eingebaute Funktionen, die wir für selbstverständlich halten, wie sin  x oder e x ". Die Methode ist auch in der GNU Scientific Library , Boost , CPython und musl implementiert .

Koeffizienten

Die Koeffizienten sind gegeben durch

wo stellt das ( n , m ) -te Element der Matrix von Koeffizienten für die Chebyshev - Polynome , die berechnet werden können rekursiv aus diesen Identitäten:

Godfrey (2001) beschreibt, wie man die Koeffizienten und auch den Wert der verkürzten Reihe A als Matrixprodukt erhält .

Ableitung

Lanczos abgeleitet die Formel aus Leonhard Euler ist integral

Durchführen einer Folge grundlegender Manipulationen, um zu erhalten

und Ableiten einer Reihe für das Integral.

Einfache Implementierung

Die folgende Implementierung in der Programmiersprache Python funktioniert für komplexe Argumente und gibt normalerweise 15 korrekte Dezimalstellen an. Beachten Sie, dass das Weglassen der kleinsten Koeffizienten nicht zu einer schnelleren, aber etwas weniger genauen Implementierung führt. Die Koeffizienten müssen für eine Erweiterung mit weniger Termen von Grund auf neu berechnet werden.

from cmath import sin, sqrt, pi, exp

p = [676.5203681218851
    ,-1259.1392167224028
    ,771.32342877765313
    ,-176.61502916214059
    ,12.507343278686905
    ,-0.13857109526572012
    ,9.9843695780195716e-6
    ,1.5056327351493116e-7
    ]

EPSILON = 1e-07
def drop_imag(z):
    if abs(z.imag) <= EPSILON:
        z = z.real
    return z

def gamma(z):
    z = complex(z)
    if z.real < 0.5:
        y = pi / (sin(pi * z) * gamma(1 - z))  # Reflection formula
    else:
        z -= 1
        x = 0.99999999999980993
        for (i, pval) in enumerate(p):
            x += pval / (z + i + 1)
        t = z + len(p) - 0.5
        y = sqrt(2 * pi) * t ** (z + 0.5) * exp(-t) * x
    return drop_imag(y)
"""
The above use of the reflection (thus the if-else structure) is necessary, even though 
it may look strange, as it allows to extend the approximation to values of z where 
Re(z) < 0.5, where the Lanczos method is not valid.
"""

print(gamma(1))
print(gamma(5))   
print(gamma(0.5))

Siehe auch

Verweise

  1. ^ Pugh, Glendon (2004). Eine Analyse der Lanczos-Gamma-Näherung (PDF) (Ph.D.).
  2. ^ Godfrey, Paul (2001). "Lanczos Implementierung der Gammafunktion" . Numericana .