代码之家  ›  专栏  ›  技术社区  ›  Brad Solomon

哈弗公式分量求解时的辛挂

  •  0
  • Brad Solomon  · 技术社区  · 4 年前

    我用的是 Haversine formula 以英里为单位计算两人之间的距离 (lat, lng)

    enter image description here

    从(38.0,-77.0)的中心坐标,我要解( )对于图中圆圈两侧的4个缺失点,假设距离为5英里。所以在每个方程中,给我一个距离和3个坐标,然后求第4个坐标。

    sympy ,但计算似乎超时了,除非我有一个符号错了。使用顶点( lat2, -77.0)

    import sympy as s
    
    lat1 = s.rad(38.0)
    lat2 = s.Symbol('lat2')
    lon1 = s.rad(-77.0)
    lon2 = s.rad(-77.0)
    d = 5.0  # Given distance
    R = 3950.  # Radius of earth in miles
    dlon = lon2 - lon1
    dlat = lat2 - lat1
    a = (s.sin(dlat/2))**2 + s.cos(lat1) * s.cos(lat2) * (s.sin(dlon/2))**2
    c = 2 * s.atan2( s.sqrt(a), s.sqrt(1-a) )
    s.solve(3950 * c - d, lat2)  # HANGS
    

    我要解决的是 lat2 ,但是 .solve() 电话无限期挂断。

    0 回复  |  直到 4 年前
        1
  •  0
  •   Oscar Benjamin    4 年前

    因为方程中有浮点数,没有符号,所以无法得到精确的解析解 nsolve

    In [25]: nsolve(eq, lat2, 0)                                                                                           
    Out[25]: 0.661959292973035
    
    In [26]: nsolve(eq, lat2, 1)                                                                                           
    Out[26]: 0.664490938542655
    
    In [27]: v1 = nsolve(eq, lat2, 0)                                                                                      
    
    In [28]: v2 = nsolve(eq, lat2, 2)                                                                                      
    
    In [29]: eq.subs(lat2, v1).n()                                                                                         
    Out[29]: -7.37924650738106e-14
    
    In [30]: eq.subs(lat2, v2).n()                                                                                         
    Out[30]: 1.27083170255818e-13
    

    如果使用atan而不是arctan2:

    c = 2 * s.atan( s.sqrt(a) / s.sqrt(1-a) ) 
    

    你可以直接从 solve :

    In [43]: s.solve(3950 * c - d, lat2, check=False, simplify=False)                                                      
    Out[43]: [0.661959292973035, 0.664490938542655]
    

    我不知道atan2怎么了。。。