和线长的图中计算出质心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站点查找设备位置的软件位置,因为接入点或基站的数量可能会发生变化,我需要一种可以适应不确定数量的点的算法。
这里和这里也存在一些类似的问题,但是它们都不能完全回答我的问题。
#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.直到达到所需的精度已达到
评论
您使用什么语言?通常是PHP,一点点JavaScript。我想我以前不得不提过这一点,但我是一名Web开发人员,要了解Whuber的回答,我必须找到一名数学家。
半径是从相对信号强度得出的吗?
是!半径实际上是dBm
@Reddox,部分-我设法在服务器端使用mathematica使用php_exec()进行了计算。