为什么我对 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 实现不会产生接近实际结果的答案。是不是因为...
- ...我执行错了什么?
- ...Applescript 不够精确?
- ...还有别的吗?
您在代码中犯了两个错误:
首先,你的repeat语句中的i
是从2开始的,而不是1,这对于(item i of p)
来说是可以的,但是在(x + i)
中需要减去1 ].
其次,在 return 语句的代码 (t ^ x + 0.5)
中,t
和 x
首先被计算,因为它们是指数,然后添加到 0.5
,但根据 JavaScript 实现,需要先将 x
和 0.5
相加。
所以我打算从 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 实现不会产生接近实际结果的答案。是不是因为...
- ...我执行错了什么?
- ...Applescript 不够精确?
- ...还有别的吗?
您在代码中犯了两个错误:
首先,你的repeat语句中的i
是从2开始的,而不是1,这对于(item i of p)
来说是可以的,但是在(x + i)
中需要减去1 ].
其次,在 return 语句的代码 (t ^ x + 0.5)
中,t
和 x
首先被计算,因为它们是指数,然后添加到 0.5
,但根据 JavaScript 实现,需要先将 x
和 0.5
相加。