#值! excel VBA中的worksheetfunction.gammadist出错

时间:2015-06-26 19:51:45

标签: excel vba

我正在编写代码来找到等式的固定点:

  

1 / N = xf(x)/(1-F(x)),

其中x = p(1 + phi),f和F是伽马分布的pdf和cdf,N是正整数。

已知右侧的伽玛分布增加了x,所以必须有一个独特的解决方案。

我写了这个函数:

Function find_pdstar_gamma(alpha As Double, beta As Double, phi As Double, N As Integer) As Double

Dim plow As Double
Dim pmid As Double
Dim ptop As Double
Dim parg As Double
Dim f As Double
Dim Fbar As Double
Dim z As Double

plow = 0
ptop = 1000
Do
    pmid = (ptop + plow) / 2
    parg = (1 + phi) * pmid
    f = WorksheetFunction.GammaDist(parg, alpha, beta, False)
    Fbar = (1 - WorksheetFunction.GammaDist(parg, alpha, beta, True)) 
    z = parg * f / Fbar - 1 / N
    If z > 0 Then
        ptop = pmid
    Else
        plow = pmid
    End If
Loop Until ((ptop - plow) / ptop) < 1e-08
find_pdstar_gamma = (ptop + plow) / 2

End Function

我得到一个#value!运行该函数时出错。知道我的错误在哪里吗?

2 个答案:

答案 0 :(得分:1)

我猜测你得到了运行时错误6,(溢出)或运行时错误11(除以0)。这实际上可能会产生误导,因为它实际上是零,涉及Double可以报告为溢出。

要做的第一件事是检查以确保您的operator precedence对于这行代码是正确的:

z = parg * f / Fbar - 1 / N

评估为

z = ((parg * f) / Fbar) - (1 / N)

这意味着如果Fbar永远为零(或者足够小的双倍),那么您将在此处收到错误。

要做的第二件事是验证输入或添加错误处理程序。通过这种方式,您可以获得更有意义的错误指示。

答案 1 :(得分:0)

我将回答这个问题:“我知道我的错误在哪里?”我真的没有世俗的想法,但我知道如何缩小范围。在提到#value错误时 - 似乎您正在将其用作工作表函数。这可能是预期的应用程序,但它使调试变得困难。相反 - 在即时窗口中运行它。在VBE类型中类似

?find_pdstar_gamma(1, 3, 0.5, 100)

(但是使用alpha,beta等的值会给你带来悲伤)。执行此操作时 - 计算将在突出显示有问题的行时停止(如果您按错误msgbox中的调试按钮)。这告诉你 错误在哪里。