コンテンツにスキップ

英文维基 | 中文维基 | 日文维基 | 草榴社区

利用者:Flightbridge/sandbox/ランチョス近似

en:Lanczos approximation oldid=713051180

ランチョス近似: Lanczos approximation)とは、1964年にコルネリウス・ランチョスにより発表された[1]ガンマ関数を数値計算する方法である。これは、ガンマ関数を一定の精度で計算する方法として有名なスターリングの公式の実用的な代替となっている。

導入

[編集]

ランチョス近似は、次のガンマ関数についての式からなる。

ここで

である。g ≥ 0 は任意に選ばれる定数[2]であり、係数 p0, p1, ...g によって決まる値である(求め方は後述)。上記の式は複素右半平面英語版でしか成り立たないが、相補公式英語版を用いることで複素平面全体へと拡張できる。

級数 Ag収束するので、近似値を求めるには必要な精度に応じて計算を打ち切ればよい。一般的な単精度あるいは倍精度浮動小数点を用いる場合、適切な g (一般に小さな整数)を選べば 5 から 10 項ほどでガンマ関数を計算できる。級数 Ag の第 N + 1 項での打ち切りを考えると、打ち切り誤差 εg = 5, N = 6 のときで |ε| < 2 × 10−10 よりも小さくなる[3]

N = 2 のとき、各項を部分分数分解して整理すると

となる。同様に、第 N + 1 項で打ち切った Ag は適当な c0, ..., cN を用いて

と書ける。このとき各 c0, ..., cNp0, ..., pN の式であるから、g を固定すれば定数として予め計算しておくことが可能になる。

以上よりガンマ関数の計算は、ごく少数の初等関数の評価と予め求めておいた定数との積へと帰着される。ランチョス近似は『ニューメリカルレシピ英語版』において「こうすれば,ガンマ関数の計算は,当然初めから用意されている sin(x)ex のような関数の計算と比べて,ことさら難しい計算になることはない[3]」として紹介され、知られるようになった。この方法はGNU Scientific Libraryにおいて実装されている[4]

係数

[編集]

係数 p0, p1, ... は次の式で与えられる。

ここで C(i, j) は、i 次のチェビシェフ多項式における xj の係数を表す[2]。この値は次の式を用いて再帰的に求められる。

係数 c0, ..., cN は次の式で与えられる[2]

ポール・ゴッドフリーは係数 c0, ..., cN とその級数の値を行列の積によって得る方法を述べた[5][6]

導出

[編集]

簡単な実装

[編集]
def gamma(z):
    
    from cmath import sin,sqrt,pi,exp
    
    # GNU Scientific Library の値を使用
    g = 7
    N = 8
    c = [ 0.99999999999980993,     676.5203681218851,   -1259.1392167224028,
           771.32342877765313,   -176.61502916214059,    12.507343278686905,
         -0.13857109526572012, 9.9843695780195716e-6, 1.5056327351493116e-7]
    
    z = complex(z)
    
    if z.real < 0.5:
        # 相補公式
        return pi / (sin(pi * z) * gamma(1 - z))
    
    z -= 1
    x  = c[0]
    
    for k in range(1, N+1):
        x += c[k]/(z + k)
    
    t = z + g + 0.5
    return sqrt(2 * pi) * t**(z + 0.5) * exp(-t) * x

関連項目

[編集]

脚注

[編集]
  1. ^ Lanczos, Cornelius (1964). “A Precision Approximation of the Gamma Function”. SIAM Journal on Numerical Analysis series B (Society for Industrial and Applied Mathematics) 1: 86–96. doi:10.2307/2949767. ISSN 0887-459X. JSTOR 2949767. 
  2. ^ a b c Pugh, Glendon (2004). An analysis of the Lanczos Gamma approximation (PDF) (PhD thesis).
  3. ^ a b William H. Press、Saul A. Teukolsky、William T. Vetterling、Brian P. Flannery「6.1 ガンマ関数,ベータ関数,階乗関数,2項係数」『ニューメリカルレシピ・イン・シー 日本語版―C言語による数値計算のレシピ』丹慶 勝市、佐藤 俊郎、奥村 晴彦、小林 誠、169–170頁。 
  4. ^ GNU Scientific Library – Reference Manual: Gamma Functions”. 2016年10月21日閲覧。
  5. ^ Lanczos Implementation of the Gamma Function” (2001年). 2005年6月3日閲覧。
  6. ^ Programmable Calculators: The Lanczos Approximation” (2005年). 2006年1月11日閲覧。

外部リンク

[編集]

{@{デフォルトソート:らんちよすきんし}} [@[Category:数学に関する記事]] [@[Category:数値解析]]