Matlab中的数值问题:相同的输入,相同的代码 - >不同的输出?

时间:2010-08-31 12:10:23

标签: matlab numerical

当我将来自不同运行的Matlab软件的结果与相同的输入进行比较时,我遇到了问题。为了缩小问题范围,我做了以下几点:

  • 使用Matlab的save()方法保存所有相关变量
  • 调用计算某事的方法
  • 使用save()
  • 再次保存所有相关的输出变量

在不改变被调用方法的情况下,我用

进行了另一次运行
  • 加载上面保存的变量,并使用isequal()
  • 与当前输入变量进行比较
  • 使用当前输入变量再次调用我的方法
  • 加载上面保存的输出变量并进行比较。

我无法相信最后一行“比较”中的比较会发现轻微差异。计算包括单精度和双精度数,误差大小为1e-10(输出为双数)。

我能想象的唯一可能的解释是,在保存变量时,Matlab会失去一些精度(我认为这是不太可能的,我使用的是默认的二进制Matlab格式),或者包含的算法如a = b + c + d ,可以计算为a =(b + c)+ d或a = b +(c + d),这可能导致数值差异。

您知道上述观察结果可能是什么原因吗?

非常感谢!

3 个答案:

答案 0 :(得分:1)

它似乎真的是由计算中的单/双混合引起的。由于我只切换到双精度,问题不再发生。感谢大家的想法。

答案 1 :(得分:0)

这些可能是舍入错误。您可以像下面这样找到系统的浮点精度:

>> eps('single')

ans =

  1.1921e-07

在我的系统上,这会报告10 ^ -7,这将解释您的订单的差异

答案 2 :(得分:0)

为了确保可重现的结果,特别是如果您使用任何随机生成函数(直接或间接),您应该在每次运行开始时恢复相同的状态:

%# save state (do this once)
defaultStream = RandStream.getDefaultStream;
savedState = defaultStream.State;
save rndStream.mat savedState

%# load state (do this at before each run)
load rndStream.mat savedState
defaultStream = RandStream.getDefaultStream();
defaultStream.State = savedState;