初等矩阵和矩阵可逆性
之前的笔记中曾提及过矩阵的逆的概念,但是并没有具体说明矩阵的逆的求法。
求解矩阵的逆
矩阵的逆运算
矩阵中 A B = B A = I AB=BA=I AB=BA=I,则称B是A的逆矩阵,记为 B = A − 1 B=A^{-1} B=A−1。只有方阵才有逆矩阵。
求解逆矩阵以下面的例子作为引入,
因为Gauss-Jordan消元法是针对系数矩阵进行操作,而结果矩阵是随着系数矩阵的变化而变化的,所以可以将增广矩阵进一步变化,
( 1 2 ∣ 1 0 3 4 ∣ 0 1 ) ⟹ ( 1 0 ∣ x 11 x 12 0 1 ∣ x 21 x 22 ) \begin{pmatrix}1&2&|&1&0\\3&4&|&0&1\end{pmatrix}\Longrightarrow\begin{pmatrix}1&0&|&x_{11}&x_{12}\\0&1&|&x_{21}&x_{22}\end{pmatrix} (1324∣∣1001)⟹(1001∣∣x11x21x12x22)
即左侧是系数矩阵,右侧是与之同形的单位矩阵,经过Gauss-Jordan消元法将左侧的系数矩阵化为行最简形式,如果化为行最简形式后左侧是一个单位矩阵,此时对应着唯一解的情况。上面的过程可以使用符号语言表示为,
( A ∣ I ) ⟹ ( I ∣ A − 1 ) \begin{pmatrix}&A&|&I&\end{pmatrix}\Longrightarrow\begin{pmatrix}&I&|&A^{-1}&\end{pmatrix} (A∣I)⟹(I∣A−1)
矩阵的逆不可能存在无穷解,即一个方阵不可能存在无数个逆矩阵,只有存在一个逆矩阵或不存在逆矩阵这两种情况。
原因说明:
1.因为线性系统存在无穷解的情况可以看作是增广矩阵的最后一行为全0时对应的情况,但是求解逆矩阵时,增广矩阵右方是单位矩阵,不可能出现最下方的行为全0的情况。2.当系数矩阵化为行最简形式后存在0行时,此时不存在逆矩阵。
上面的求解矩阵的逆的方式仅仅求取的是矩阵的右逆,与最开始矩阵的逆的定义相比,这看似是不严谨的。但是,另一个性质说明这种求取方式得到的结果是正确的,“如果一个方阵A有右逆B,则B也是A的左逆,即B是A的逆”。(以后给出证明)
实现矩阵的逆
求解矩阵的逆的过程本质上也是求解一个线性系统,只不过在一般的线性系统中,增广矩阵的右侧是一个列向量,而求逆时,增广矩阵的右侧是一个矩阵。所以依旧是在之前笔记的 LinearSystem类的基础上进行改造,
# -*- coding: utf-8 -*-
from .matrix import Matrix
from .vector import Vector
from ._global import EPSILON
class LinearSystem:
def __init__(self, A, b):
self._m = A.row_num()
self._n = A.col_num()
# 对构造方法进行如下修改
if isinstance(b, Vector):
self.Ab = [Vector(A.row_vector(i).underlying_list() + [b[i]]) for i in range(self._m)]
if isinstance(b, Matrix):
self.Ab = [Vector(A.row_vector(i).underlying_list() + b.row_vector(i).underlying_list() for i in range(self._m)]
self.pivots = []
def _forward(self):
......
def _backward(self):
......
# 对Gauss-Jordan消元法的返回值进行修改
def gauss_jordan_elimination(self):
self._forward()
self._backward()
# 检查系数矩阵为0时,结果矩阵不为0。此时是无解的情况
for i in range(len(self.pivots, self._m):
if not abs(self.Ab[i][-1]) < EPSILON:
return False
return True
def inv(A):
"""求解矩阵的逆"""
if A.row_num() != A.col_num():
return None
n = A.row_num()
ls = LinearSystem(A, Matrix.identity(n))
if not ls.gauss_jordan_elimination():
return None
invA = [[row[i] for i in range(n, 2*n)] for row in ls.Ab]
return Matrix(invA)
初等矩阵
矩阵的初等变换及初等矩阵
以该矩阵乘法进行说明,
( 1 0 0 0 1 0 0 0 1 ) ⋅ ( a b c d e f g h i ) = ( a b c d e f g h i ) \begin{pmatrix}1&0&0\\0&1&0\\0&0&1\end{pmatrix}\cdot \begin{pmatrix}a&b&c\\d&e&f\\g&h&i\end{pmatrix}= \begin{pmatrix}a&b&c\\d&e&f\\g&h&i\end{pmatrix}\\ ⎝⎛100010001⎠⎞⋅⎝⎛adgbehcfi⎠⎞=⎝⎛adgbehcfi⎠⎞
- 矩阵的某一行乘以一个常数
( k 0 0 0 1 0 0 0 1 ) ⋅ ( a b c d e f