n个点的三边测量算法


27

我需要找到的算法,可以计算出重心(又名重心,几何中心,质量中心)从图中圆圈其中T1,T2,T3,T4,T5,...,Tn的交叉并线的长度[R从质心到该图的最远角

给出以下信息:

  • T1纬度= 56.999883经度= 24.144473半径= 943
  • T2纬度= 57.005352经度= 24.151168半径= 857
  • T3纬度= 57.005352经度= 24.163356半径= 714
  • T4纬度= 56.999042经度= 24.168506半径= 714
  • T5纬度= 56.994226经度= 24.15709半径= 771

结果应如下所示:纬度= XX.XXXXXXX经度= XX.XXXXXXX半径= XX

在此处输入图片说明

您可能已经知道,我正在开发可以通过最近的Wifi接入点或移动基站查找设备位置的软件,因为接入点或基站的数量可能会发生变化,我需要一种能够适应不确定数量的点的算法。

这里这里也有一些类似的问题,但是它们都不能完全回答我的问题。


您正在使用哪种语言?
WolfOdrade 2012年

通常是PHP,一点点JavaScript。我想我以前不得不提过这一点,但是我是一名Web开发人员,要了解Whuber的回答,我必须找到一名数学家。
卡利斯·鲍玛尼斯

半径是从相对信号强度得出的吗?
Kirk Kuykendall,2012年

是! 其实半径都以dBm
卡尔·巴马尼斯

1
@Reddox,部分-我设法在服务器端使用mathematica使用php_exec()进行了计算。
卡尔·巴马尼斯

Answers:


29

半径测量值肯定会出现误差。我希望误差量与半径本身成正比。让我们假设测量在其他方面是无偏的。合理的解决方案然后使用加权非线性最小二乘拟合,权重与平方半径成反比。

这是在现有标准的东西(除其他事项外)的Python, R数学,许多功能齐全的统计软件包,所以我只是说明它。以下是通过测量到设备位置周围五个随机访问点的距离(相对误差为10%)获得的一些数据:

数据表

Mathematica只需要一行代码,而没有可测量的CPU时间来计算拟合度:

fit = NonlinearModelFit[data, Norm[{x, y} - {x0, y0}], {x0, y0}, {x, y}, Weights -> 1/observations^2]

编辑 -

对于大半径,仅通过用Norm[{x, y} - {x0, y0}]计算球形或椭圆形距离的函数替换欧几里得距离,就可以找到更准确的(球形或椭圆形)解。在Mathematica中例如,可以通过

fit = NonlinearModelFit[data, GeoDistance[{x, y}, {x0, y0}], {x0, y0}, {x, y}, 
        Weights -> 1/observations^2]

-编辑结束

使用这样的统计技术的一个优势是,它可以为参数(即设备的坐标)生成置信区间,甚至可以为设备位置生成同时置信椭圆。

ellipsoid = fit["ParameterConfidenceRegion", ConfidenceLevel -> 0.95];
fit["ParameterConfidenceIntervalTable", ConfidenceLevel -> 0.95]

置信区间表

绘制数据和解决方案很有帮助:

Graphics[{Opacity[0.2], EdgeForm[Opacity[0.75]], White, Disk[Most[#], Last[#]] & /@ data, 
  Opacity[1], Red, ellipsoid, 
  PointSize[0.0125], Blue, Point[source], Red, Point[solution],
  PointSize[0.0083], White, Point @ points}, 
  Background -> Black, ImageSize -> 600]

地图

  • 白点是(已知的)接入点位置。

  • 大蓝点是真实的设备位置。

  • 灰色圆圈代表测得的半径。理想情况下,它们都将在真实的设备位置处相交-但显然由于测量误差它们不会相交。

  • 大红点是估计的设备位置。

  • 红色椭圆形划出了设备位置的95%置信区域。

在这种情况下,椭圆的形状是令人感兴趣的:沿NW-SE线的位置不确定性最大。在这里,到三个接入点(到NE和SW)的距离几乎没有变化,并且在到另外两个接入点(到北和东南)的距离之间要权衡误差。

(在某些系统中,可以作为似然函数的轮廓获得更准确的置信区域;此椭圆只是对该轮廓的二阶近似。)

如果无误差地测量半径,则所有圆将至少具有一个相互相交的点,并且-如果该点是唯一的,则它将是唯一的解决方案。

此方法适用于两个或多个访问点。需要三个或更多来获取置信区间。当只有两个可用时,它将找到一个相交点(如果存在);否则,它将找到一个相交点。否则,它将在两个访问点之间选择一个合适的位置。


3
做得好比尔!

1
@Reddox原则上是:任何图灵完备的语言都可以进行任何计算。但是PHP会成为任何人选择目标语言的方式。甚至PHP手册也承认了这一点:“ PHP可能不是用图形用户界面创建桌面应用程序的最佳语言,但是如果您非常了解PHP,并且希望在客户端使用一些高级PHP功能,应用程序,您还可以使用PHP-GTK编写此类程序。”
Whuber

1
@Reddox谢谢您的链接。我看到了它如何提供几何计算。在这种情况下,实际上并不需要这些:唯一的这种计算是毕达哥拉斯定理的应用,以获取距离作为平方根的和(Norm在我的代码中称为)。所有工作都涉及加权非线性最小二乘拟合,但是我不认为GEOS库提供了这种功能。当需要精确的椭圆距离时,GEOS可能会有所帮助。
Whuber

2
如果我正确阅读了@BenR,看来您是在按平方半径的比例而不是它们成反比地对数据加权。当你发生什么除以通过square(data[2])由它乘以呢?
ub


1

在这种情况下,每个圆都与所有其他圆相交,因此我们可以这样确定交点:

首先确定所有n *(n-1)个交点。调用设置这些交叉点的。取得包含最内点的点T的列表。然后,对于每个点p,是否p是每一个圆内。如果p在每个圆内,则此点为最内点的交点。将这样的点添加到列表T中

现在您有了所需的交点坐标。我可以想到至少两种方法来预测位置:

  1. 只需计算由T形成的多边形的质心(使用距离作为权重?),质心就是所需的位置。
  2. 计算包含T的每个点的最小圆。然后,该圆的中心就是所需的位置。之后,计算R应该很简单。

另一个注意事项:首先使用自由空间路径模型(或变体)将信号强度转换为距离。我的看法是:您拥有任何训练数据集,您应该尝试使用某种学习技术而不是使用n = 2或n = 2.2作为固定值来查找路径损耗指数。


T ...“最内点”是什么-如果我有5个节点,那么我应该检查多少个“最内点”?
ewizard
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.