gpt4 book ai didi

python - 距离估计 - 不理解这个数学域错误

转载 作者:行者123 更新时间:2023-12-01 00:16:53 27 4
gpt4 key购买 nike

我尝试计算两个位置之间的距离,但此公式有错误

acos(sin(latA)*sin(latB) + cos(latA)*cos(latB)*cos(abs(longB-longA)))

这是我计算距离的函数:

def distanceGPS(latA, longA, latB, longB):
"""Retourne la distance en Kilomètres entre les 2 points A et B connus grâce à
leurs coordonnées GPS (en radians).
"""
latA, longA, latB, longB = deg2rad(latA, longA, latB, longB)

print(latA)
print(longA)
print(latB)
print(longB)

# Rayon de la terre en mètres (sphère IAG-GRS80)
RT = 6378.137
# angle en radians entre les 2 points
S = acos(sin(latA)*sin(latB) + cos(latA)*cos(latB)*cos(abs(longB-longA)))

# distance entre les 2 points, comptée sur un arc de grand cercle
return (S*RT)

打印结果:

lat    0.651706 
dtype: float64
lon -0.079956
dtype: float64
0.6517058798628295
-0.07995634999527296

这是我将度数转换为弧度的函数:

def deg2rad(latA, longA, latB, longB):
"""Convertit un angle "degrés décimaux" en "radians"
"""
return latA/180*pi, longA/180*pi, latB/180*pi, longB/180*pi

def test_prediction(corpus, lat_moy, long_moy, i):
"""
Cette fonction test si la localisation predite est a une distance inferieure a 100km de la localisation correct.
Si oui, alors on defini la prediction comme correct
Si non, alors on defini la prediction comme non correct
"""

for word in corpus.correct_localisation[i]:
loc = geolocator.geocode(word)

if loc is not None and distanceGPS(lat_moy, long_moy, loc.latitude, loc.longitude) <= 100:
corpus.at[i, "test_pred"] = "OK"
return
else:
corpus.at[i, "test_pred"] = "NOK"

return

我的错误是:

> --------------------------------------------------------------------------- ValueError                                Traceback (most recent call
> last) <ipython-input-18-75f41b231cbd> in <module>
> 11 df = coordonnees_article(corpus['article'][i])
> 12 lat_moy, long_moy = position_moyenne(outliers_coordonnees(df))
> ---> 13 test_prediction(corpus, lat_moy, long_moy, i)
> 14 print(i)
>
> <ipython-input-17-47270c034d33> in test_prediction(corpus, lat_moy,
> long_moy, i)
> 11 print(loc)
> 12 # try:
> ---> 13 if loc is not None and distanceGPS(lat_moy, long_moy, loc.latitude, loc.longitude) <= 100:
> 14 corpus.at[i, "test_pred"] = "OK"
> 15 return
>
> <ipython-input-16-129df29f0484> in distanceGPS(latA, longA, latB,
> longB)
> 13 RT = 6378.137
> 14 # angle en radians entre les 2 points
> ---> 15 S = acos(sin(latA)*sin(latB) + cos(latA)*cos(latB)*cos(abs(longB-longA)))
> 16
> 17 # distance entre les 2 points, comptée sur un arc de grand cercle
>
> ValueError: math domain error

感谢您的帮助

最佳答案

对于您有时遇到的“奇怪”情况,这是由于浮点不准确造成的。例如,如果您运行:

1.2 - 1.0 = 0.19999999999999996

我们显然希望它是 0.2,但由于 float 的表示方式(使用固定数量的二进制数字),我们得到了上面的结果。

你能如何处理这个问题?您可以使用 decimal module或将您的值四舍五入到较小的小数位数。

如果你在Python中使用decimal模块:

from decimal import *

# the following sets the number of decimal places to 8
getcontext().prec = 8

# if you run
sin(latA)*sin(latB) + cos(latA)*cos(latB)*cos(abs(longB-longA))
# the output is
0.999999999999954

# if you use the decimal module
# (please note I am multiplying by 1 at the end)
Decimal(sin(latA)*sin(latB) + cos(latA)*cos(latB)*cos(abs(longB-longA)))*1
# the output is
Decimal('1.00000000000')

您还可以使用舍入函数将数字四舍五入到更少的小数位:

x = 0.19999999999999996
round(x,8)
# the output is
0.2

就您而言,虽然我没有收到域错误,但我认为您收到该错误的原因是您的计算机可能计算出一个值为 1.000000000004 的值(例如)。因此,当您尝试获取 acos(1.0000000004) 时,您会收到域错误。在调用 acos 之前使用上述任一方法来“舍入”您的答案可能会解决您面临的问题。

关于python - 距离估计 - 不理解这个数学域错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59269470/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com