具有不同 x 值的两组 xy 点之间的区域

Area between two set of xy points with different x values

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

这是一个例子:

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 函数找到这个阴影区域: 所以基本上我想计算由两条轨迹的 internal/nearest start/end 点界定的两条轨迹之间的面积(如第一张图所示)。我可以确定边界,但找不到将它们包含在 CreateMap 函数中的方法。

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

任何 suggestions/hints 代码或函数(如果可能)将不胜感激

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

我会将你的第二个函数一分为二,因为在 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——返回相同的结果(我希望)。