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)会产生错误,并且间隔足够宽会产生不正确的积分。
有没有一个好方法可以解决这个问题?
答案 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))