【问题标题】:precision problems in matlab when using arrayfun使用arrayfun时matlab中的精度问题
【发布时间】:2020-04-04 04:05:42
【问题描述】:

我正在使用 matlab。我有一个函数f(x),我想将f(x) 应用于一组值。所以我写了2个代码。第一个代码是一个简单的 for 循环。在某一时刻x0,在这个for循环中,我找到了f(x0)=1.0000,然后我使用了f(x0)-1=-4.7684e-07

我的第二个代码是在 f(x) 上使用 arrayfun。而在同样的输入值x0,我发现结果是1.0000但是arrayfun(f,x0)-1=4.7684e-07

这个错误4.7684e-07 看起来很小。但是 for 循环给了我一个低于 1 的数字,arrayfun 给了我一个高于 1 的数字。这对我的工作来说确实是一个很大的不同,因为我随后的计算很大程度上取决于这个数字是低于 1 还是高于 1,因为这个数字应该是一个概率。

现在我的问题是:为什么arrayfun 有这样的问题?我的代码中没有随机数,为什么arrayfun 生成的结果与 for 循环不同?我应该相信哪一个?有没有办法避免这种精度问题?请注意,在这段代码中,我所有的变量都是single 类型。这是造成问题的原因吗?

【问题讨论】:

  • 这看起来确实很奇怪,因为arrayfun 就像引擎盖下的一个循环。 MVE 怎么样?
  • @max 让我试试看能不能修改我原来的代码。
  • 也许差异已经更早并且其中一个 x0 不完全相同?调试代码时,请确保查看 17 位有效数字。这比将显示的 15 个format long 多。可用于打印的代码:stackoverflow.com/a/35626253/2732801
  • 您与single 合作有什么原因吗?这确实不是很精确。
  • 请阅读minimal reproducible example。如果我们不知道您在做什么,我们就无法猜测问题出在哪里。你的描述很丰富,但并不完整。展示你做了什么,不要说你做了什么!

标签: matlab for-loop precision


【解决方案1】:

加法和乘法在有限精度下不可交换,结果取决于顺序。例如,与 (a+c+d+b) 相比,添加 (a+b+c+d) 预计会给您不同的答案,直至浮点舍入误差。这在并行计算中尤其是一个问题,其中无法确保来自多个并行线程的累积顺序。

您可以强制操作顺序或使用更高的精度(如双精度)来减少此错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多