伽马(gamma)函数,神奇的gamma函数
Python计算不完整的伽马函数。不完全伽玛函数有级数展开。这意味着你需要计算一系列的值,然后把它们加起来。欲了解更多信息,请参阅http://dlmf.nist.gov/8.
这个级数有无穷多个项,最后这些值越不相关,就越小。您可以创建最小值epsilon,如果以下项目小于该值,则停止计算:
{(-1)} k删除计算会产生交替符号。
如果s=1且z=2,则序列中的项目如下:
在某些时候,所有的附加项目对结果没有明显的影响。
当考察累积分布函数f(x,k)时,分数的值。分数可以考虑。k除以2是一个整数。x的值可以是分数,也可以是浮点数,很少是整数值。
计算(gamma) s,z)项时,值为()frac) {(-1)} k} {k!}包含整数,可以用适当的分数值表示。但是,整个表达式不一定是分数对象。z {s k}的值可以是分数或浮点数。如果s k不是整数,结果就是无理数。对于无理数,可以使用格式更复杂的Fraction对象来逼近它们。
虽然分数值可以用在gamma函数中,但似乎没什么用。然而,对于全伽马函数,分数对象具有潜在的优势。因此,即使Fraction对象可以近似为一个不合理的值,这个实现也会使用这个对象。
上述级数展开实现如下。
这将定义用于生成一组项目的term()函数,并将for语句限制为最多生成100个项目。您还可以使用itertools.count()函数来生成无限的项目序列,但是在这里使用上限循环似乎更简单。
上面算出的Z {s k},可能是无理数,并根据这个值创造了一个分数值。Division frac {z {s k}} {s k}包括两个分数的除法,一个新的分数值将赋给变量t2。后续变量term的值是这两个Fraction对象的乘积。
此外,还定义了take_until()函数,该函数取可重复对象的值,直到给定函数为真。如果函数为真,可重复对象将不再生成新值。它还定义了一个小阈值:10 {-8 }。Term))从函数中获取值,直到该值小于epsilon。这些值的总和是伽玛函数部分的近似值。
注意,阈值变量是希腊字符epsilon。在Python 3中,变量名可以包含任何Unicode字符。
以下测试案例可以用来验证计算结果是否正常。
误差函数erf())位于Python的数学库中,不需要特殊的近似。
我们关注卡方分布。由于一些数学上的考虑,不完整的伽马函数通常是不感兴趣的,所以您可以使用测试用例将范围缩小到数字类型,并限制结果的准确性。大部分卡测的精度都达到了小数点后三位。测试数据显示7位小数。这可能超出了实际需要。