matlab - 为什么 Matlab 和 Octave 给出相同方程的结果略有不同?我该如何解决?
问题描述
我正在将一个 Matlab 程序导入 Octave。我使程序工作。现在一切似乎都运行良好,部分原因在于精度。
我发现 Matlab 和 Octave 给出的相同方程的结果略有不同。例如,
pi = acos(-1.0);
mu_0 = 4*pi*10^(-7);
然后,Matlab 和 Octave 对 pi 给出相同的结果。然而,对于 mu_0,Octave 给出 1.25663706143591 8 e-006,但 MATLAB 给出 1.25663706143591 7 e-006。
最后一个小数位置略有不同。它确实对最终结果有很大影响(结果的最大差异约为0.0001,但我需要低于0.00000001),因为程序有很多计算方程。
因此,我想知道我们是否可以让 Octave 输出与 Matlab 完全相同的结果?如果我们不能,我怎样才能减少他们的结果之间的差异?我可以通过编写一些代码或更改一些图形来解决这类问题吗?
非常感谢您的帮助。
PS:重点是让 Octave 输出与 MATLAB 相同的结果。(编辑后的程序在计算上与原程序没有任何区别。)也许,“变精度算术”没有多大帮助,因为 MATLAB 也做浮点四舍五入错误。
解决方案
浮点计算本质上是不精确的。更改操作顺序通常会导致舍入误差发生变化,您会在最后一位看到(如果幸运,如果不幸,差异会更大!)。您不能指望两个不同的程序或在两台不同的计算机上运行的同一个程序生成完全相同的浮点值。
如果这两个数字之间的差异对您的计算来说是个问题,您可能应该找出这种差异被放大的原因,并更改您的计算顺序,以便舍入误差不会造成这么大的伤害。
两个额外的建议:
不要重新定义
pi
. 它是一个内置函数,当您分配给它时,您会覆盖它。使用
1e-7
,不使用10^(-7)
。它更具可读性和更易于键入。
推荐阅读
- python - 如何清除 conda 环境变量?
- python - 带有辅助 y 轴的 Python openpyxl 散点图
- javascript - Svelte:如何将数据或道具从子组件传递给父组件?
- swift - SwiftUI - 如何通过视图模型完成调用函数
- swift - 返回 -> String 并在类中更改 var 的 Swift 函数
- json - “//” - 前缀 JSON 返回给出不一致的结果
- python - 如何在 matplotlib 中制作带注释的分组堆叠条形图?
- python - Export single pandas dataframe to multiple SQL tables (automatic normalization)
- orbeon - 如何计算 Orbeon Forms 中的数据集?
- postgresql - How to read a zip entry into a postgres table using the JDBC copymanager