Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R积分:返回错误的解(是否使用了错误的正交点?)_R_Integrate_Numerical Integration - Fatal编程技术网

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)
上面我指出,我相信这个问题可能与正交点的选择有关。如果在上面的函数中取消注释
#print(x)
,可以看到在
func\u mean\u v=30
的情况下,
integrate
在相对较大/接近30的正交点上结算。但是,在
func_mean_v=50
的情况下,经过几次迭代
integrate
选择接近0的正交点。接近0的正交点不适合评估该函数,该函数包含一个正态分布,平均值为
func\u mean\u 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

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