我在读师兄写的计算大圆距离的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) ≈ theta
和cos(theta) ≈ 1
的近似,则可能出现后者。但是,这没有意义,因为cos(pi/2-theta) ≈ theta
和sin(pi/2-theta) ≈ 1
适用于theta
的小值。
最好的方法是直接询问文本的作者,如果可能的话,你从哪里得到这些表达式。
最初的表达式可能来自于手工计算时写的导航公式:铅笔、纸、尺、没有计算机、没有计算器。
然后使用表格和图形来加速结果:pi-x
相当于start read table from other side或读取图形倒过来.