具有integ()R的非有限函数值虽然存在解

时间:2016-08-01 09:37:50

标签: r function

我想在R中计算以下积分:

print(integrate(function(x){((1.-x)^2)/(abs(1.-x))^(1/3)},lower = 0, upper = 1.6, abs.tol = 1E-7)$value)

我收到了这个错误:

  

积分错误(function(x){:非有限函数值

但是,当我整合到1.600001或1.599999时,它可以工作并产生0.4710365和0.4710357。

但是在1.6点这个函数没什么特别的......所以它应该是R中的一个奇怪的数值问题。

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

如果你写这样的功能

f <- function(x) {
    r <- ((1.-x)^2)/(abs(1.-x))^(1/3)
    cat("x=",x,"\n")
    cat("r=",r,"\n")
    r
}

你可以了解发生了什么。 试试这个

z <- integrate(f,lower = 0, upper = 1.6, abs.tol = 1E-7,subdivisions=50)
z

您会看到integrate将值1传递给函数f。 除以0(来自1-x))得到NaN。这似乎是integrate的一件神器。

使用您指定的限制,您将跳过未定义函数的点。 你可以通过

来避免这种情况
z1 <- integrate(f,lower = 0, upper = 1, abs.tol = 1E-7)
z1

z2 <- integrate(f,lower = 1, upper = 1.6, abs.tol = 1E-7)
z2
z1$value+z2$value

给出

的结果
[1] 0.4710361

我不知道如何解决这个问题,而不是通过你所做的或我尝试过的事情。

答案 1 :(得分:0)

根据@ Bhas的回答,我会寻求以下解决方案:

> f <- function(x){ifelse(x!=1,((1.-x)^2)/(abs(1.-x))^(1/3),0)} # Set f(1)=0 since it is the limit of 'f' at 1.
> integrate(f,lower=0,upper=1.6,abs.tol=1E-7)
0.4710361 with absolute error < 2.2e-08

'ifelse'避免了与矢量化'x'相关的问题