Python - Vincenty的逆公式不收敛(寻找地球上的点之间的距离)

时间:2014-12-31 02:49:07

标签: python math formula wiki

我试图按照wiki HERE

中所述实施Vincenty的反问题

问题是lambda根本就没有收敛。如果我尝试迭代公式序列,则值保持不变,我真的不确定原因。也许我只是盯着一个明显的问题。

应该注意的是,我是Python的新手并且还在学习这门语言,所以我不确定它是否滥用可能导致问题的语言,或者我是否在我执行的一些计算中有一些错误。我似乎无法在公式中发现任何错误。

基本上,我已经在代码中写了尽可能接近wiki文章的格式,结果是:

import math

# Length of radius at equator of the ellipsoid
a = 6378137.0

# Flattening of the ellipsoid
f = 1/298.257223563

# Length of radius at the poles of the ellipsoid
b = (1 - f) * a

# Latitude points
la1, la2 = 10, 60

# Longitude points
lo1, lo2 = 5, 150

# For the inverse problem, we calculate U1, U2 and L.
# We set the initial value of lamb = L
u1 = math.atan( (1 - f) * math.tan(la1) )
u2 = math.atan( (1 - f) * math.tan(la2) )
L = (lo2 - lo1) * 0.0174532925

lamb = L

while True:
    sinArc = math.sqrt( math.pow(math.cos(u2) * math.sin(lamb),2) + math.pow(math.cos(u1) * math.sin(u2) - math.sin(u1) * math.cos(u2) * math.cos(lamb),2) )
    cosArc = math.sin(u1) * math.sin(u2) + math.cos(u1) * math.cos(u2) * math.cos(lamb)
    arc = math.atan2(sinArc, cosArc)
    sinAzimuth = ( math.cos(u1) * math.cos(u2) * math.sin(lamb) ) // ( sinArc )
    cosAzimuthSqr = 1 - math.pow(sinAzimuth, 2)
    cosProduct = cosArc - ((2 * math.sin(u1) * math.sin(u2) ) // (cosAzimuthSqr))
    C = (f//16) * cosAzimuthSqr  * (4 + f * (4 - 3 * cosAzimuthSqr))
    lamb = L + (1 - C) * f * sinAzimuth * ( arc + C * sinArc * ( cosProduct + C * cosArc * (-1 + 2 * math.pow(cosProduct, 2))))
    print(lamb)

如上所述,问题在于价值" lamb" (lambda)不会变小。我甚至试图将我的代码与其他实现进行比较,但它们看起来差不多。

我在这里做错了什么? : - )

谢谢大家!

2 个答案:

答案 0 :(得分:4)

首先,你应该用弧度转换纬度(你已经为经度做了这个):

u1 = math.atan( (1 - f) * math.tan(math.radians(la1)) )
u2 = math.atan( (1 - f) * math.tan(math.radians(la2)) )
L = math.radians((lo2 - lo1)) # better than * 0.0174532925

执行此操作并删除//int分部)并将其替换为/float分部)后,lambda停止重复通过迭代获得相同的值并开始遵循此路径(基于您的示例坐标):

2.5325205864224847
2.5325167509030906
2.532516759118641
2.532516759101044
2.5325167591010813
2.5325167591010813
2.5325167591010813

正如您似乎期望10^(−12)的收敛精度,它似乎是重点。

您现在可以退出循环(lambda已融合)并继续前进,直到您计算出所需的测地距离s

注意:you can test your final value s here

答案 1 :(得分:3)

即使正确实施,Vincenty的算法也会失败 收敛一些点。 (Vincenty注意到了这个问题。) 我给出了一个保证的算法 收敛于Algorithms for geodesics;那是一个蟒蛇 可用的实施here。最后,你可以找到更多 有关维基百科页面问题的信息, Geodesics on an ellipsoid。 (谈话页面有例子 由NGS实施的Vincenty对点数, 没有收敛。)