我想在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中的一个奇怪的数值问题。
有什么想法吗?
答案 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'相关的问题