Mad*_*adu 27 math matlab matrix
我们如何才能知道4x4矩阵是否是单数?
我们可以在不使用单位矩阵扩充我们给定的矩阵然后进行行操作的情况下了解这一点吗?
小智 105
那么如何识别矩阵是否真正奇异?(在MATLAB中,不使用纸和笔或符号计算,或手写行操作?)教科书有时会告诉学生使用行列式,所以我将从那里开始.
理论上,人们可以简单地测试矩阵的行列式是否为零.从而
M = magic(4)
M =
16 2 3 13
5 11 10 8
9 7 6 12
4 14 15 1
det(M)
ans =
-1.4495e-12
Run Code Online (Sandbox Code Playgroud)
事实证明,这个矩阵确实是单数的,所以有一种方法可以将一行M写成其他行的线性组合(对于列也是如此).但是我们得到的值与det不完全相同. .它真的是零,而MATLAB只是感到困惑吗?这是为什么?象征性决定因素确实为零.
det(sym(M))
ans =
0
Run Code Online (Sandbox Code Playgroud)
事实证明,对于较大的数组,行列式的计算是非常低效的.所以一个不错的选择是使用我们的方阵的特定矩阵分解的对角元素的乘积.实际上,这就是MATLAB在非符号输入中为自身做的事情.
[L,U,P] = lu(M)
L =
1 0 0 0
0.25 1 0 0
0.3125 0.76852 1 0
0.5625 0.43519 1 1
U =
16 2 3 13
0 13.5 14.25 -2.25
0 0 -1.8889 5.6667
0 0 0 3.5527e-15
P =
1 0 0 0
0 0 0 1
0 1 0 0
0 0 1 0
Run Code Online (Sandbox Code Playgroud)
看到L的对角元素是1,但U具有非零对角元素.关于矩阵乘积的行列式,以及上三角矩阵或下三角矩阵的行列式,都有很好的性质.
prod(diag(U))
ans =
-1.4495e-12
Run Code Online (Sandbox Code Playgroud)
看到我们得到了相同的答案.由于即使对于大型数组,LU分解也相当快,因此它是计算行列式的好方法.问题是,它使用浮点运算.所以U的那些对角元素是真实的浮点数.当我们采用该产品时,我们得到的结果并非完全为零.最后一个元素只是略微非零.
det还有其他问题.例如,我们知道矩阵眼(100)的条件非常好.毕竟它是一个单位矩阵.
det(eye(100))
ans =
1
Run Code Online (Sandbox Code Playgroud)
现在,如果我们将矩阵乘以常数,则不会将矩阵的状态更改为单数.但决定因素会发生什么?
det(.1*eye(100))
ans =
1e-100
Run Code Online (Sandbox Code Playgroud)
这个矩阵是单数的吗?毕竟,如果det(magic(4))给我们1e-12,那么1e-100必须对应一个奇异矩阵!但事实并非如此.更糟,
det(.0001*eye(100))
ans =
0
Run Code Online (Sandbox Code Playgroud)
实际上,行列式由0.0001 ^ 100缩放,在matlab中将为1e-400.如果matlab可以表示使用double的小数字,那么至少会是这样.它不能这样做.这个数字会下降.或者很容易,我们可以让它溢出.
det(10000*eye(100))
ans =
Inf
Run Code Online (Sandbox Code Playgroud)
显然,所有这些缩放的单位矩阵同样是非单数的,但是可以使det给我们任何我们想要看到的答案!因此,我们必须得出结论,计算行列式对于矩阵来说是一件可怕的事情.我不在乎你的教科书很久以前告诉你什么,或者你的老板或老师告诉你的.如果有人告诉你使用计算机计算这个目的的决定因素,这是一个糟糕的建议.期.决定因素只是有太多问题.
我们可以做其他事情来测试奇点.最好的工具是使用排名.因此,如果NxM矩阵的秩小于min(N,M),则矩阵是单数的.这里有几个测试:
rank(M)
ans =
3
rank(.0001*eye(100))
ans =
100
Run Code Online (Sandbox Code Playgroud)
所以等级能够告诉我们4x4魔方是奇异的,但我们的缩放单位矩阵不是单数.(一个好处是秩可以测试非方矩阵的奇点.)
我们也可以使用cond来测试数值奇点.最小可能的条件数是1.0,这对应于表现良好的矩阵.大条件数是坏的.在双精度中,这意味着当条件数大于约1e15时,您的矩阵非常有问题.
cond(M)
ans =
8.148e+16
cond(.0001*eye(100))
ans =
1
Run Code Online (Sandbox Code Playgroud)
实际上,cond认为缩放的单位矩阵毕竟是良好的条件.大条件数是坏的.对于双精度矩阵,任何接近1e15左右的条件数表示可能是数字奇异的矩阵.所以我们看到M显然是单数.同样,cond能够处理非方形矩阵.
或者,我们可以使用rcond,一种估算条件数倒数的工具.对于非常大的数组,这是一个很好的工具.当rcond给出一个接近eps的数字时,请注意!
rcond(M)
ans =
1.3061e-17
rcond(.0001*eye(100))
ans =
1
Run Code Online (Sandbox Code Playgroud)
最后,对于数学齿轮头(像我一样),我们可能会拉出svd.毕竟,svd是cond和rank所基于的工具.当矩阵的一个或多个奇异值与最大奇异值相比很小时,我们再次具有奇点.
svd(M)
ans =
34
17.889
4.4721
4.1728e-16
Run Code Online (Sandbox Code Playgroud)
在这里,我们看一下奇异值与矩阵的最大奇异值相比较小的时间.一个好处是svd可以告诉我们矩阵与奇点有多接近,如果有多个小的奇异值,如果给出了关于矩阵等级的信息.
好消息是,我所展示的工具都不需要用户进行基本行操作或任何花哨的操作.
但请不要使用DET!是的,它出现在教科书中.是的,也许你的导师或老板告诉你使用它.它们是错的,因为这样的工具在应用于使用浮点运算的计算机上时会失败.而你根本不想计算一个象征性的决定因素,这将是非常低效的.
如果这是一篇长篇大论,我很抱歉.我现在要离开我的肥皂盒了.
最可靠的方法是对矩阵进行奇异值分解。最大奇异值与最小奇异值之比应在合理的容差范围内。这个比率就是矩阵的条件数。对于双精度值,当条件数超过一百万或更多时,双精度值的情况会变得非常危险,这是一个相当高的限制。请注意,一旦有了 SVD,它除了计算条件数之外,还有很多其他用途。
奇异值分解是数值分析的瑞士军用电锯;如果您知道矩阵不是奇异/病态的,那么它可能是一个有点笨拙的工具。但如果您不知道,它是一个很好的了解工具。尤其是 Matlab,因为它是一个内置工具。