Jump to content

Приближение Ланцоша

В математике приближение Ланцоша — это метод численного вычисления гамма-функции , опубликованный Корнелиусом Ланцошем в 1964 году. Это практическая альтернатива более популярному приближению Стирлинга для вычисления гамма-функции с фиксированной точностью.

Введение [ править ]

Приближение Ланцоша состоит из формулы

для гамма-функции, с

Здесь g — действительная константа , которую можно выбирать произвольно с учетом ограничения Re( z + g + 1/2 0 . ) > [1] Коэффициенты p , зависящие от g , вычислить несколько сложнее (см. ниже). Хотя формула, изложенная здесь, действительна только для аргументов в правой комплексной полуплоскости , ее можно распространить на всю комплексную плоскость с помощью формулы отражения :

Ряд A сходится и может быть усечен для получения приближения с желаемой точностью. При выборе подходящего g потребуется всего около 5–10 членов ряда (обычно небольшого целого числа) для вычисления гамма-функции с типичной одинарной или двойной точностью с плавающей запятой . фиксированное g Если выбрано , коэффициенты можно рассчитать заранее и благодаря разложению на частные дроби сумма преобразуется в следующий вид:

Таким образом, вычисление гамма-функции становится вопросом вычисления лишь небольшого количества элементарных функций и умножения на сохраненные константы. Приближение Ланцоша было популяризировано Numerical Recipes , согласно которому вычисление гамма-функции становится «не намного сложнее, чем другие встроенные функции, которые мы принимаем как должное, такие как sin x или e». х Метод также реализован в GNU Scientific Library , Boost , CPython и musl .

Коэффициенты [ править ]

Коэффициенты имеют вид

где представляет ( n , m )-й элемент матрицы коэффициентов полиномов Чебышева , который можно вычислить рекурсивно из этих тождеств:

Годфри (2001) описывает, как получить коэффициенты, а также значение усеченного ряда A как матричного произведения . [2]

Вывод [ править ]

Ланцош вывел формулу из Леонарда Эйлера . интеграла

выполнение последовательности основных манипуляций для получения

и вывод ряда для интеграла.

Простая реализация [ править ]

Следующая реализация на языке программирования Python работает для сложных аргументов и обычно дает 13 правильных десятичных знаков. Обратите внимание, что исключение наименьших коэффициентов (например, в погоне за скоростью) дает совершенно неточные результаты; коэффициенты необходимо пересчитывать с нуля для разложения с меньшим количеством членов.

from cmath import sin, sqrt, pi, exp


"""
The coefficients used in the code are for when g = 7 and n = 9
Here are some other samples

g = 5
n = 5
p = [
    1.0000018972739440364,
    76.180082222642137322,
    -86.505092037054859197,
    24.012898581922685900,
    -1.2296028490285820771
]

g = 5
n = 7
p = [
    1.0000000001900148240,
    76.180091729471463483,
    -86.505320329416767652,
    24.014098240830910490,
    -1.2317395724501553875,
    0.0012086509738661785061,
    -5.3952393849531283785e-6
]

g = 8
n = 12
p = [
    0.9999999999999999298,
    1975.3739023578852322,
    -4397.3823927922428918,
    3462.6328459862717019,
    -1156.9851431631167820,
    154.53815050252775060,
    -6.2536716123689161798,
    0.034642762454736807441,
    -7.4776171974442977377e-7,
    6.3041253821852264261e-8,
    -2.7405717035683877489e-8,
    4.0486948817567609101e-9
]
"""

g = 7
n = 9
p = [
    0.99999999999980993,
    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 = p[0]
        for i in range(1, len(p)):
            x += p[i] / (z + i)
        t = z + g + 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))

См. также [ править ]

Ссылки [ править ]

  1. ^ Пью, Глендон (2004). Анализ гамма-приближения Ланцоша (PDF) (доктор философии).
  2. ^ Годфри, Пол (2001). «Реализация гамма-функции Ланцоша» . Нумерикана .
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 1a1d1291032c764dd28e6c93c391a655__1716392460
URL1:https://arc.ask3.ru/arc/aa/1a/55/1a1d1291032c764dd28e6c93c391a655.html
Заголовок, (Title) документа по адресу, URL1:
Lanczos approximation - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)