积分可能是分歧的

时间:2016-03-24 08:01:26

标签: r numerical-methods numerical-integration

fun1 = function(y,mu=mu0,lsig=lsig0) {
  res = 1/(exp(-y)+1)^2 * 1/sqrt(2*pi)/exp(lsig) * exp(-(y-mu)^2/2/exp(lsig)^2)
  return(res)
}

fun4 = function(para=c(mu1,lsig1)) {
  mu1 = para[1]
  lsig1 = para[2]
  res = n1 * log(noze(integrate(fun1,-Inf,Inf,mu=mu1,lsig=lsig1)$value)) +
    n3 * log(noze(integrate(fun2,-Inf,Inf,mu=mu1,lsig=lsig1)$value)) +
    n2 * log(noze(integrate(fun3,-Inf,Inf,mu=mu1,lsig=lsig1)$value))
  return(-res)
}

noze = function(x) {
  if (x < 1e-100) { x = 1e-100 }
  return(x)
}

 optim(c(0.5,2),fun4,method="L-BFGS-B",lower=c(-5,-3),upper=c(3.5,3.5))$par

我必须找到两个功能参数&#39; fun4&#39;它使用了&#39; fun1。&#39;的积分。 (&#39; fun2&#39;和&#39; fun3&#39;与&#39; fun1&#39;略有不同)

我在集成时遇到错误&#39;错误(fun1,-Inf,Inf,-3.9538,-3):   积分可能是不同的&#39;

使用散点图,我发现除了(-4.2,-3.7)之外,fun1几乎到处都接近于零。 因此,对该区间进行积分只能得到(近似)正确的积分。

> integrate(fun1,-4.2,-3.6,-3.9538,-3)
0.0003558953 with absolute error < 3e-11

这可以使用附近的参数值

来确认
> integrate(fun1,-Inf,Inf,-3.9538,-3.1)
0.0003555906 with absolute error < 2.6e-05
> integrate(fun1,-Inf,Inf,-3.9538,-2.85)
0.0003564842 with absolute error < 3.7e-06

如果间隔太宽,则会给出不正确的积分。

> integrate(fun1,-5,5,-3.9538,-3)
0.0003558953 with absolute error < 2.3e-08
> integrate(fun1,-15,15,-3.9538,-3)
3.492547e-11 with absolute error < 6.5e-11
> integrate(fun1,-30,30,-3.9538,-3)
1.980146e-41 with absolute error < 3.4e-41
> integrate(fun1,-50,50,-3.9538,-3)
0 with absolute error < 0
> integrate(fun1,-Inf,Inf,-3.9538,-3)
Error in integrate(fun1, -Inf, Inf, -3.9538, -3) : 
  the integral is probably divergent

如果我只需要整合一次,我可以找到一个“fun1&#39;足够大,只能在该间隔内集成。 但问题是我使用了优化函数,该函数尝试使用各种参数来找到“fun4”的最小化器。&#39;

使用(-Inf,Inf)会产生错误,并且间隔足够宽会产生不正确的积分。

有没有一个好方法可以解决这个问题?

1 个答案:

答案 0 :(得分:-1)

使用Gauss-Hermite integration可以解决高斯内核的卷积问题,并且有 R 包:https://cran.r-project.org/web/packages/gaussquad/gaussquad.pdf

一些测试代码:

library(gaussquad)

n.quad <- 128 # integration order

# get the particular weights/abscissas as data frame with 2 observables and n.quad observations
rule <- ghermite.h.quadrature.rules(n.quad, mu = 0.0)[[n.quad]]

# test function - integrate 1 over exp(-x^2) from -Inf to Inf
# should get sqrt(pi) as an answer
f <- function(x) {
    1.0
}

q <- ghermite.h.quadrature(f, rule)
print(q - sqrt(pi))