为什么我对 Gamma 函数的近似值不准确?

Why is my approximation of the Gamma function not exact?

所以我打算从 python 的 math 库中重新创建一些数学函数。

其中一个函数是 math.gamma 函数。因为我了解 JavaScript 我想我可以尝试将 JavaScript implementation of the Lanczos approximation on Rosetta code 翻译成 Applescript 代码:

on gamma(x)
    set p to {1.0, 676.520368121885, -1259.139216722403, 771.323428777653, -176.615029162141, 12.507343278687, -0.138571095266, 9.98436957801957E-6, 1.50563273514931E-7}
    set E to 2.718281828459045
    set g to 7
    if x < 0.5 then
        return pi / (sin(pi * x) * (gamma(1 - x)))
    end if
    set x to x - 1
    set a to item 1 of p
    set t to x + g + 0.5
    repeat with i from 2 to count of p
        set a to a + ((item i of p) / (x + i))
    end repeat
    return ((2 * pi) ^ 0.5) * (t ^ x + 0.5) * (E ^ -t) * a
end gamma

运行 所需的函数是:

on sin(x)
    return (do shell script "python3 -c 'import math; print(math.sin(" & x & "))'") as number
end sin

已删除 Javascript 实现的所有其他函数,以减少所需的函数,但我引入的内联操作产生相同的结果。


此 Javascript 代码在浏览器控制台中尝试 运行 时效果很好,但我的 Applescript 实现不会产生接近实际结果的答案。是不是因为...

您在代码中犯了两个错误:

首先,你的repeat语句中的i是从2开始的,而不是1,这对于(item i of p)来说是可以的,但是在(x + i)中需要减去1 ].

其次,在 return 语句的代码 (t ^ x + 0.5) 中,tx 首先被计算,因为它们是指数,然后添加到 0.5,但根据 JavaScript 实现,需要先将 x0.5 相加。