【发布时间】:2019-07-02 16:18:37
【问题描述】:
巧,
我在 R 中使用这个函数:
betaFun = function(x){
if(x == 0){
return(0.5)
}
return( ( 1+exp(x)*(x-1) )/( x*(exp(x)-1) ) )
}
函数对于每个 x 都是平滑且定义明确的(至少从理论的角度来看),并且在 0 中极限接近 0.5(您可以通过使用 Hopital 定理来说服自己)。
即事实上,由于限制,R 错误地计算了值,我得到了 0 的爆炸。
这里我报告数值问题:
x = c(1e-4, 1e-6, 1e-8, 1e-10, 1e-12, 1e-13)
sapply(x, betaFun)
[1] 5.000083e-01 5.000442e-01 2.220446e+00 0.000000e+00 0.000000e+00 1.111111e+10
如您所见,评估非常奇怪,尤其是最后一个。 我以为我可以通过在 0 中定义缺失值来解决这个问题(从代码中可以看出),但事实并非如此。
你知道我该如何解决这个数值爆炸问题吗?
这个函数需要高精度,因为我必须将它反转到 0 左右。我将使用 nleqslv 库中的 nleqslv 函数来实现。当然,如果函数有数值问题,反演会返回错误的解。
【问题讨论】:
-
curve((1+exp(x)*(x-1) )/( x*(exp(x)-1)), -10, 10, n = 1e5)看不到这一点。请提供一个完整的可重现示例。 -
@Roland 请注意,您选择的点最多只能达到 1E-4。 OP 计算 1E-13
-
能否请您使绘图与使用的公式兼容?对于所描述的域
[-10,10],给定的函数并没有那么接近渐近线,渐近线在y=0和y=1,并且奇点在x=0附近更加紧密,其中值为0.5,不是0。
标签: r methods numeric numerical-methods