【问题标题】:Matlab gives wrong answer on mod(), isequal(), floor() function with a vector parameterMatlab 对带有向量参数的 mod()、isequal()、floor() 函数给出错误答案
【发布时间】:2013-02-05 04:23:19
【问题描述】:

我正在使用 matlab 解决混合整数规划,在我从 linprog 获得解决方案后,我想评估它们是否都是整数(x 是 n 维),但我想不出办法做到这一点。

mod(x,1) == 0isequal(x,floor(x))等所有函数都会给出错误的anwser。

更奇怪的是,如果你手动输入一个具有相同参数的向量,结果是正确的。

结果显示:(这里所有的x都是从linprog的结果中得到的)。任何人都可以对此提供帮助或提出一些其他有用的方法来评估它吗?

K>> x

x =

    7.0000
    1.0000

K>> mod(x,1)

ans =

    0.0000
    1.0000

K>> x

x =

    6.0000
    3.0000

K>> isequal(x,floor(x))

ans =
    0

【问题讨论】:

  • 似乎对我有用。您是否考虑过使用整数类型(int/uint 之一)而不是双精度类型来解决您的问题?
  • 我也试过了,得到了我预期的结果。
  • 是的,如果你手动输入x值,它可以工作,但如果它带有linprog的解决方案,它就不会工作。@LoremIpsum @robbit
  • 那是因为来自 linprog 的数字并不是看起来的那样,请看我的回答。
  • 为什么不直接将 linprog 的结果四舍五入。问题是你看到的 7.0000 实际上是 7.00000001 或类似的东西

标签: matlab


【解决方案1】:

看起来是来自 linprog 的整数 1,实际上是一个非常接近 1 的浮点数,但不等于它。只是您(默认情况下)无法通过在 MATLAB 中输出数字来区分。请参阅有关comparing floating point values 的问题。此外,请参阅有关 display format of numbers 的 MATLAB 手册页。

默认情况下,MATLAB 使用format short 显示数字:

format 将浮点数值的显示设置为默认显示格式,即短固定十进制格式。此格式显示 5 位缩放的定点值。

因此,1 – 1e–10显示为 1,即使它不等于等于 1。同样,mod(1 – 1e–10, 1)显示 > 为 1,即使它确实是 1 – 1e–10

如果您手动将x 设置为其显示的表示形式,则所有低位数字都将被截断,“奇怪地”为您提供预期的结果。

在输入命令format long 后检查x

【讨论】:

  • 是的,我测试了设置格式long,它实际上是6.000000000000003, 3.000000000000000,但是这是不对的,因为对于linprog函数,我有限制,比如x1>=6,x2
  • @JiahuiGuo 嗯,6 + 3e–15 ≥ 6 实际上成立,3
  • @JiahuiGuo 我的错,这个解决方案显然不可行,因为它不是整数。您可以检查解决方案是否足够接近积分(简单的norm(x - round(x)) < 1e-10 可以工作)。请问您为什么要进行检查而不是四舍五入?
  • 原因是我尝试过,我使用 norm(x-floor(x))
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-25
  • 2020-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-29
相关资源
最近更新 更多