为什么 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。更改操作顺序通常会导致舍入误差发生变化,您会在最后一位数字中看到这一点(幸运的话,如果不幸的话,差异会大得多!)。您不能指望两个不同的程序,或两台不同计算机上的同一个程序 运行 生成完全相同的浮点值。
如果这两个数字之间的差异对您的计算来说是个问题,您可能应该找出这种差异被放大的原因,并更改计算的顺序,以便舍入误差不会造成如此大的危害。
另外两条建议:
不要重新定义 pi
。 It 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
我正在将 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。更改操作顺序通常会导致舍入误差发生变化,您会在最后一位数字中看到这一点(幸运的话,如果不幸的话,差异会大得多!)。您不能指望两个不同的程序,或两台不同计算机上的同一个程序 运行 生成完全相同的浮点值。
如果这两个数字之间的差异对您的计算来说是个问题,您可能应该找出这种差异被放大的原因,并更改计算的顺序,以便舍入误差不会造成如此大的危害。
另外两条建议:
不要重新定义
pi
。 It 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