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

标签 r function

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

我正在尝试集成一个从数据集计算出来的函数。
数据可以在这里找到:Link to sample.txt .

我首先将一条线拟合到我的数据中。这可以通过 approxfun 线性完成或非线性 splinefun .在下面的示例中,我使用后者。
现在,当我尝试集成拟合函数时,我遇到了错误

  • maximum number of subdivisions reached

  • 但是当我增加分割时,我得到
  • roundoff error

  • 从我的示例代码中的值可以看出,对于这个特定数据集,阈值是 754->755。

    我的同事在Matlab中集成这个数据集没有问题。有没有办法操纵我的数据进行集成? R中是否有另一种数值积分方法?

    enter image description here
    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”或使用“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 慢。具有这种振荡功能的例行程序。

    关于R:积分:达到最大分割数,舍入误差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10452945/

    相关文章:

    r - 从 `zoo` 到 `xts` 的转换会在索引中创建大量 NA

    r - knitr中的非英文特殊字符

    function - 用 ocaml 构建计算器,不知道如何制作 sigma 函数

    javascript - 调出相机功能手机网站

    php - AJAX PHP 连接将行插入数据库

    r - 优化 R 中的多元函数

    r - R中的矩阵乘法和加法

    r - ggplot2 包含位图的自定义注释,具有反转的 y 比例

    javascript - 如果我的函数位于 document.ready 函数内部,为什么它不会被调用?

    python - "Return"in Function only Returning Value