我想整合一个名为betalog的以下函数
g <- function(x,a,b){
if (a < 0 | b < 0) stop()
temp <- (a-1)*log(x) + (b-1)*log(1-x)
return( exp(temp) )
}
betalog<- function(x,a,b)
{
temp <- g(x=x,a=a,b=b)* log(x/(1-x))
return( temp )
}
函数g是beta函数的积分。理论上,如果0 <0,则应该在任何[0,α]区间上积分。 alpha&lt; 1,&gt; 0,b> 0。 但是,我无法将betalog与非常小的a:
进行数字整合 a <- 0.00001
b <- 1
alpha <- 0.5
integrate(betalog,a=a,b=b,lower=0,upper=alpha,subdivisions=1000000L)
Error in integrate(betalog, a = a, b = b, lower = 0, upper = alpha, subdivisions =
1000000L) :
non-finite function value
事实上,当a非常小时,我甚至无法使用R积分函数计算不完整的β函数:
integrate(g,a=a,b=b,lower=0,upper=alpha,subdivisions=1000000L)
Error in integrate(g, a = a, b = b, lower = 0, upper = alpha, subdivisions = 1000000L) :
roundoff error is detected in the extrapolation table
任何人都可以给我提示在R中集成这种不完整的类β函数吗?
答案 0 :(得分:3)
> betalog(0, a, b)
[1] -Inf
你的功能在下限是单数。回想一下,要计算不正确的积分,必须用虚拟变量替换单数边界,并从正确的边向该边界取限制。特别是,
> integrate(betalog,a=a,b=b,lower=0.000001,upper=alpha,subdivisions=10000000L)
-94.60292 with absolute error < 0.00014
> integrate(betalog,a=a,b=b,lower=.Machine$double.xmin * 1000,upper=alpha,subdivisions=10000
-244894.7 with absolute error < 10
> integrate(betalog,a=a,b=b,lower=.Machine$double.xmin,upper=alpha,subdivisions=10000000L)
Error in integrate(betalog, a = a, b = b, lower = .Machine$double.xmin, :
non-finite function value
我怀疑你的积分不同,但这可能是棘手的,因为即使是最先进的符号代数系统也无法证明:
无论如何,R不是解决此问题的正确工具。