我正在编写代码来找到等式的固定点:
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!运行该函数时出错。知道我的错误在哪里吗?
答案 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中的调试按钮)。这告诉你 错误在哪里。