提问人:cdalitz 提问时间:7/5/2023 最后编辑:ThomasIsCodingcdalitz 更新时间:7/12/2023 访问量:71
在 integrate() 失败时集成一个平滑函数
Integrate a smooth function when integrate() fails
问:
当尝试在 R 中集成以下平滑函数时,我总是得到一个错误,要么是“积分可能是发散的”,要么是“达到的最大细分数”:integrate()
问题似乎是函数在 +/-1 左右接近零,但很难适当地设置限制,增加或减少也无济于事。subdivisions
rel.tol
R(或 R 包)中是否有其他集成例程可供我尝试?例如,是否有可用于等距采样函数的简单辛普森积分的例程?
编辑:正如有人问的那样,这是该函数的实现:
a <- -1
b <- 1
sigma <- 0.1
# P(Y >= t)
PY <- function(t) {
za <- (t-a)/sigma
zb <- (t-b)/sigma
1 + sigma/(b-a) * (zb*pnorm(zb) + dnorm(zb) - za*pnorm(za) - dnorm(za))
}
# P(Y >= t | X=x)
PY.x <- function(t, x) {
1 - pnorm((t-x)/sigma)
}
# density of Y: p(y)
p.y <- function(y) {
zb <- (b-y)/sigma
za <- (a-y)/sigma
1/(b-a) * (pnorm(zb) - pnorm(za))
}
# Var in numerator
Var.Yt <- function(t) {
integrand <- function(x) {
(PY.x(t,x) - PY(t))^2
}
integrate(integrand, a, b)$value
}
# THIS IS THE FUNCTION TO BE INTEGRATED
f <- function(t) {
Var.Yt(t)*p.y(t)
}
对于任何值 ,的计算都成功,但 的积分失败,并出现上述错误。Var.Yt(t)
t
f
答:
4赞
ThomasIsCoding
7/5/2023
#1
我想你忘了在将函数推送到 or 之前对其进行矢量化。f
integrate
pramca::integral
在这里,您可以看到如果我们申请,它们会起作用Vectorize()
> pracma::integral(Vectorize(f), -2, 2)
[1] 0.2799594
> integrate(Vectorize(f), -2, 2)
0.2799594 with absolute error < 5.4e-06
评论
1赞
cdalitz
7/5/2023
啊,是的,就是这样!现在我甚至可以使用限制和.谢谢!-Inf
Inf
评论
integrate
pracma::integral()