计算两条曲线之间的面积

6

我希望能够计算蓝线和灰色对角线之间的面积。

enter image description here

我可以计算出蓝线下方的面积为:

library(zoo)    
id <- order(x)
AUC <- sum(diff(x[id])*rollmean(y[id],2))

感谢在R中计算曲线下面积

有没有想法如何找到蓝线和灰线之间的区域?

提前致谢 EC


1
我在这里缺少一些东西:你错过了链接中的解释吗?如果你的blue[j]和gray[j]是数据,只需计算sum(blue[j]-gray[j])(不是真正的R代码),并根据值之间的距离(您的diff(x[id]))进行调整。如果blue[j]是数据而gray是一个函数,只需在blue中的x值上计算gray。 - Carl Witthoft
灰色线是对角线。因此,应该是这样的: z<-abs(y-x); id <- order(x); AUC<- sum(diff(x[id])*rollmean(z[id],2)) ; - ECII
你需要在思考一秒钟后指示,当蓝线在灰线上方和下方时,是否希望区域被正面计算。 - Nick Sabbe
无论哪一侧(灰线上方或下方),两者都应被视为正值。本质上,我需要灰色线和蓝色线之间的区域。灰色线始终为对角线(截距=0,斜率=1)。 - ECII
3个回答

4
曲线之间的面积是模量(蓝线下的面积-灰线下的面积) 蓝线下的面积是1/2(b-a)(f(b)-f(a)),其中a和b是X轴的限制,f(a)和f(b)是Y轴的限制。 使用Simpson's Rule可以找到灰线下的区域。 请参见http://en.wikipedia.org/wiki/Simpson%27s_rule 他们提供了规则以及实现+精度,前提是您有xs和ys的数组。
希望对您有所帮助, Saurabh

2
辛普森或梯形法则对于一条直线来说有些过头了 :-). - Carl Witthoft
我说过那些可以用于蓝线而不是灰线。灰线的面积可以直接通过1/2(b-a)(f(b)-f(a))找到。 - Saurabh Ghorpade
1
看起来OP希望所有表面差异都被计算为正数(请参见他自己评论中的绝对值)。如果是这样,你的第一个语句就不起作用了。 - Nick Sabbe

2

我偶然发现了这个解决方案,它似乎是另一个可能的解决方案,所以我会将其添加:

library(geiger)
geiger:::.area.between.curves(x, f1, f2)
# x is the vector of x-axis values
# f1 the y-axis values for the first line
# f2 the y-axis values for the second line

1

只是为了确保有一个可接受的答案,但主要是总结其他人的建议:

从“数学上”来看,您想要的是曲线abs(blue - grey)下的面积。

这些值(即绝对差异)很容易获取,一旦您有了它们,就可以使用任何类似于积分的方法(例如辛普森法则或您链接的文章中建议的方法)来获得表面。

作为替代方案,并且有点像@Saurabh建议的那样,您可以利用蓝色线是阶梯函数(或者不是吗?)而另一条线是直线的事实。为此,您将所有蓝线和灰线交叉或出现新值(进行“步骤”)的x值相加。按此方式划分区域将仅导致三角形和梯形,您可以在将它们全部加起来之前简单地取绝对值。

即使蓝线不是简单的阶梯函数,而是由直线组成,这也应该起作用,尽管现在您必须考虑一些额外的情况...


我认为我已经使用Simpson's Rule库(Bolstad2)得到了它;z<-abs(y-x); AUC<-sintegral(x,z)$int; - ECII

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接