在紧凑支持[0,alpha]上整合类似β功能的功能,α< 1

时间:2014-03-22 23:32:04

标签: r integration

我想整合一个名为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中集成这种不完整的类β函数吗?

1 个答案:

答案 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

我怀疑你的积分不同,但这可能是棘手的,因为即使是最先进的符号代数系统也无法证明:

http://www.wolframalpha.com/input/?i=Integral%28x%5E%280.00001+-1%29+ln%28x%2F%281-x%29%29%2C+x%2C0%2C+0.5%29

无论如何,R不是解决此问题的正确工具。