我如何在MATLAB 8.0 (R2012b)的公差范围内比较相等的数字?

674次观看(过去30天)
我需要比较两个数字矩阵。一个内置函数,如EQ(==),发现两个数字是不同的,即使他们的差异只有1e-15。因此,我正在寻找另一个内置函数,它可以将公差作为输入参数,并在绝对差值低于公差阈值时返回“true”。在MATLAB中怎么做呢?

接受的答案

MathWorks支援小组
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
algebraically_expected =
1
low_side = C1
low_side =
1
high_side = C2
high_side =
1
Low_difference = low_side - algebraically_expected
low_difference =
-1.11022302462516 e-16
High_difference = high_side - algebraically_expected
high_difference =
6.66133814775094 e-16
High_side - low_side
ans =
7.7715611723761 e-16
A2-A1
ans =
2.77555756156289 e-17
(A2-A1) * F
ans =
2.77555756156289 e-16
最后一个告诉你,如果你有代数完美加法,那么当A2大于A1时,你会期望A2的F次加法和A1的F次加法之间有2.7E-16的差。但是,high_side - low_side表明,在现实中,您得到的错误大约是它的3.5倍。
因此,表现中的错误会累积,而且会累积得比最初明显的还要多。如果你做N次计算,累积误差可能会超过单个误差的N倍。
因此,当比较浮点数时,使用(单个错误乘以操作数)作为公差通常不是一个好主意,而是使用该公差的倍数。但 什么 多个?
“合理”的倍数取决于所做操作的类型。如果你只是做加法,那么倍数可能会相当小。如果你在做矩阵运算,那么你应该考虑“条件数”。
几周前我确实遇到过这样的情况,即5000*eps的倍数是合适的;我知道我发布了代码,但不幸的是,我的内存没有给我足够的上下文来找到它。

登录评论。

更多答案(1)

伽柏Bekes
伽柏Bekes 2017年2月16日
编辑:伽柏Bekes 2017年2月16日
您可以尝试使用std()。如果你的值是相同的,他们的偏差应该是零,如果不是它增加。您可以对此设置上限以指定公差。
1评论
沃尔特·罗伯森
沃尔特·罗伯森 2017年2月16日
对于一对值,a和B, std([a B])计算为abs(a - B)/根号(2)。
在我看来,这增加了一个层次的模糊的腹肌(a - B)计算,不值得节省几个按键。

登录评论。

2022世界杯八强谁会赢?


释放

R2012b

世界杯预选赛小组名单社区寻宝

在MATLAB Central中找到宝藏,并发现社区如何帮助您!世界杯预选赛小组名单

开始狩猎!

Baidu
map