R:积分:达到的最大细分数,舍入误差

Mar*_*n H 7 r function

我遇到了一个有趣但相当讨厌的问题.

我正在尝试集成从数据集计算的函数.可在此处找到数据:链接到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
Run Code Online (Sandbox Code Playgroud)

Han*_* W. 7

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
Run Code Online (Sandbox Code Playgroud)

请注意,这些是纯R脚本,因此比例如integrate具有这种振荡功能的编译例程慢.