积分中的R求和

时间:2016-08-22 18:51:58

标签: r

我正在试图弄清楚如何在R中集成以下功能:

item.fill.rate <- function(x, lt, ib, S){
1-((((1/(factorial(S)))*((x*lt*ib)^S)))/
   (sum(((1/(factorial(0:S)))*((x*lt*ib)^(0:S))))))}

其中x是变量,lt,ib和S是输入参数

根据此处的上一个主题,我尝试了以下内容:

int.func <- function(lt, ib, S){
item.fill.rate <- function(x){
1-((((1/(factorial(S)))*((x*lt*ib)^S)))/(sum(((1/(factorial(0:S)))*((x*lt*ib)^(0:S))))))
}
return(item.fill.rate)
}
integrate(int.func(0.25, 1, 1), lower=0.25, upper=0.75)$value

申请时,我收到以下错误:

> integrate(int.func(0.25, 1, 1), lower=0.25, upper=0.75)$value
[1] 0.4947184
Warning messages:
1: In (x * lt * ib)^(0:S) :
longer object length is not a multiple of shorter object length
2: In (1/(factorial(0:S))) * ((x * lt * ib)^(0:S)) :
longer object length is not a multiple of shorter object length

我评估了这些对象的长度,但是没有给出任何错误必须指示的地方。

我试图尽可能具体,所以希望有人能够帮助我解决这个问题!

1 个答案:

答案 0 :(得分:0)

sum函数因预期更长的向量而返回单个项目而臭名昭着,因此调用sum的被积函数通常需要“向量化”,以便它们提供预期的结果(与integrate成功提供的“x” - 矢量长度相同的向量。 Vectorize函数是sapply的包装器,对于此过程非常方便。您可以在调用integrate时设置参数。 (目前我认为你可能在一个长度为1/2的域上积分一个常量。)

item.fill.rate <- function(x,lt, ib, S){
1-((((1/(factorial(S)))*((x*lt*ib)^S)))/(sum(((1/(factorial(0:S)))*((x*lt*ib)^(0:S))))))
}
vint <- Vectorize(item.fill.rate)

integrate(vint, S=1, lt=0.25, ib= 1, lower=0.25, upper=0.75)$value
#[1] 0.4449025