在R中集成函数时出错

时间:2017-06-04 18:01:21

标签: r debugging

以下代码块用于定义和集成涉及矩阵指数的函数f1。

library(expm)
Lambdahat=rbind(c(-0.57,0.21,0.36,0,0),
c(0,-7.02,7.02,0,0),
c(1,0,-37.02,29,7.02),
c(0.03,0,0,-0.25,0.22),
c(0,0,0,0,0));

B=rbind(c(-1,1,0,0,0),c(0,0,0,0,0),c(0,0,0,0,0),c(0,0,0,0,0),c(0,0,0,0,0))

f1<-function(tau1)
{
  A=(expm(Lambdahat*tau1)%*%B%*%expm(Lambdahat*(5-tau1))); 
  return(A[1,5]);
}

out=integrate(f1,lower=0,upper=5)#integration of f1

上述行中的集成会产生以下错误:

Error in integrate(f1, lower = 0, upper = 5) : 
evaluation of function gave a result of wrong length
In addition: Warning messages:
1: In Lambdahat * tau1 :
longer object length is not a multiple of shorter object length
2: In Lambdahat * (t[i] - tau1) :
longer object length is not a multiple of shorter object length

为了检查功能输出和输入是否具有不同长度的功能f1,下面报告10个均匀间隔的输入和f1的相应输出。所有测试用例的输入和输出长度记录为等于1.

sapply(X=seq(from=0,to=5,by=0.5),FUN=f1)
[1] 2.107718e-01 1.441219e-01 0.000000e+00 2.023337e+06 1.709569e+14
[6] 1.452972e+22 1.243012e+30 1.071096e+38 9.302178e+45 8.146598e+53
[11] 7.197606e+61

如果有人可以分享代码可能出错的任何提示或指示,那将非常有帮助。非常感谢!

1 个答案:

答案 0 :(得分:1)

问题是传递给integrate的函数需要进行矢量化,即它应该能够接收输入值的向量并返回输出值的向量。我认为f1 <- Vectorize(f1)可以解决您的问题。