叹。计算行列式以确定奇点是一件荒谬的事情,完全如此。对于大型矩阵尤其如此。对不起,但确实如此。为什么?是的,有些书告诉你这样做。甚至可能是你的导师。
分析奇点是一回事。但是奇点的数值确定呢?除非您使用符号工具,否则 MATLAB 使用浮点运算。这意味着它将数字存储为浮点、双精度值。这些数字的数量级不能小于
>> realmin
ans =
2.2251e-308
(实际上,就非规范化数字而言,MATLAB 比这要低一些,可以下降到大约 1e-323。)请注意,当我尝试存储一个小于该数字的数字时,MATLAB 认为它为零。
>> A = 1e-323
A =
9.8813e-324
>> A = 1e-324
A =
0
大矩阵会发生什么?例如,这个矩阵是奇异的吗:
M = eye(1000);
由于 M 是单位矩阵,因此它相当明显是非奇异的。事实上, det 确实表明它是非奇异的。
>> det(M)
ans =
1
但是,将它乘以某个常数。这是否使它非单一?不!!!!!!!!!!!!!!!!!!!!!!!!当然不是。但是还是试试吧。
>> det(M*0.1)
ans =
0
唔。那很奇怪。MATLAB告诉我行列式为零。但我们知道行列式是 1e-1000。哦是的。天哪,1e-1000 比我刚刚向您展示的 MATLAB 可以存储为双精度数的最小数字要小得多。所以行列式下溢,即使它显然是非零的。矩阵是奇异的吗?当然不是。但是在这里使用 det 会失败吗?当然会,这是完全可以预料的。
相反,使用一个好的工具来确定奇点。使用 cond 或 rank 之类的工具。例如,我们可以愚弄排名吗?
>> rank(M)
ans =
1000
>> rank(M*.1)
ans =
1000
看到秩知道这是一个满秩矩阵,不管我们是否缩放它。cond 也是一样,计算 M 的条件数。
>> cond(M)
ans =
1
>> cond(M*.1)
ans =
1
欢迎来到浮点运算的世界。哦,顺便说一句,忘记 det 作为几乎任何使用浮点运算的计算的工具。这几乎总是一个糟糕的选择。