R积分:返回错误的解(是否使用了错误的正交点?)

R积分:返回错误的解(是否使用了错误的正交点?),r,integrate,numerical-integration,R,Integrate,Numerical Integration,我在R中有一个函数,我试图对它进行积分,但是对于函数参数的一些极值,integrate返回不正确的解。我相信问题可能是integrate为其中一些极值选择了不合适的正交点,但首先我将演示这个问题 我希望集成的功能如下 integrandFunc_F <- function(x, func_u, func_u_lowerBar, func_u_upperBar, func_mean_v, func_sigma_v, func_sigma_epsilon, func_sigma_y

我在R中有一个函数,我试图对它进行积分,但是对于函数参数的一些极值,integrate返回不正确的解。我相信问题可能是integrate为其中一些极值选择了不合适的正交点,但首先我将演示这个问题

我希望集成的功能如下

integrandFunc_F <- function(x, func_u, func_u_lowerBar, 
  func_u_upperBar, func_mean_v, func_sigma_v, func_sigma_epsilon, 
  func_sigma_y, func_gamma, func_rho) {
#print(x);
p <- 1 - pnorm(func_u_upperBar,x,func_sigma_y);
q <- pnorm(func_u_lowerBar,x,func_sigma_y);
p <- p*(1-func_rho); q <- q*(1-func_rho);
alpha <- ifelse(func_gamma*(p+q) == 0, 0, pmax((func_gamma*p-q)/(func_gamma*(p+q)), 0));
g <- ifelse(x > func_u, dnorm(x,func_mean_v,sqrt(func_sigma_v^2 + func_sigma_epsilon^2))/(1-pnorm(func_u,func_mean_v,sqrt(func_sigma_v^2 + func_sigma_epsilon^2))), 0);
output <- alpha*g;
output
}
但是,当我尝试计算以下值时,得到的解不正确:0:

integrate(integrandFunc_F, lower=-Inf, upper=Inf, func_u= 8, func_u_lowerBar= 8, 
  func_u_upperBar= 8, func_mean_v= 50, func_sigma_v= .1, func_sigma_epsilon= 2, 
  func_sigma_y= 1, func_gamma= 1/1.1, func_rho= .05)
上面我指出,我相信这个问题可能与正交点的选择有关。如果在上面的函数中取消对printx的注释,您可以看到在func_mean_v=30的情况下,integral会在相对较大/接近30的正交点上进行结算。然而,在func_mean_v=50的情况下,经过几次迭代后,integrate选择接近0的正交点。0附近的正交点不适合评估该函数,该函数在func_mean_v处合并了正态分布和平均值


关于如何解决这个问题有什么想法吗?在某些情况下,为什么要将迭代积分到0附近的正交点?注意,func_mean_v=30和func_mean_v=50的选择是该函数的极端参数,但我需要能够正确计算此类情况

您可以将积分变量移动到峰值中心

wrapper <- function(x, func_mean_v, ...)
   integrandFunc_F(x+func_mean_v, func_mean_v=func_mean_v, ...)


integrate(wrapper, rel.tol = 1e-8, lower=-Inf, upper=Inf, func_u= 8, func_u_lowerBar= 8, 
          func_u_upperBar= 8, func_mean_v= 50, func_sigma_v= .1, func_sigma_epsilon= 2, 
          func_sigma_y= 1, func_gamma= 1/1.1, func_rho= .05)
# 1 with absolute error < 1.3e-09

你试过降低积分收敛的容差吗?没有适用于所有被积函数的自适应数值积分的一般规则,它如何知道被积函数在-Inf和+Inf之间的非零位置?有时你也会这样。我试着降低rel.tol并增加细分的数量。两人都没有解决这个问题。有没有一种方法可以从一组正交点开始提供积分?对于正态分布,应该不难知道被积函数的非零位置。如果知道被积函数的非零位置,则移动和可选地重新缩放积分变量是一种方法;这将有助于极大地集成。集成不能使用您自己的正交点:它使用特定的高斯正交规则,因此权重仅适用于相应的节点。谢谢@baptiste。您是否可以编辑以显示为您提供1的解决方案的确切代码?包装器是一个定义了integrandFunc\u F的函数吗?或者它们是分开定义的?这就是确切的代码!您可能会对包装器缺少{}而感到困惑,因为一行程序不需要它们。谢谢!因此,我保留了以前对integrandFunc_F的原始定义,然后像这里一样定义函数包装器。
wrapper <- function(x, func_mean_v, ...)
   integrandFunc_F(x+func_mean_v, func_mean_v=func_mean_v, ...)


integrate(wrapper, rel.tol = 1e-8, lower=-Inf, upper=Inf, func_u= 8, func_u_lowerBar= 8, 
          func_u_upperBar= 8, func_mean_v= 50, func_sigma_v= .1, func_sigma_epsilon= 2, 
          func_sigma_y= 1, func_gamma= 1/1.1, func_rho= .05)
# 1 with absolute error < 1.3e-09