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

Is there any numerical-accurracy difference on calculating sin(pi/2-A) and cos(A) in Matlab?

提问人:Colin Wu 提问时间:1/11/2023 最后编辑:Cris LuengoColin Wu 更新时间:1/15/2023 访问量:89

问:

我正在阅读我的前辈同事编写的用于计算大圆距离的 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)

为什么是 和 用来代替 和 ? 使用常量不是引入了更多的错误源吗? 由于在我的工作中可能非常接近于零,这是否对 MATLAB 和函数的数值准确性有影响?sin(pi/2-A)cos(pi/2-A)cos(A)sin(A)pilat1lat2sin()cos()

期待解释 MATLAB 中三角函数如何工作的答案,并在参数接近或等于 0 和 pi/2 时分析这些函数的误差。

MATLAB 精度 三角学 经纬度 数值方法

评论

3赞 picchiolu 1/11/2023
假设地球是一个完美的球体所得出的误差可能比由于对三角函数的任何花哨操作而产生的误差更大......

答:

2赞 Stewie Griffin 1/11/2023 #1

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

两者之间的最大差值是 ,非常小。这只是基本的浮点精度,实际上没有办法判断哪个数字更正确。请注意,.因此,如果 ,您同事的代码将给出 的错误,而简单地执行显而易见的操作将是正确的。sin(pi/2-A) - cos(A)cos(pi/2-A) - sin(A)1.1102e-16cos(pi/2) = 6.1232e-17theta = 0cos(pi/2-0)6.1232e-17sin(0)

如果您需要比这更准确的数字,那么您可以尝试 。vpa

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

如果他/她试图避免近似值和 的小值,则可能是后者。但是,这没有意义,因为 和 的小值 .sin(theta) ≈ thetacos(theta) ≈ 1thetacos(pi/2-theta) ≈ thetasin(pi/2-theta) ≈ 1theta

评论

1赞 Cris Luengo 1/11/2023
我同意,这看起来像是一种并发症,不会改善结果。
1赞 picchiolu 1/11/2023
我还要指出,从 to 和 viceversa 的转换应该使用专用函数 和 来完成,而不是使用涉及 .我怀疑这些代码是为旧版本的 MATLAB 编写的,当时这些转换函数仍然是工具箱的一部分。raddegrad2degdeg2radpi
2赞 user1196549 1/11/2023 #2

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

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

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

0赞 John BG 1/15/2023 #3

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

原始表达式可能来自手动计算时编写的导航公式:铅笔、纸尺、没有计算机、没有计算器。

然后使用表格和图形来加速结果:相当于从另一侧开始读取表格倒置读取图形pi-x