我如何在MATLAB 8.0 (R2012b)的公差范围内比较相等的数字?
674次观看(过去30天)
显示旧的注释
我需要比较两个数字矩阵。一个内置函数,如EQ(==),发现两个数字是不同的,即使他们的差异只有1e-15。因此,我正在寻找另一个内置函数,它可以将公差作为输入参数,并在绝对差值低于公差阈值时返回“true”。在MATLAB中怎么做呢?
接受的答案
MathWorks支援小组
2012年11月29日
在MATLAB 8.0 (R2012b)中,将数值与公差进行比较的功能作为内置函数不可用。为了避免舍入错误导致的问题,可以将操作数的绝对差值与容差进行比较。而不是:
A = =
你可以使用以下方法:
abs(A-B) < 1e4*eps(min(abs(A),abs(B))))
在MATLAB中心文件交换中也有一些相关的条目。这些文件不是由MathWorks生成的,也不是由MathWorks支持的,因此任何问题都应该直接问作者,但是其他客户发现这些文件很有用。
IsNear
几乎
所附文件(见下文)使用了类似的方法,该文件也有处理NaN值的规定。
7评论
沃尔特·罗伯森
2021年8月11日
不。
假设你
格式长g
F = 10;
A1 = 1/ f;
A2 = A1*(1+eps);
C1 = 0;C2 = 0;
N = f;
为K = 1: n
C1 = C1 + a1;
C2 = C2 + a2;
结束
algebraically_expected = N/F
low_side = C1
high_side = C2
Low_difference = low_side - algebraically_expected
High_difference = high_side - algebraically_expected
High_side - low_side
A2-A1
(A2-A1) * F
最后一个告诉你,如果你有代数完美加法,那么当A2大于A1时,你会期望A2的F次加法和A1的F次加法之间有2.7E-16的差。但是,high_side - low_side表明,在现实中,您得到的错误大约是它的3.5倍。
因此,表现中的错误会累积,而且会累积得比最初明显的还要多。如果你做N次计算,累积误差可能会超过单个误差的N倍。
因此,当比较浮点数时,使用(单个错误乘以操作数)作为公差通常不是一个好主意,而是使用该公差的倍数。但
什么
多个?
“合理”的倍数取决于所做操作的类型。如果你只是做加法,那么倍数可能会相当小。如果你在做矩阵运算,那么你应该考虑“条件数”。
几周前我确实遇到过这样的情况,即5000*eps的倍数是合适的;我知道我发布了代码,但不幸的是,我的内存没有给我足够的上下文来找到它。