繁体   English   中英

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

[英]R: Integrate: Max number of subdivisions reached, roundoff error

我遇到了一个有趣但相当烦人的问题。

我正在尝试集成从数据集中计算出的函数。 可以在这里找到数据: 链接到sample.txt

我首先将一条线拟合到我的数据中。 这可以使用approxfun线性approxfun或使用splinefun非线性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

R中有很多集成例程,您可以通过'RSiteSearch'ing或使用'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例程要慢。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM