【问题标题】:Computing integral of a line plot in R计算R中线图的积分
【发布时间】:2026-01-28 11:30:01
【问题描述】:

我在 R 中有两个长度相同的正值向量 x,y。使用 plot(x, y, "l",...),在我的有限向量中给出一个二维连续线图x 和 y。有没有办法在 R 中的这条线图的某个范围内计算定积分?

edit1:我研究了 R 中的积分函数。但是我不确定如何从两个向量中创建一个函数以传递给它,因为我的向量都是有限的。

edit2:对于更多背景,x 和 y 的长度 ~ 10,000。我编写了一个函数来查找我正在观察的数据中异常的周期 [xi, xj]。对于这些异常中的每一个,我都使用 plot 来查看我的数据的这些 sn-ps 中发生了什么。现在我需要计算有关这些异常时期积分值的统计数据,因此我试图获得尽可能准确的数字以与我的图表匹配。 X 是一个时间变量,我已经采取了非常好的时间间隔。

【问题讨论】:

    标签: r plot integral


    【解决方案1】:

    您可以使用integrate() 进行集成。要从向量 xy 创建函数,您需要在值之间进行插值。 approxfun() 正是这样做的。

    integrate 接受一个函数和两个边界。

    approxfun 采用两个向量 xy 就像你拥有的那样。

    所以我的解决方案是:

    integrate(approxfun(x,y), range(x)[1], range(x)[2])
    

    【讨论】:

    • 感谢您的回复。我在网上看到的,但不知道如何在 R 中用两个向量创建一个函数。需要详细说明吗?
    • 我不确定你想要什么。您想计算将x 的每个元素映射到y 的相应元素的函数的积分吗?
    • 正确。扭曲是,x 和 y 是有限的,例如 x = c(1, 3, 9, 7, 12, 15) 和 y = c(2, 17, 99, 21, 33, 16)。所以它们不会一起形成一个连续的函数。
    • 那么你的积分不就是y的和吗?
    • 我不这么认为。如果我有 x = c(1, 1.1, 1000) 和 y = c(0, 50, 50),我怀疑我在 plot 下由 R 创建的线的积分是 100?
    【解决方案2】:

    approxfun 函数将采用 2 个向量并返回一个函数,该函数给出点之间的线性插值。然后可以将其传递给像integrate 这样的函数。 splinefun 函数也会进行插值,但基于样条曲线而不是分段线性。

    在分段线性情况下,积分将只是梯形的总和,将梯形的面积(宽度、x 的差)相加可能会更快/更简单

    【讨论】:

    • 感谢您的回复。我会试试这个。 approxfun 使用的插值是否类似于 plot() 在后台使用的插值?只是想确保我的情节与使用 approxfun 的结果之间没有差异。
    • @mt88,两者都使用线性插值(如果 x 是有序的)并且它会给出相同的结果(非常接近,integrate 选择插值的位置并且可以切入一个角落,但差异会小)。
    【解决方案3】:

    我很晚才到这里。但对于未来的游客来说, 这是来自
    的建议的一些代码 Greg Snow 对分段线性函数的回答:

    line_integral <- function(x, y) {
    dx <- diff(x)
      end <- length(y)
      my <- (y[1:(end - 1)] + y[2:end]) / 2
      sum(dx *my)
    } 
    
    # example
    x <- c(0, 2, 3, 4, 5, 5, 6)
    y <- c(0, 0, 1,-2,-1, 0, 0)
    plot(x,y,"l")
    line_integral(x,y)
    

    【讨论】:

    • 您的解决方案原则上是正确的,但该示例有点不走运,因为您的向量 xy 没有定义函数:它对于 x = 5 没有明确定义。这意味着对于您的示例,使用approxfun 无法很好地近似该函数。 f &lt;- approxfun(x, y) 导致 f(5) = -0.5,这可能不是您想要的。
    • 我实际上是故意这样做的:mt88 试图获得分段线性图 (x,y) 的积分,无论它来自哪个函数。 (在这种情况下,它可能来自非连续函数……垂直部分除外)
    • 谢谢!这正是我想要的!