4

我正在尝试确定点 p 的 (x,y,z) 坐标。我所拥有的是与已知坐标的 4 个不同点 m1、m2、m3、m4 的距离。

详细说明:我所拥有的是 4 个点(m1,m2,m3,m4)的坐标,它们不在同一个平面上:

m1: (x1,y1,z1),

m2: (x2,y2,z2),

m3: (x3,y3,z3),

m4: (x4,y4,z4)

欧几里得距离形式为 m1->p, m2->p, m3->p 和 m4->p

D1 = sqrt( (x-x1)^2 + (y-y1)^2 + (z-z1)^2);

D2 = sqrt( (x-x2)^2 + (y-y2)^2 + (z-z2)^2);

D3 = sqrt( (x-x3)^2 + (y-y3)^2 + (z-z3)^2);

D4 = sqrt( (x-x4)^2 + (y-y4)^2 + (z-z4)^2);

我正在寻找(x,y,z)。我试图用matlab fsolve通过欧几里德距离来解决这个由4个方程和3个未知数组成的非线性系统,但没有成功。

有两个问题:

  1. 如何找到点 p 的未知坐标:(x,y,z)
  2. 为了找到(x,y,z),我需要的具有已知坐标和到 p 距离的点 m 的最小数量是多少?

编辑:

这是一段没有给出解决方案的代码:

可以说我的观点是:

m1 = [ 370; 1810;  863];

m2 = [1586;  185; 1580];

m3 = [1284; 1948;  348];

m4 = [1732; 1674; 1974];

x = cat(2,m1,m2,m3,m4)';

每个点到 p 的距离为

d = [1387.5; 1532.5; 1104.7; 0855.6]

据我了解,如果我想运行 fsolve,我必须使用以下内容: 1. 创建一个函数 2. 调用 fsolve

function F = calculateED(p)

m1 = [ 370; 1810;  863];

m2 = [1586;  185; 1580];

m3 = [1284; 1948;  348];

m4 = [1732; 1674; 1974];

x = cat(2,m1,m2,m3,m4)';

d = [1387.5; 1532.5; 1104.7; 0855.6]

F = [d(1,1)^2 - (p(1)-x(1,1))^2 - (p(2)-x(1,2))^2 - (p(3)-x(1,3))^2;
 d(2,1)^2 - (p(1)-x(2,1))^2 - (p(2)-x(2,2))^2 - (p(3)-x(2,3))^2;
 d(3,1)^2 - (p(1)-x(3,1))^2 - (p(2)-x(3,2))^2 - (p(3)-x(3,3))^2;
 d(4,1)^2 - (p(1)-x(4,1))^2 - (p(2)-x(4,2))^2 - (p(3)-x(4,3))^2;];

然后调用 fsolve:

p0 = [1500,1500,1189];  % initial guess
options = optimset('Algorithm',{'levenberg-marquardt',.001},'Display','iter','TolX',1e-1);                     
[p,Fval,exitflag] = fsolve(@calculateED,p0,options);

我正在运行 Matlab 2011b。

我错过了什么吗?

最小二乘解决方案如何?

这里需要注意的是,m1、m2、m3、m4 和 d 值可能无法准确给出,但对于不应该成为问题的分析解决方案。

4

3 回答 3

2

mathematica 很容易用数值方法解决三点问题:

p = Table[ RandomReal[{-1, 1}, {3}], {3}]
r = RandomReal[{1, 2}, {3}]
Reduce[Simplify[ Table[Norm[{x, y, z} - p[[i]]] == r[[i]] , {i, 3}], 
      Assumptions -> {Element[x | y | z, Reals]}], {x, y, z}, Reals]

这通常会返回false,因为随机球体通常不会有三重交点。

当你有一个解决方案时,你通常会有一对这样的..

      (*   (x == -0.218969 && y == -0.760452 &&  z == -0.136958) ||
           (x == 0.725312 && y == 0.466006 &&   z == -0.290347)  *)

这有点令人惊讶地有一个失败的优雅的分析解决方案。它有点涉及所以我会等着看是否有人有它方便,如果没有并且有兴趣我会尝试记住这些步骤..

编辑,遵循 Dmitys 最小二乘建议的近似解决方案:

p = {{370, 1810, 863}, {1586, 185, 1580}, {1284, 1948, 348}, {1732, 
1674, 1974}};
r = {1387.5, 1532.5, 1104.7, 0855.6};
solution = {x, y, z} /. 
              Last@FindMinimum[ 
                     Sum[(Norm[{x, y, z} - p[[i]]] - r[[i]] )^2, {i, 1, 4}] , {x, y, z}]
Table[ Norm[ solution - p[[i]]], {i, 4}]

如您所见,您与确切相差甚远..

(* solution point {1761.3, 1624.18, 1178.65} *)
(* solution radii: {1438.71, 1504.34, 1011.26, 797.446} *)
于 2013-10-08T18:39:06.020 回答
1

我会回答第二个问题。让我们将未知点命名为 X。如果您只知道 A 点并且知道 X 到 A 的距离,那么 X 可以在一个以 A 为中心的球体上。

如果您有两个点 A,B,则 X 在一个圆上,该圆由球体与 A 和 B 的中心的交点给出(如果它们相交)。

第三个点将添加另一个球体,三个球体之间的最终交点将给出两个点。

第四点将最终决定您要查找的这两点中的哪一个。

这就是 GPS 的实际工作方式。您必须至少拥有三颗卫星。然后 GPS 会猜测这两个点中的哪一个是正确的,因为另一个在太空中,但它无法告诉你高度。从技术上讲它应该,但也有错误,所以你“看到”的卫星越多,错误就越少。

发现这个问题可能是一个起点。

于 2013-10-08T18:19:25.600 回答
0

取前三个方程并在 MATLAB 中求解 i 的 3 个方程和 3 个变量。求解方程后,您将得到两对值,或者我们可以说 p 的两组坐标。将每个集合保留在第 4 个方程式中,您可以找出满足方程式的集合就是答案

于 2013-10-08T19:14:05.997 回答