矩阵分解(一)——三角分解

矩阵一些术语

奇异矩阵(降秩矩阵)

矩阵A是方阵,且该矩阵的秩不是满秩。

  • 性质

1、矩阵A的行列式等于0
2、如果A为奇异矩阵,则AX=0有无穷解,AX=b有无穷解或者无解

非奇异矩阵(满秩矩阵)

矩阵A是方阵,且该矩阵的秩是满秩。

  • 性质

1、矩阵A的行列式不等于0
2、由|A|≠0可知矩阵A可逆
3、AX=0有且只有唯一零解,AX=b有唯一解

矩阵的顺序主子式

设A为 阶矩阵,矩阵A的n阶顺序主子式为:

对角矩阵、上三角矩阵、下三角矩阵

  • 对角矩阵

主队角元素非零,其他元素都是0.

  • 数量矩阵

主队角元素相同的对角矩阵

  • 单位矩阵

主队角元素都为1的对角矩阵

  • 上三角矩阵

主对角线以下都是零的方阵称为上三角矩阵。
性质:
1、具有行列式为对角线元素相乘
2、上三角矩阵间的加减法和乘法运算的结果仍是上三角矩阵
3、上三角矩阵的逆矩阵也仍然是上三角矩阵
4、其逆矩阵对角线上的元素恰好是对应的原矩阵对角线上元素的倒数
5、与对角矩阵相乘结果还是上三角矩阵

  • 下三角矩阵

主对角线以上都是零的方阵称为上三角矩阵。

高斯消去法矩阵描述(LU分解)

局限:仅能解决各主元素不为0的情况

设有n元线性方程组:

它写成矩阵形式为:Ax=b

如果A是非奇异矩阵,自然有解的紧凑形式x=A-1b。但当n很大时,用公式来计算A-1的元素是非常困难的。这也就是解线性方程组的Gauss消去法的产生原因,便于求解。

  • 步骤
  1. 设A(0)=A ,b(0)=b
  2. 将矩阵的第 i 行分别减去矩阵第一行的倍数C = ai1(0)/a11(0),(i = 1、2……、n)即构造消元矩阵L,其中ci1 = ai1(0)/a11(0)

    于是可得到:
  3. 接着将步骤2得到的A(1),将矩阵的第 i 行分别减去矩阵第一行的倍数C= ai2(0)/a22(0),即构造第二个消元矩阵L2,其中ci2 = ai2(0)/a22(0)

    于是可得到:
  4. 重复下去,只要主对角线没有出现零值,一直到n-1步后,可得到

    可得:Ln-1…L2L1A(0)=A(n-1)
    所以: A = A(0) = L1-1 L2-1 …Ln-1-1A(n-1) = LA(n-1),其中L = L1-1 L2-1 …Ln-1-1

    L是一个主对角元都是1的下三角矩阵,称为单位下三角矩阵。我们记U=A(n-1),则U是一个上三角矩阵,并且这时得到A的分解为:
    A = LU (L是单位下三角矩阵,U是上三角矩阵)
  5. 因为Ax = b,且A = LU ,设y = L-1b,则可得到下面两个方程:
    y = L-1b (下三角方程组) 、Ux = y (上三角方程组)
  6. 向前消去法:对于y = L-1b,其第1个方程只含y1,第2个方程只含y1和y2……也可以一个个地逐次求出y1,y2,…,yn
  7. 向后回代法:对于Ux = y,其第n个方程只含xn,第n-1个方程只含xn和xn-1……因而可以一个个地依次求出xn,xn-1,…,x1,从而解出式中的解。

代码展示

matrix_a = np.mat([[1,4,7],[2,5,8],[3,6,11]],dtype=float)   #系数矩阵A(3, 3)
matrix_b = np.mat([1,1,1]).T #常数向量b(3,1)
new_mat = np.hstack((matrix_a, matrix_b))  #增广矩阵
for i in range(0,new_mat.shape[0]-1): 
    if matrix_a[i,i] == 0: #如果主对角线值为0,终止
        print("error:主对角线值为0")
        break
    else:
        for j in range(i+1,new_mat.shape[0]):
            new_mat[j:j+1,:] =  new_mat[j:j+1,:] - new_mat[i,:]*(new_mat[j,i]/new_mat[i,i]) #将矩阵的第 i 行分别减去矩阵第一行的倍数C = ai1(0)/a11(0)
new_mat #得到A(n-1)和b(n-1)的增广矩阵
len_x = matrix_a.shape[0] #3
x = np.mat(np.zeros(len_x),np.float)   #(1,3),存放解
x[0,len_x-1] = new_mat[len_x-1,len_x] / new_mat[len_x-1,len_x-1] #上三角矩阵,先求出xn的值
for i in range(len_x-2,-1,-1):  #会带过程
    try:
        x[0,i] = (new_mat[i,len_x] - np.sum(np.multiply(new_mat[i,i+1:len_x],x[0,i+1:len_x]))) / new_mat[i,i]
    except:
        print("error")

x = matrix([[-0.33333333, 0.33333333, 0. ]])
new_mat = matrix([[ 1., 4., 7., 1.],
[ 0., -3., -6., -1.],
[ 0., 0., 2., 0.]])

矩阵的三角分解 (LU、LDU)

定义: 设矩阵A∈Cn×n,如果方阵A可分解成一个下三角矩阵K和一个上三角矩阵U的乘积,即A=KU,则称A可做三角分解。如果A可分解成一个单位下三角(即主角线上元素皆为1)矩阵L和一个上三角矩阵U的乘积,即A=LU,则称A可做LU分解。如果A可分解成A=LDU,其中L是单位下三角矩阵,D是对角矩阵,U是单位上三角矩阵,则称A可做LDU分解

由定义,我们首先指出:一个方阵的三角分解并不唯一。因为若A=KU是一个三角分解,那么取D是同阶的非奇异对角矩阵,则有下三角矩阵 K ~ \widetilde{K} K =KD,上三角矩阵 U ~ \widetilde{U} U = D-1U,则:

因此也是A = K ~ \widetilde{K} K U ~ \widetilde{U} U 也是 一个三角分解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值