Python - While循环不使用输出作为下一个循环的输入

时间:2018-03-09 14:47:53

标签: python while-loop

我正在研究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)

2 个答案:

答案 0 :(得分:2)

实际上, 使用lam的新值。您可以在循环的开头和结尾打印id(lam)来检查自己。

问题在于,由于某种原因,您的函数正在稳定值lam=0.0027964244626017456,因此您的循环永远不会退出。

在SO问题中调试算法太多了,但是请尝试查找算法并检查是否在某个地方输入了错字。

答案 1 :(得分:1)

正如Erik写的那样, 确实每次都在循环中使用你新计算的lam(bda)值。重新计算后该值(几乎)为相同值的事实正好“收敛于某个值”的含义。

所以你正在做你想要的,这是(在这种情况下非常迅速)“迭代一组方程直到收敛”。但是你的检查不应该是lambda达到接近零的值,但是当lambda中的 change 达到接近零时你应该停止循环。或者更确切地说,λ的变化幅度。

另外两点:

  • 使用弧度表示角度值,而不是度数。您可以使用math.radians
  • 查看math.atan2的确切定义。你可能会发现你的参数已经颠倒了。