gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 02:50:38 24 4
gpt4 key购买 nike

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

这是一个例子:

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)

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

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

关于r - 具有不同 x 值的两组 xy 点之间的区域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52395873/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com