【问题标题】:Area between two set of xy points with different x values具有不同 x 值的两组 xy 点之间的区域
【发布时间】:2019-02-23 00:56:00
【问题描述】:

我真的很难以具有不同 x 值和每个轨迹的不同点数的 xy 点集的形式找到两条车辆轨迹之间的总面积(无论是正的还是负的)。我已经尝试过内置的集成功能;我尝试使用 (x1,y2-y1) 的内置近似函数并取绝对值然后对其进行积分,但这不可能,因为在我的情况下 y1 和 y2 的长度不同并且 x 值不一样对于每个轨迹(我有 x1 和 x2)!我还在“MESS”和“DescTools”等不同的包中尝试了AUC(曲线下面积)函数(AUC(x1,abs(y2-y1))),以找到该区域,但由于同样的原因再次不适用于我的情况(不同的向量长度和不同的 x 值)。最后,我在pathmapping 包中发现了一个名为“CreateMap”的函数,它非常棒,可以计算两条轨迹之间的总面积,但只有一个问题是我无法定义我想计算的 x 范围范围内(它计算下面第二张图所示的面积,而我想计算第一张图所示的面积),所以我在这个函数中看不到任何允许您确定 x-range 或 from哪个点你想计算哪个点的面积。

这是一个例子:

library("pathmapping")
x1<-c(1,3,5,9,13,14,16,18,23)
y1<-c(8,8,10,10,6,7,4,5,5)
x2<-c(3,6,7,11,11,15,18)
y2<-c(7.5,7.5,11,11,4.5,4.5,10)
path1<-cbind(x1,y1)
path2<-cbind(x2,y2)
CreateMap(path1,path2,F)

下图显示了所需的阴影区域: 我可以使用 CreateMap 函数找到这个阴影区域: 所以基本上我想计算由两条轨迹的内部/最近起点/终点界定的两条轨迹之间的面积(如第一个图所示)。我可以确定边界,但找不到将它们包含在 CreateMap 函数中的方法。

综上所述,我需要计算上图第一个阴影的面积,我有两种情况: 1. 在 MESS 和 DescTools 包中内置了积分函数和 AUC 函数,我根本无法计算面积,因为我有不同的轨迹长度(在上面的例子中,第一个有 9 个点,而第二个有 7 个点)和每个轨迹的不同 x 值(path1 有 x1,path2 有 x2),尽管可以包括 x 范围或边界在提到的功能。 2. 路径映射包中的 CreateMap 函数可以完美地计算区域(在图 2 中),但无法确定或包含函数中的边界,因为我想仅计算最近的一对轨迹开始/结束之间的轨迹之间的区域点(如图1)

任何有关代码或功能的建议/提示(如果可能)将不胜感激

【问题讨论】:

  • 我想你必须找出断点的位置(线相交的地方)并分别整合每个区域,这样你才能正确地做差异
  • 我同意你的看法。除非有办法检测交叉点并自动整合每个部分,否则我有大量轨迹并手动或视觉执行此操作将永远持续
  • 是的,我只是建议一种方法,因为您的问题需要做很多工作并且不清楚您尝试了什么(“无济于事”不是很清楚)。如果找到交叉点是问题,请具体发布,如果断点之间的集成是问题,请具体发布。
  • 感谢您的建议。我编辑了原始帖子,包括我尝试过的内容以及我在各个方面面临的问题。我希望现在更清楚了。

标签: r area


【解决方案1】:

您的函数是分段线性的,因此可以通过线性插值定义函数并通过应用已知的积分过程来计算面积。

我会将您的第二个函数一分为二,因为在 x = 11 它有两个不同的值(这对于函数来说是不可能的)。

x1<-c(1,3,5,9,13,14,16,18,23)
y1<-c(8,8,10,10,6,7,4,5,5)
x2<-c(3,6,7,11)
y2<-c(7.5,7.5,11,11)
x3<-c(11,15,18)
y3<-c(4.5,4.5,10)

f1 <- approxfun(x1, y1, method = "linear", 1, 23)
f2 <- approxfun(x2, y2, method = "linear", 3, 11)
f3 <- approxfun(x3, y3, method = "linear", 11, 18)

现在我们将f1-f2从3到11和f1-f3从11到18积分,然后将这两个整数值相加。

I1 <- integrate(function(x) f1(x) - f2(x), 3, 11)$value
I2 <- integrate(function(x) f1(x) - f3(x), 11, 18)$value
I1 + I2
## [1] 1

如果你想避免拆分函数,下面的方法也可以。

x1<-c(1,3,5,9,13,14,16,18,23)
y1<-c(8,8,10,10,6,7,4,5,5)
x2<-c(3,6,7,11-1e-15, 11+1e-15, 15, 18)
y2<-c(7.5,7.5,11,11,4.5,4.5,10)

f1 <- approxfun(x1, y1, method = "linear", 1, 23)
f2 <- approxfun(x2, y2, method = "linear", 3, 18)

integrate(function(x) f1(x)-f2(x), 3, 18)
## 1.000001 with absolute error < 3.3e-05

要查找f1 等于f2 的所有点,请使用pracma 包中的findzeros()

pracma::findzeros(function(x) f1(x)-f2(x), 3, 18)
[1]  6.714286 10.999927 15.300000

我们现在可以将 3 到 6.7、6.7 到 11、11 到 15.3 以及 15.3 到 18 的积分相加——返回相同的结果(我希望如此)。

【讨论】:

  • 谢谢汉斯,该区域的真正答案应该是 29.5,因为我想要总面积而不是净面积 (1)。以这种方式划分积分区间(3 到 6.7、6.7 到 11、11 到 15.3 和 15.3 到 18)返回准确的真实答案。但是,通过首先定义交叉点然后在它们之间进行集成来编写代码来为所有行程(375,000)执行此操作确实很困难。相反,我发现在两个函数的减法之前添加绝对函数会直接给出正确答案!积分(函数(x)abs(f1(x)-f2(x)),3,18)。谢谢你:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-11-11
  • 1970-01-01
  • 1970-01-01
  • 2022-01-13
  • 1970-01-01
  • 1970-01-01
  • 2020-07-12
相关资源
最近更新 更多