Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/73.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_Integral_Numerical Integration_Infinity - Fatal编程技术网

R中数值不稳定积分的求解

R中数值不稳定积分的求解,r,integral,numerical-integration,infinity,R,Integral,Numerical Integration,Infinity,我想在-Inf和Inf之间为x集成一个函数。我在R中使用函数integrate。但是,我确实收到一个错误,即非有限函数值 test_func<-function(x,t,A,sigma, y){ n1 = exp(-((y - x)^2)/(4 * sigma * t)) + exp(-((y + x)^2)/(4 * sigma * t)) d1 = sqrt(4 * pi * sigma * t) a2 = 2 * A /(sigma) * exp((4 * A *(

我想在
-Inf
Inf
之间为
x
集成一个函数。我在R中使用函数
integrate
。但是,我确实收到一个错误,即
非有限函数值

test_func<-function(x,t,A,sigma, y){
  
  n1 = exp(-((y - x)^2)/(4 * sigma * t)) + exp(-((y + x)^2)/(4 * sigma * t))
  d1 = sqrt(4 * pi * sigma * t)
  a2 = 2 * A /(sigma) * exp((4 * A *(y + x +(4 * A * t)))/(sigma))
  b2 = pracma::erfc(((y + x)+(8 * A * t))/(2 * sqrt(sigma * t)))
  res = (n1/d1) - (a2 * b2)
  return(res)
}

t<-1000
A<-0.01
sigma<-1
y<-1

integrate(test_func,lower = -Inf , upper = Inf, t,A,sigma,y)$value

我知道有很多方法可以使这种积分在数值上稳定,但我不知道,在这种情况下,哪种方法可以帮助。

对于
x>17703.5
表达式
exp(4*A*(y+x+(4*A*t))
是无限的,而
b2
是不能小到足以补偿这一点的。在应用集成、优化或其他例程之前,请检查您的函数。谢谢您的评论。但“检查你的功能”到底是什么意思?函数编写正确。您是否建议不要在-Inf和Inf之间进行积分,而是使用-17703.5和17703.5之间的间隔?您必须意识到(1)无限域上的数值积分无论如何都是有问题的,必须小心完成,(2)在浮点双精度中,您的函数是不正确的。将两个项相乘,其中一个项为
Inf
,另一个项为零,将导致很大程度上不可预测的结果。也许您可以重写函数以避免这种不稳定的行为。我认为使用多重精度并不能消除这个问题。是的,我同意,这就是我发布这个问题的原因。我想知道其他人是否对这类问题有更多的经验,并提出可能的解决方案。在另一个例子中,我使用了下面的过程a*b=exp(log(a)+log(b))来解决类似的问题。但是在这种情况下,它不起作用。对于
x>17703.5
表达式
exp(4*A*(y+x+(4*A*t))
是无限的,而
b2
是不能小到足以补偿这一点的。在应用集成、优化或其他例程之前,请检查您的函数。谢谢您的评论。但“检查你的功能”到底是什么意思?函数编写正确。您是否建议不要在-Inf和Inf之间进行积分,而是使用-17703.5和17703.5之间的间隔?您必须意识到(1)无限域上的数值积分无论如何都是有问题的,必须小心完成,(2)在浮点双精度中,您的函数是不正确的。将两个项相乘,其中一个项为
Inf
,另一个项为零,将导致很大程度上不可预测的结果。也许您可以重写函数以避免这种不稳定的行为。我认为使用多重精度并不能消除这个问题。是的,我同意,这就是我发布这个问题的原因。我想知道其他人是否对这类问题有更多的经验,并提出可能的解决方案。在另一个例子中,我使用了下面的过程a*b=exp(log(a)+log(b))来解决类似的问题。但在这种情况下,它不起作用。
Error in integrate(test_func, lower = -Inf, upper = Inf, t, A, sigma,  : 
  non-finite function value