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