Gamma分布,不完整的β函数

时间:2017-04-20 15:14:39

标签: vb.net math statistics numerical-methods gamma-distribution

我需要计算Gamma累积分布,看起来这相当于计算不完全β函数。 Excel确实有一个内置计算器,但我没有找到使用过的算法的痕迹。 你们中的任何人都知道计算这个函数的准确方法吗? 我尝试了以下内容,从网站翻译成VB.NET,但它给出了愚蠢的结果:

Function IncompleteBetaFunc(x As Double, a As Double, b As Double) As Double
    If x <= 0 Or x >= 1 Then Return 0
    Dim bt As Double
    bt = Math.Exp(GammaLn(a + b) - GammaLn(a) - GammaLn(b) + a * Math.Log(x) + b * Math.Log(1.0 - x))
    If x < (a + 1.0) / (a + b + 2.0) Then

        Return bt * betacf(a, b, x) / a
    Else
        Return 1.0 - bt * betacf(b, a, 1.0 - x) / b
    End If
End Function

Function betacf(x As Double, a As Double, b As Double) As Double
    Const MAXIT As Integer = 100
    Const EPS As Double = 0.0000003
    Const FPMIN As Double = 1.0E-30
    Dim aa, c, d, del, h, qab, qam, qap As Double
    Dim m, m2 As Integer
    qab = a + b
    qap = a + 1.0
    qam = a - 1.0
    c = 1.0
    d = 1.0 - qab * x / qap
    If (Math.Abs(d) < FPMIN) Then d = FPMIN
    d = 1.0 / d
    h = d
    For m = 1 To MAXIT
        m2 = 2 * m
        aa = m * (b - m) * x / ((qam + m2) * (a + m2))
        d = 1.0 + aa * d
        If (Math.Abs(d) < FPMIN) Then d = FPMIN
        c = 1.0 + aa / c
        If (Math.Abs(c) < FPMIN) Then c = FPMIN
        d = 1.0 / d
        h *= d * c
        aa = -(a + m) * (qab + m) * x / ((a + m2) * (qap + m2))
        d = 1.0 + aa * d
        If (Math.Abs(d) < FPMIN) Then d = FPMIN
        c = 1.0 + aa / c
        If (Math.Abs(c) < FPMIN) Then c = FPMIN
        d = 1.0 / d
        del = d * c
        h *= del
        If (Math.Abs(del - 1.0) < EPS) Then Exit For
    Next
    Return h
End Function

谢谢!

1 个答案:

答案 0 :(得分:2)

Meta.Numerics包含经过充分测试和执行的代码,适用于许多其他特殊功能。其不完整的Beta函数记录在案here。可以研究基础代码here。它还有一个全开Gamma distribution对象,除了计算CDF之外,它还会提供片刻,生成随机变量,并执行其他与分布相关的内容。该套餐可通过NuGet获得;只需在VS NuGet界面中搜索Meta.Numerics。