求逆矩阵与伪逆矩阵
矩阵a的逆矩阵用a^-1表示,并且满足下面的关系:
a*a^-1 = (a^-1)*a =E(单位矩阵)
看下面这个矩阵方程:
ax = b
如果a的逆矩阵存在,那么解可写成:
x = (a^-1)*b
如果有学过线性代数的小伙伴一定知道这些东西有多难算,幸运的是,在matlab中只需要一个命令就可以计算出矩阵a的逆矩阵:
inv(a)
对于一个方程来说,他的解不一定存在,那就意味着a的逆矩阵不一定存在。事实上,我们可以用一个矩阵的行列式来判断这个矩阵的解是否存在,如果det(a) != 0,那就意味着这个矩阵有解,有逆矩阵,反之,如果det(a) = 0,就意味着这个矩阵无解,没有逆矩阵,此时的矩阵被称为奇异矩阵。
说了这么多,来点例子吧:
可以发现,这个行列式是有逆矩阵的,接下来我们计算他的逆矩阵:
当然,你也可以手动验算(滑稽)
现在我们来看看如何利用这些知识求解方程组,例子如下:
3x-2y = 5
6x-2y = 2
由系数构成的矩阵是:
由答案构成的矩阵是:
这里省去验证逆矩阵存在的过程,直接上公式:
很方便对吧?
有的时候,出题老师会丧心病狂到出那种未知数与方程数完全不相等的多元方程,很明显,这样的方程将会产生无数个解,当然,我们也有办法,令其中的某个未知量为我们想要的数就行了,但是电脑该怎么办
还有一种问题就是出现det(a)=0这种情况。
这个时候,就该请出我们的伪逆矩阵了,不过在那之前,先看这个例子:
假定一个无限解的方程:3x+2y-z = 7
4y+z = 2
在matlab中,可以这样:
现在通过秩来判断这个矩阵是否有解:
然后通过左除来计算他的解:
很明显,matlab通过把其中一个变量设为0来计算这个方程组,只不过要注意的是,方程的解明显不止这一个。
这个时候,有聪明的小伙伴就会问了,我们为什么不试试用逆矩阵计算呢?
结果如下:
怎么样,现在懂了吧
现在我们来试试用伪逆矩阵来计算,对于a,其伪逆矩阵是pinv(a)
matlab使用摩尔·彭罗斯法计算pinv(a)
简化阶梯矩阵
matlab中的rref(a)函数使用高斯·乔丹(Gauss-Jordan)消元法产生矩阵a降阶后的阶梯形式。你可以用手工计算验算这个例子,在matlab中则是这样的:
还记得那个传说中的矩阵魔方矩阵(幻方)嘛?是一个n*n的矩阵,其中矩阵的元素在1到n^2之间,并且行元素的和等于列元素的和。如果你打算手动计算的话可能会算到你脑溢血,不过好在,matlab为我们提供了magic()方法帮我们计算,例如:
然后简化成阶梯形式,不过这个还是交给matlab来做吧
当然,我们不止可以制作一个五阶的行列式,还能是其它形式的,具体的,留给你们来探索吧
矩阵分解
matlab可以快速的对矩阵进行LU(三角)分解、QR(正交三角)分解和SVD(奇异值)分解。在这一节中,我们将看看如何在matlab中进行LU分解以及如何使用它来求解线性方程组。对于一个矩阵,其LU分解在matlab中写成:
[L U] = lu(a)
例如,我们有这样一个矩阵:
a = [-1 2 0;4 1 8;2 7 1]
在matlab中:
我们可以利用L U来计算一个线性方程组,假设a是一个线性方程的系数矩阵,而b = [12;-8;6]
这个方程的解可以通过两次左除得到:x = U\(L\b),就像这样: