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



我在读师兄写的计算大圆距离的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和/2时这些函数的误差。

如果目的是提高准确性,这似乎是一个非常糟糕的主意。当角度很小时,90°a会破坏任何精度。这甚至可以使微小的角度消失(90-ε=90)。

相反,微小角度的正弦非常接近角度本身(弧度),因此计算非常准确,而余弦实际上是1或1- a²/2。为了在小角度上获得最高的精度,你可以求助于versine,使用versin(A):= 1-cos(A) = 2 sin²(A/2),并用1-versin(A)而不是cos(A)来重新计算方程。

如果角度接近90°,无论如何都会失去精度,90°-A将无法恢复。

我非常怀疑这与准确性有关。或者至少,我不认为这对准确性有任何帮助。

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

我猜这要么是因为你的同事发现了另一个公式并实现了它,要么是因为他/她感到困惑,试图提高准确性。

如果他/她试图避免对theta的小值进行sin(theta) ≈ thetacos(theta) ≈ 1的近似,则可能出现后者。但是,这没有意义,因为cos(pi/2-theta) ≈ thetasin(pi/2-theta) ≈ 1适用于theta的小值。

最好的方法是直接询问文本的作者,如果可能的话,你从哪里得到这些表达式。

最初的表达式可能来自于手工计算时写的导航公式:铅笔、纸、尺、没有计算机、没有计算器。

然后使用表格和图形来加速结果:pi-x相当于start read table from other side或读取图形倒过来.

相关内容

  • 没有找到相关文章

最新更新