我需要找到一种算法,该算法可以从圆T1,T2,T3,T4,T5,..,Tn相交
和线长的图中计算出质心A(又名重心,几何中心,质心)从质心到所提到图形的最远角的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接入点或Mobile Base站点查找设备位置的软件位置,因为接入点或基站的数量可能会发生变化,我需要一种可以适应不确定数量的点的算法。

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

评论

您使用什么语言?

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

半径是从相对信号强度得出的吗?

是!半径实际上是dBm

@Reddox,部分-我设法在服务器端使用mathematica使用php_exec()进行了计算。

#1 楼

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

这是Python中的标准配置,其中包括qq1202079q,Mathematica和许多功能齐全的统计数据包,因此我将仅作说明。以下是通过测量与设备位置周围的五个随机访问点之间的距离(相对误差为10%)获得的一些数据:



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

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


编辑-

对于大半径,更准确(球形或椭圆形)仅通过用计算球形或椭圆形距离的函数替换欧几里德距离R即可找到解。在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)的距离几乎不变,并且在到另外两个接入点(到北和东南)的距离之间要权衡误差。

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

错误,所有圆都将至少有一个相互相交的点,并且-如果该点是唯一的-这将是唯一的解决方案。

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

评论


做得好比尔!

–user681
2012年11月8日在20:51

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

– hu
13-10-29在13:35

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

– hu
13年11月13日14:25



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

– hu
2014年2月12日在17:08

让我们继续聊天中的讨论

– hu
2014年2月12日在17:20

#2 楼

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

首先确定所有n *(n-1)个交点。将这些交点的集合称为I。获取包含最内点的点T的列表。然后针对I中的每个点p,检查p是否在每个圆内。如果p在每个圆内,则此点为最内点的交点。将这样的点添加到列表T。

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


只计算T形成的多边形的质心(使用距离作为权重?),质心就是所需的位置。 br />计算包含T的每个点的最小圆。然后以该圆的中心为所需位置。
此后,应简单地计算R。

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

评论


T ...“最内点”是什么-如果我有5个节点,那么我应该检查多少个“最内点”?

–怪兽
18-3-3的2:42

#3 楼

我只是尝试了以下算法来实现3D距离(因此,它对于2D距离也应该适用)。它不是一个精确的模型,而是一个迭代模型,仅经过10次迭代即可非常接近真实答案。
我还没有针对确切的方法测试其性能,据我所知,其性能可能不如此类解决方案。我以为还是可以共享它。
算法如下:

进行初始猜测Q等于所有圆心的平均值Cn

在每个圆心Cn和圆半径Rn处,找到遵循以下公式的增量矢量ΔQn:


ΔQn= normalize(Cn-Q)*(幅值(Cn-Q)-Rn)



将ΔQn中所有向量的平均值加到Q


重复步骤2和3.直到达到所需的精度已达到