【问题标题】:Approximation/rounding errors in R in simple situations简单情况下 R 中的近似/舍入误差
【发布时间】:2013-10-18 08:10:37
【问题描述】:

我了解有时在某些浮点数计算中,R 会做出一些近似,从而导致错误,例如 9.143243e-16

但是,当我只使用只有整数的 3x3 矩阵时,为什么我可以得到像 9.143243e-16 这样的行列式(使用 det 命令)?

9.143243e-16 来自哪里,在这种情况下我只有整数数字? 涉及整数的行列式只应该给出一个整数,对吧?

提前谢谢你。

PS:这是一个例子(4x4,但我也可以找到一个 3x3)(在 R 软件 x86 版本上):

C=matrix(c(9,3,12,6,-3,-1,-4,-2,2,-2,4,0,5,-1,8,2),4,4,byrow=TRUE)
det(C)
[1] -1.923137e-30

【问题讨论】:

  • 答案是否定的。如果你除以整数,你会得到一个浮点数,所以你可以从整数开始,很容易得到一个浮点数。另外,与其强迫我们推测问题是什么,为什么不包括一些示例数据,一小段代码来说明您的问题?
  • det 在 R 外部由需要浮点输入的编译代码计算。
  • nograpes,计算 3x3 矩阵行列式不需要除法。只有加法和乘法就足够了。即使在浮动中,1.0000000000000 * 2.000000000000 + 3.0000000 * 4.000000000 + .. 也应该以.00000000000 结尾,不是吗?
  • nograpes,我还在我的问题中添加了一个示例... 其他:如何进行一些测试,例如 if (a==0) ?这是不可能的,因为 0 有时是 0 有时是别的东西......
  • “不需要”是一种拟人化,你不应该对计算机语言这样做,因为它们不喜欢被这样标记。

标签: r numeric numerical-methods


【解决方案1】:

作为一般规则,您永远不应该期望从浮点计算中得到准确的答案。您是正确的,原则上,仅涉及加法、减法和乘法的整数矩阵的行列式应该给出整数结果。如果 R 使用朴素算法来计算行列式,这将(可能)是这种情况。

但是,朴素算法涉及对所有 N! 的求和!排列,这是非常低效的,因此 R 使用了其他方法。我不知道这个方法是什么——如果你愿意,你可以查看 C 源代码,但我的猜测是他们做了矩阵分解X=LU,然后返回det(X)=det(L)det(U),其中L 的行列式和U 涉及简单地将对角线相乘。

可以通过查看函数det 找到更多信息,如下所示。如您所见,它实际上所做的是计算行列式的对数,然后对其取幂,因此没有理由相信结果将是一个整数。

> det
function (x, ...) 
{
    z <- determinant(x, logarithm = TRUE, ...)
    c(z$sign * exp(z$modulus))
}

【讨论】:

  • 感谢您的回答。那么language R 解决方案是什么,如果我想这样做:if (det(A)==0) { ... }
  • abs(det(A))&lt;epsilonepsilon 的一些小值(比如1e-12)应该可以工作。如果你有一个整数矩阵,那么行列式也是一个整数,所以它应该小于epsilon,或者大于1-epsilon
  • 每次我想测试是否等于零时都必须做abs(det(A))&lt;epsilon有点无聊...是否可以配置软件,以便“如果abs(...)小于 1e-14 则显示 0"
  • 我不知道。如果它只是看起来像,那么你可以训练自己看1e-14并认为“零”......
  • 可以设置函数isZ &lt;- function(x) abs(x)&lt;epsilon;那么isZ(det(A)) (几乎)和det(A)==0 一样紧凑
猜你喜欢
  • 2019-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-19
  • 2011-11-13
  • 2023-03-04
  • 1970-01-01
  • 2018-11-15
相关资源
最近更新 更多