首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有不同x值的两组xy点之间的面积

具有不同x值的两组xy点之间的面积
EN

Stack Overflow用户
提问于 2018-09-18 23:26:51
回答 1查看 270关注 0票数 3

我真的在努力找出两个车辆轨迹之间的总面积(无论是正的还是负的),以不同x值的xy点集的形式,以及每条轨迹的不同点数。我尝试过内置的积分函数;我尝试使用内置的逼近函数( x1,y2-y1)并取绝对值,然后进行积分,但这是不可能的,因为在我的情况下,y1和y2的长度是不同的,并且x值对于每个轨迹都不一样(我有x1和x2)!我还尝试了AUC (x1,abs(y2-y1)在不同的包,如“乱七八糟”和"DescTools“找到这个区域的工作,但不适用于我的情况再次出于同样的原因(不同的向量长度和不同的x值)。最后,我在路径映射包中找到了一个叫做“路径映射”的函数,它非常棒,它计算出两个轨迹之间的总面积,但是只有一个问题,就是我不能定义我想要计算的x-范围(它计算了下面第二个图中显示的面积,而我想计算第一个图中显示的面积),所以在这个函数中我看不到任何参数,可以确定x-范围,或者从哪个点来计算区域。

下面是一个示例:

代码语言:javascript
复制
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所示)。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-20 21:41:16

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

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

代码语言:javascript
复制
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集成,然后将这两个积分值相加。

代码语言:javascript
复制
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

如果要避免拆分函数,也可以采用以下方法。

代码语言:javascript
复制
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

若要查找f1f2相等的所有点,请从实践包中使用findzeros()

代码语言:javascript
复制
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 --返回同样的结果(我希望)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52395873

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档