Python 不断缩放3个圆,直到它们相交
我已经在Python中实现了定位算法,到目前为止,由于计算的距离受到信号干扰的影响,结果看起来很不理想,因此它看起来如下所示:Python 不断缩放3个圆,直到它们相交,python,geolocation,geometry,trilateration,Python,Geolocation,Geometry,Trilateration,我已经在Python中实现了定位算法,到目前为止,由于计算的距离受到信号干扰的影响,结果看起来很不理想,因此它看起来如下所示: def find_best_scaling_constant(p1, p2, p3, r1, r2, r3): # some magic here return scalingConstant find_best_scaling_constant((0.00, 0.00), (3.15, -0.47), (4.90, 7.00), 1.12, 1.77, 0.
def find_best_scaling_constant(p1, p2, p3, r1, r2, r3):
# some magic here
return scalingConstant
find_best_scaling_constant((0.00, 0.00), (3.15, -0.47), (4.90, 7.00), 1.12, 1.77, 0.18)
当它看起来像这样时:
def find_best_scaling_constant(p1, p2, p3, r1, r2, r3):
# some magic here
return scalingConstant
find_best_scaling_constant((0.00, 0.00), (3.15, -0.47), (4.90, 7.00), 1.12, 1.77, 0.18)
所以我想用一个常数因子同时缩放这些圆,直到它们在一个点上相交(这将是最佳的),或者直到它们的相互距离之和最小。给定2D空间中三个圆的XY坐标,以及它们与参考点(其中一个圆的中心)的计算距离,函数应返回使误差最小化的最佳比例因子。应该是这样的:
def find_best_scaling_constant(p1, p2, p3, r1, r2, r3):
# some magic here
return scalingConstant
find_best_scaling_constant((0.00, 0.00), (3.15, -0.47), (4.90, 7.00), 1.12, 1.77, 0.18)
我不是数学家,所以我不知道这个逻辑是否合理,但如果有人有意见或更好的想法,请分享。这会有很大的帮助 让圆具有带坐标的中心: 让你计算出的相应半径为: 分别。因此,看起来您正在查找具有以下属性的点和比例因子: 等价地,我们需要在平面上找到一个点,这是三个圆的公共交点,通过用公因子k重新缩放原始圆的半径获得,或者用数学表示法,我们需要求解系统 很明显,上述系统和系统之前写入的属性是等效的 为了简化问题,将系统中每个方程的两边都平方: 根据毕达哥拉斯定理,写出 这就是为什么在显式公式中,上述三个平方方程组实际上是二次方程组: 将项从每个等式的右侧移动到左侧后,将变成: 展开每个方程中的所有平方差,并重新排列项: 为了简化这个系统,从第一个方程中减去第二个方程,然后从第二个方程中减去第三个方程,并保留其中一个二次方程,假设保留第一个二次方程: 找到该系统解决方案的想法如下: 为了简化符号和表达式,我们可以使用一些线性代数的符号。定义以下二乘二矩阵和二乘一列向量: 当我们将后一个矩阵方程乘以M的逆矩阵时: 让我们也用矩阵表示法来写 最后,在使用适当的比例因子进行比例调整后,找到三个圆交点的算法可以如下所示: 观察二次方程对于
z
有两个解。我选择的那个,带负号的,是第一个交点,只要这三个圆在每个圆的外部,并且具有初始的不相交半径。还有第二个交点,它对应于z
的加号解。如果你有来自第四座塔的信息,那么你将能够选择正确的点,甚至可能能够将问题完全线性化。但仅凭这些可用数据,您就有两种解决方案
我使用以下hand maid示例测试了该算法:
x1 = 0; y1 = 0; r1 = sqrt(13)/3;
x2 = 5; y2 = 1; r2 = sqrt(13)/3;
x3 = 3; y3 = 7; r3 = sqrt(17)/3;
它输出正确的位置
x = 2; y = 3;
比例因子k=3
我用Matlab/Octave实现它,因为我对那里的线性代数很熟悉:
function[xy,k]=位置(x1,y1,r1,x2,y2,r2,x3,y3,r3)
M=2*[x2-x1 y2-y1;
x3-x2y3-y2];
A=[r1^2-r2^2;
r2^2-r3^2];
B=[x2^2+y2^2-x1^2-y1^2;
x3^2+y3^2-x2^2-y2^2];
A=M\A;
B=M\B;
a=a'*a;
b=2*b'*A-2*[x1-y1]*A-r1^2;
c=[x1-y1]*[x1;y1]-2*[x1-y1]*B+B'*B;
k=(-b-sqrt(b^2-4*a*c))/(2*a);
xy=k*A+B;
k=sqrt(k);
终止
这种方法似乎很奇怪-您想拟合自己的光速值(基本常数)吗?可能您的半径值错误。这可能有助于您找到3个点(每个圆上一个点)之间的最近距离。@MBo半径值是根据接入点(圆的中心)检测到的信号强度计算的,由于障碍物和反射,该值不太准确。在第一张图像中,接收器实际上就在蓝色接入点的旁边,这就是它的半径如此之小的原因。但它也被其他两个接入点检测到,因此如果没有错误,它们应该相交。这就是为什么我考虑缩放它们,因为半径的比率相对正确。谢谢你的回答!你能解释一下你是如何得到二次方程中的术语r1^2
,r2^2
和r3^2
?我知道这些方程中的其余表达式是从毕达哥拉斯定理推导出来的距离。@SalmaFG我添加了一个编辑,并做了一些额外的解释。看一看,如果你问的是这个问题,请告诉我。术语r1^2,r2^2,r3^2
来自给定的三个圆的三个半径r1,r2,r3
,如果我正确理解了您发布的问题的假设。是的,这很有帮助,我将尽快测试它并让您知道!我正在实现你说的方程,但是当半径相同时,我遇到了一个问题。由于(rj^2-ri^2)
,我在DET
中得到一个0除法。你确定这个表达式吗?我试着用手去解方程组