我正在阅读一个高级同事写的计算大圆距离的matlab函数。地球表面两点之间的距离应该用下面的公式计算:
d = r * arccos[(sin(lat1) * sin(lat2)) + cos(lat1) * cos(lat2) * cos(long2 – long1)]
但是,该脚本的代码如下所示:
dist = (acos(cos(pi/180*(90-lat2)).*cos(pi/180*(90-lat1))+sin(pi/180*(90-lat2)).*sin(pi/180*(90-lat1)).*cos(pi/180*(diff_long)))) .* r_local;
(-180 < long1,long2 <= 180, -90 < lat1,lat2 <= 90)
为什么要用sin(pi/2-A)
和cos(pi/2-A)
来代替cos(A)
和sin(A)
?使用常量pi
不是引入了更多的误差源吗?既然lat1
、lat2
在我的工作中可能非常接近于零,这是不是MATLAB的sin()
和cos()
函数在数值精度上的一个小技巧?
期待解答,解释三角函数在MATLAB中如何工作,并分析这些函数在参数接近或等于0和pi/2时的误差。
2条答案
按热度按时间tvokkenx1#
如果目的是提高精度,这似乎是一个非常糟糕的主意,当Angular 很小时,90-A会破坏任何精度,甚至会使微小的Angular 消失(90-ε=90)。
相反,微小Angular 的正弦非常接近Angular 本身(弧度),因此计算非常精确,而余弦实际上是1或1-A²/2。对于微小Angular 的最高精度,您可以使用正矢,使用正矢(A):= 1-cos(A)= 2 sin²(A/2),并根据1-正矢(A)而不是cos(A)重新计算方程。
如果Angular 接近90°,无论如何都会失去精度,90°-A不会恢复精度。
qgelzfjb2#
我非常怀疑这与准确性有关,或者至少,我认为这对准确性没有任何帮助。
sin(pi/2-A) - cos(A)
和cos(pi/2-A) - sin(A)
之间的最大差值是1.1102e-16
,这是非常小的。这只是基本的浮点精度,实际上没有办法判断哪个数字更正确。注意cos(pi/2) = 6.1232e-17
。因此,如果theta = 0
,您同事的代码cos(pi/2-0)
将给予6.1232e-17
的错误。而简单地进行显而易见的sin(0)
将是正确的。如果您需要比这个更准确的数字,那么您可以尝试
vpa
。我猜这是因为你的同事发现了另一个公式并实现了它,或者他/她感到困惑并试图提高准确性。
如果他/她试图避免
sin(theta) ≈ theta
和cos(theta) ≈ 1
的小值的近似,则可能是后一种情况。然而,这是没有意义的,因为cos(pi/2-theta) ≈ theta
和sin(pi/2-theta) ≈ 1
对于theta
的小值。