limitmiao 发表于 2011-7-27 11:13:22

不满秩的矩阵行列式不为零?

计算一个十阶矩阵的秩得到的结果是9,但是球矩阵的行列式值不是0,而是E+76数量级,请问是什么原因?

messenger 发表于 2011-7-27 12:23:20

你求错了吧,不太可能出现你说的情况,Matlab再不济,基本的线性代数规则还是不会差很多的。

limitmiao 发表于 2011-7-27 21:50:20

谢谢总版主指教,可是我利用rank 和det进行计算得到的结果确实如此,下面附上矩阵求教

nwcwww 发表于 2011-7-28 00:01:02

这个矩阵自身的问题,最大和最小的非零奇异数相差太大了。
在使用rank函数时改下tol可以解决这个问题。

svd(aaa)返回的结果是

4.62013102248461e+15
132003935791.647
43684284660.6086
563810644.958191
67064417.5064577
36766337.7122677
2288109.59096890
17453.4044193914
3834.86776732737
5.31112774302949

svd得到的最大值和最小值之间相差了好多个量级,这也可以从cond(aaa)看出来:
cond(aaa)

ans =
8.6990e+014

既然所有的singular value都非0,这个矩阵自然是满秩的。
Matlab的rank函数采用的也是svd法,但是直接rank的确得到的结果是9。
这是因为由于考虑到计算误差,matlab并不是直接拿奇异数和0相比,而是参照了一个容忍值tol.
具体到rank函数里,tol = max(size(aaa)) *norm(aaa) *eps。如果奇异值小于tol的话就认为是0。

可是这个矩阵aaa的norm值确实太大(4.6201e+15),以至于相应计算得出的tol=10.2588.
而这个容忍值却是比最小的一个奇异值5.311大的,也就导致了后者被忽略。
那么rank函数得到的结果就是9。

看下面两个命令就清楚了:
>> rank(aaa,5.32)

ans =
   9

>> rank(aaa,5.31)

ans =
    10

前者比5.31112774302949略大,后者则略小。
所以你只要手动指定一个合适的tol值就行了。

limitmiao 发表于 2011-7-28 16:51:16

多谢指教,看来我是在使用rank的时候出现了错误

liushuangq05 发表于 2011-7-28 16:56:35

也可以用cond条件数的命令来评估你的矩阵的奇异程度;奇异性太高,默认的参数可能就不适合了。
对于奇异矩阵,可以通过一定的假设和转换,生成条件数比较好的矩阵。

limitmiao 发表于 2011-7-28 16:58:30

另外还想继续问一句,为什么要设置那个tol呢,干嘛不直接去与0相比较呢? 4# nwcwww

feiyuzhen 发表于 2011-7-28 18:46:03

另外还想继续问一句,为什么要设置那个tol呢,干嘛不直接去与0相比较呢? 4# nwcwww
limitmiao 发表于 2011-7-28 16:58 http://forum.simwe.com/images/common/back.gif

这就是数值计算的问题了,
计算机分配给每一个数的空间是有限的,
很小的浮点数有可能是计算时由于圆整误差带来的,
直接和0比较会把这种小浮点数得以保留,从而扩大误差,
指定一个合理的误差范围可以消除这种误差

limitmiao 发表于 2011-7-28 22:27:49

您的意思是我明白,但是单纯到rank这个命令中设置这么个tol我就不明白了,求教 8# feiyuzhen

feiyuzhen 发表于 2011-7-30 00:18:19

建议楼主看看奇异值分解是怎么回事,
仔细看看4楼的回答,他的解答很清楚,
相关命令的matlab帮助文档也很明了
页: [1]
查看完整版本: 不满秩的矩阵行列式不为零?