如何在R中进行向量积分?

时间:2015-06-21 20:30:28

标签: r vector integral

我想在R中集成一维向量,我该怎么做? 假设我有:

d=hist(p, breaks=100, plot=FALSE)$density

其中p是如下样本:

p=rnorm(1e5)

如何在d?

上计算积分

1 个答案:

答案 0 :(得分:2)

如果我们假设d中的值对应于函数的y值,那么我们可以使用离散近似来计算积分。例如,我们可以为此目的使用梯形法则或辛普森一家规则。然后,我们还需要输入与x轴上的离散区间相对应的步长,以便"近似曲线下的区域"。

下面定义的离散积分函数:

p=rnorm(1e5)
d=hist(p,breaks=100,plot=FALSE)$density

discreteIntegrationTrapeziumRule <- function(v,lower=1,upper=length(v),stepsize=1)
{
  if(upper > length(v))
    upper=length(v)
  if(lower < 1)
    lower=1

  integrand <- v[lower:upper]
  l <- length(integrand)
  stepsize*(0.5*integrand[1]+sum(integrand[2:(l-1)])+0.5*v[l])
}

discreteIntegrationSimpsonRule <- function(v,lower=1,upper=length(v),stepsize=1)
{
  if(upper > length(v))
    upper=length(v)
  if(lower < 1)
    lower=1

  integrand <- v[lower:upper]
  l <- length(integrand)
  a = seq(from=2,to=l-1,by=2);
  b = seq(from=3,to=l-1,by=2)
  (stepsize/3)*(integrand[1]+4*sum(integrand[a])+2*sum(integrand[b])+integrand[l])
}

例如,让我们近似曲线下的整个区域,同时假设大小为1的离散x步,然后对d的后半部分执行相同的操作,同时我们假设x步长0.2。

> plot(1:length(d),d) # stepsize one on x-axis
> resultTrapeziumRule <- discreteIntegrationTrapeziumRule(d) # integrate over complete interval, assume x-stepsize = 1
> resultSimpsonRule <- discreteIntegrationSimpsonRule(d) # integrate over complete interval, assume x-stepsize = 1
> resultTrapeziumRule
[1] 9.9999
> resultSimpsonRule
[1] 10.00247

> plot(seq(from=-10,to=(-10+(length(d)*0.2)-0.2),by=0.2),d) # stepsize 0.2 on x-axis
> resultTrapziumRule <- discreteIntegrationTrapeziumRule(d,ceiling(length(d)/2),length(d),0.2) # integrate over second part of vector, x-stepsize=0.2
> resultSimpsonRule <- discreteIntegrationSimpsonRule(d,ceiling(length(d)/2),length(d),0.2) # integrate over second part of vector, x-stepsize=0.2
> resultTrapziumRule
[1] 1.15478
> resultSimpsonRule
[1] 1.11678

通常,Simpson规则提供更好的积分近似值。您拥有的y值越多(x轴步长越小),您的近似值就越好。

为了清晰起见,

编辑: 在这种特殊情况下,步长显然应为0.1。然后,密度曲线下的完整区域(大约)等于1,如预期的那样。

> d=hist(p,breaks=100,plot=FALSE)$density
> hist(p,breaks=100,plot=FALSE)$mids # stepsize = 0.1
 [1] -4.75 -4.65 -4.55 -4.45 -4.35 -4.25 -4.15 -4.05 -3.95 -3.85 -3.75 -3.65 -3.55 -3.45 -3.35 -3.25 -3.15 -3.05 -2.95 -2.85 -2.75 -2.65 -2.55
[24] -2.45 -2.35 -2.25 -2.15 -2.05 -1.95 -1.85 -1.75 -1.65 -1.55 -1.45 -1.35 -1.25 -1.15 -1.05 -0.95 -0.85 -0.75 -0.65 -0.55 -0.45 -0.35 -0.25
[47] -0.15 -0.05  0.05  0.15  0.25  0.35  0.45  0.55  0.65  0.75  0.85  0.95  1.05  1.15  1.25  1.35  1.45  1.55  1.65  1.75  1.85  1.95  2.05
[70]  2.15  2.25  2.35  2.45  2.55  2.65  2.75  2.85  2.95  3.05  3.15  3.25  3.35  3.45  3.55  3.65  3.75  3.85  3.95  4.05  4.15

> resultTrapeziumRule <- discreteIntegrationTrapeziumRule(d,stepsize=0.1) 
> resultTrapeziumRule
[1] 0.999985