我正在研究python中的一个函数,它使用GPS坐标来计算距离,使用Vincenty的公式。第一步是迭代一组方程直到使用while循环收敛。 “lam”是我输出的变量并反馈到while循环中。 while循环第一次运行,然后每次迭代后的输出与第一次完全相同的输出。循环每次都使用lam的初始值。它应该采用lam输出并将其用作新输入,对吗?
import math
location=[-83.55176667, -83.548975, 40.30421944, 49.30228889]
def distance(points):
""" points is a list containing 2 latitude/longitude points
in this order: [lon1, lon2, lat1, lat2]. This function determines
distance between those 2 points."""
L1, L2, theta1, theta2=points[0],points[1],points[2],points[3]
f=1/298.257223563
L=L2-L1
lam=L
outs=[]
U1=math.atan((1-f)*math.tan(theta1))
U2=math.atan((1-f)*math.tan(theta2))
while lam > .001:
sin_sigma=((math.cos(U2)*math.sin(lam))**2+
(math.cos(U1)*math.sin(U2)-
math.sin(U1)*math.cos(U2)*math.cos(lam))**2)**0.5
cos_sigma=math.sin(U1)*math.sin(U2)+math.cos(U1)*
math.cos(U2)*math.cos(lam)
sigma=math.atan2(sin_sigma,cos_sigma)
sin_alpha=(math.cos(U1)*math.cos(U2)*math.sin(lam))/sin_sigma
cos2_alpha=1-(sin_alpha)**2
cos2sigm=cos_sigma-((2*math.sin(U1)*math.sin(U2))/cos2_alpha)
C=(f/16)*cos2_alpha*(4+f*(4-3*cos2_alpha))
lam=L+(1-C)*f*sin_alpha*(sigma+C*sin_sigma*
(cos2sigm+C*cos_sigma*(-1+2*(cos2sigm)**2)))
outs.append(lam)
print(lam)
print('')
return outs
outs=distance(location)
答案 0 :(得分:2)
实际上, 使用lam
的新值。您可以在循环的开头和结尾打印id(lam)
来检查自己。
问题在于,由于某种原因,您的函数正在稳定值lam=0.0027964244626017456
,因此您的循环永远不会退出。
在SO问题中调试算法太多了,但是请尝试查找算法并检查是否在某个地方输入了错字。
答案 1 :(得分:1)
正如Erik写的那样, 确实每次都在循环中使用你新计算的lam(bda)值。重新计算后该值(几乎)为相同值的事实正好“收敛于某个值”的含义。
所以你正在做你想要的,这是(在这种情况下非常迅速)“迭代一组方程直到收敛”。但是你的检查不应该是lambda达到接近零的值,但是当lambda中的 change 达到接近零时你应该停止循环。或者更确切地说,λ的变化幅度。
另外两点:
math.radians
。math.atan2
的确切定义。你可能会发现你的参数已经颠倒了。