提问人:Colin Wu 提问时间:1/11/2023 最后编辑:Cris LuengoColin Wu 更新时间:1/15/2023 访问量:89
在 Matlab 中计算 sin(pi/2-A) 和 cos(A) 是否有任何数值精度差异?
Is there any numerical-accurracy difference on calculating sin(pi/2-A) and cos(A) in Matlab?
问:
我正在阅读我的前辈同事编写的用于计算大圆距离的 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)
pi
lat1
lat2
sin()
cos()
期待解释 MATLAB 中三角函数如何工作的答案,并在参数接近或等于 0 和 pi/2 时分析这些函数的误差。
答:
我非常怀疑这与准确性有关。或者至少,我认为这在准确性方面没有任何帮助。
两者之间的最大差值是 ,非常小。这只是基本的浮点精度,实际上没有办法判断哪个数字更正确。请注意,.因此,如果 ,您同事的代码将给出 的错误,而简单地执行显而易见的操作将是正确的。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
theta
cos(pi/2-theta) ≈ theta
sin(pi/2-theta) ≈ 1
theta
评论
rad
deg
rad2deg
deg2rad
pi
如果目的是提高准确性,这似乎是一个非常糟糕的主意。当角度较小时,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 不会恢复它。
如果可能的话,最好的机会是直接向文本的作者询问你从哪里得到这些表达。
原始表达式可能来自手动计算时编写的导航公式:铅笔、纸尺、没有计算机、没有计算器。
然后使用表格和图形来加速结果:相当于从另一侧开始读取表格或倒置读取图形。pi-x
评论