【问题标题】:Solving non linear equations related to distance求解与距离有关的非线性方程
【发布时间】:2025-12-17 03:45:02
【问题描述】:

我想在 matlab 中求解一组非线性方程。我的意思是说我有两个由 (lat1,lon1) 和 (lat2,lon2) 定义的点。现在我想找到一个点 lat3,lon3 使其与这两个点相距 20 公里。它是由以(lat1,lon1)和(lat2,lon2)点为中心绘制的半径为20km的圆的交点给出的。

但是,我对如何求解这个方程有点困惑。

我有计算matlab中两点距离的功能

function [ distance ] = calculateDistance( latitude1,longitude1,latitude2,longitude2 )
radius = 6371;
dLat = degtorad(latitude2-latitude1);
dLon = degtorad(longitude2-longitude1);
a = sin(dLat/2) * sin(dLat/2) + cos(degtorad(latitude1)) * cos(degtorad(latitude2)) * sin(dLon/2) * sin(dLon/2);
c = 2 * atan2(sqrt(a), sqrt(1-a));
distance = radius * c;
end

我正在尝试使用 matlab 的求解功能 http://www.mathworks.com/help/toolbox/symbolic/solve.html

但是当我定义

syms lat3 lon3

并尝试将方程传递给求解函数,它会引发错误 atan2 only accepts arguments of type sym。 我该怎么办?

【问题讨论】:

    标签: matlab geometry distance


    【解决方案1】:

    如果您只需要解决该特定问题,则不需要 Matlab 的任何方程求解函数。你可以简单地使用毕达哥拉斯的公式:

    如果你的点是 (0,0) 和 (1,0) 并且半径是 x,那么距离 (0,0) 和 (1,0) 都为 x 的两个点是

    (0.5, sqrt (x^2 - 0.25) ) 和 (0.5, - sqrt (x^2 - 0.25))。

    现在如果你的点是 (a,b) 和 (c,d),那么这两个点的距离是

    dist = sqrt ( (c-a)^2 + (d-b)^2 )。

    好的,现在我们采用一个坐标系,原点为 (a,b),单位为 dist,横轴经过 (c,d)。在这个坐标系中,有问题的点是

    (0.5, +/- sqrt ( (r/dist)^2 - 0.25 ) )。

    现在,要得到原始坐标系,我们必须乘以 dist,得到

    (0.5 * dist, +/- sqrt (r^2 - 0.25 * dist^2)),

    然后随矩阵旋转(dist, 0)到(c-a, d-b),即

    cos alpha   -sin alpha
    sin alpha   cos alpha
    

    其中 alpha = arccos ( (d-b) / dist),即矩阵

    (d-b) / dist   -(c-a) / dist
    (c-a) / dist    (d-b) / dist
    

    给了

    (0.5 (d-b) -/+ (c-a) sqrt (r^2 / dist^2 - 0.25), 0.5 (c-a) +/- (d-b) sqrt (r^2 / dist^2 - 0.25)

    最后加上(a,b),得到

    (a + 0.5 (d-b) -/+ (c-a) sqrt (r^2 /dist^2 - 0.25), b + 0.5 (c-a) +/- (d-b) sqrt (r^2 /dist^2 - 0.25) )

    这些是您正在寻找的点。可能我在某个地方犯了错误,但我希望方向应该很清楚。

    【讨论】: