我遇到了一个有趣但又烦人的问题。
我正在尝试集成从数据集计算的函数。 可以在此处找到数据:Link to sample.txt。
我首先在我的数据上插入一行。这可以使用approxfun
线性完成,也可以使用splinefun
非线性完成。在我下面的例子中,我使用后者。
现在,当我尝试集成拟合函数时,我遇到错误
maximum number of subdivisions reached
但是当我增加细分时,我得到了
roundoff error
根据我的示例代码中的值,您可以看到对于此特定数据集,阈值为754-> 755。
我的同事将此数据集集成到Matlab中没有问题。有没有办法操纵我的数据进行整合?在R?
中是否存在另一种数值积分方法
data<-read.table('sample.txt',sep=',')
colnames(data)<-c('wave','trans')
plot(data$wave,data$trans,type='l')
trans<- -1 * log(data$trans)
plot(data$wave,trans,type='l')
fx.spline<-splinefun(data$wave,trans)
#Try either
Fx.spline<-integrate(fx.spline,min(data$wave),max(data$wave))
#Above: Number of subdivision reached
Fx.spline<-integrate(fx.spline,min(data$wave),max(data$wave),subdivisions=754)
#Above: Number of subdivision reached
Fx.spline<-integrate(fx.spline,min(data$wave),max(data$wave),subdivisions=755)
#Above: Roundoff error
答案 0 :(得分:6)
R中有很多集成例程,您可以通过'RSiteSearch'或使用'sos'包找到其中的一些例程。
例如,包pracma
有几个实现,例如
quad(fx.spline,min(data$wave),max(data$wave)) # adaptive Simpson
# [1] 2.170449 # 2.5 sec
quadgk(fx.spline,min(data$wave),max(data$wave)) # adaptive Gauss-Kronrod
# [1] 2.170449 # 0.9 sec
quadl(fx.spline,min(data$wave),max(data$wave)) # adaptive Lobatto
# [1] 2.170449 # 0.8 sec
请注意,这些是纯R脚本,因此比具有这种振荡功能的编译integrate
例程慢。