在Matlab中计算sin(pi/2-A)和cos(A)的数值精度是否存在差异?

clj7thdc  于 2023-01-13  发布在  Matlab
关注(0)|答案(2)|浏览(214)

我正在阅读一个高级同事写的计算大圆距离的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不是引入了更多的误差源吗?既然lat1lat2在我的工作中可能非常接近于零,这是不是MATLAB的sin()cos()函数在数值精度上的一个小技巧?
期待解答,解释三角函数在MATLAB中如何工作,并分析这些函数在参数接近或等于0和pi/2时的误差。

tvokkenx

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不会恢复精度。

qgelzfjb

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) ≈ thetacos(theta) ≈ 1的小值的近似,则可能是后一种情况。然而,这是没有意义的,因为cos(pi/2-theta) ≈ thetasin(pi/2-theta) ≈ 1对于theta的小值。

相关问题