为什么 Matlab 和 Octave 对于同一个方程给出的结果略有不同?我该如何解决?

Why Matlab and Octave give out slightly different result for same equation? How can I fix that?

我正在将 Matlab 程序导入 Octave。我使程序工作。现在一切似乎都很好,部分原因在于精度。

我发现 Matlab 和 Octave 对于相同的方程给出的结果略有不同。 例如,

pi = acos(-1.0); 
mu_0 = 4*pi*10^(-7);

然后,Matlab 和 Octave 给出了 pi 的相同结果。 但是,对于 mu_0,Octave 给出 1.256637061435918e-006,而 MATLAB 给出 1.256637061435917e-006.

最后一位小数的位置略有不同。它确实对最终结果有很大影响(结果的最大差异约为0.0001,但我需要低于0.00000001),因为程序有很多计算方程。

因此,我想知道我们是否可以使Octave输出与Matlab完全相同的结果?如果我们不能,我怎样才能减少他们结果之间的差异?我可以通过编写一些代码或更改一些图形来解决此类问题吗?

非常感谢您的帮助。

PS:重点是让Octave输出和MATLAB一样的结果。(修改后的程序和原程序在计算上没有任何区别。)也许,"variable precision arithemetic"没有帮助很大,因为 MATLAB 也会产生浮点舍入错误。

Floating-point calculations are inherently imprecise。更改操作顺序通常会导致舍入误差发生变化,您会在最后一位数字中看到这一点(幸运的话,如果不幸的话,差异会大得多!)。您不能指望两个不同的程序,或两台不同计算机上的同一个程序 运行 生成完全相同的浮点值。

如果这两个数字之间的差异对您的计算来说是个问题,您可能应该找出这种差异被放大的原因,并更改计算的顺序,以便舍入误差不会造成如此大的危害。


另外两条建议:

  • 不要重新定义 piIt is a built-in function,当你分配给它时,你会覆盖它。

  • 使用 1e-7,而不是 10^(-7)。它更易读,也更容易输入。

使用变精度算法,vpa

mu_0 = vpa(4e-7*pi,30); %Last number is the precision

编辑:正如 Cris 在评论中指出的那样,此解决方案需要符号工具箱,如果您无法使用它,您可以在此处下载替代方案:https://se.mathworks.com/matlabcentral/fileexchange/36534-hpf-a-big-decimal-class