关于MATLAB行列式函数特殊结果的解释

Explanation on the particular result of MATLAB determinant function

我在 MATLAB 中使用行列式函数时观察到一个简单但特殊的行为,我想得到一些解释,因为我在函数帮助文档中没有找到任何关于它的信息。

我正在使用以下代码生成随机酉矩阵 Q

[Q, R] = qr(randn(3));

之后,我用 det 函数计算 Q 的行列式:

det(Q)

我希望结果是 -1.0001.000。但是,格式似乎并不恒定。所以当我做这样的事情时:

detResults = zeros(100,1);
for ii = 1:100
    [Q, R] = qr(randn(3));
    detResults(ii,1) = det(Q);
end

detResults 向量包含 1.000,有时包含 1。是打印格式问题还是其他原因?

与浮点精度有关。每次迭代该循环时,即使理论上 Q 矩阵的行列式为 1,但矩阵本身中的数字是无理数,因此从理论上讲,获得 1 值的唯一方法是当您数字以无限的精度表示。有时有足够的数字,因此 MATLAB 可以放心地舍入到 1。另外,您没有得到完整的图片。之所以看到1.00001,也和打印格式有关。默认打印格式最多只显示五位小数,但显示更多小数位以欣赏更大的图片可能是谨慎的。

这是一个小例子,只使用 10 次迭代而不是 100 次。

使用默认打印格式:

>> detResults

detResults =

    1.0000
    1.0000
    1.0000
    1.0000
    1.0000
    1.0000
    1.0000
    1.0000
    1.0000
    1.0000

使用精度更高的格式(仅用于显示目的)format long g:

>> format long g;
>> detResults

detResults =

                     1
     0.999999999999999
                     1
                     1
     0.999999999999999
                     1
                     1
     0.999999999999999
                     1
     0.999999999999999

在内部,这实际上取决于 Q 矩阵是什么以及生成随机矩阵时从包中得到什么。但是,就将这些用于进一步计算的精度而言,0.999... 非常接近 1,因此对于所有意图和目的,您应该将其视为等于 1。

我相信您正在观察浮点数表示的有限精度的影响。默认情况下,MATLAB 使用 64 位浮点数。因此,该系统只能精确表示一组有限的数字,最多包含 2^64 个唯一元素。在中间计算期间产生的所有其他数字都四舍五入为最接近的可表示值。这些路由操作会导致错误,对于大多数(但不是所有)应用程序而言,这些错误可以忽略不计。

您可以通过将此行附加到您的代码来估计结果中的错误:

err = detResults - 1;

观察有限精度工件的一个简单示例是:

2-(sqrt(2))^2

显然,这应该正好是 0。但是 MATLAB 会 return 一个非零的小数,因为平方根和平方步骤中的舍入误差。