Python学习-Scipy库线性代数矩阵运算
目录
1、LU分解
2、西尔维斯特方程
3、建立块对角矩阵
导入库
import numpy as np
1、LU分解
LU分解,矩阵分解的一种,将系数矩阵A转为等价的两个矩阵L、U的乘积,L为单位下三角,U为上三角,是高斯消元法的一种表达式。
在线性代数中已经证明,如果方阵是非奇异的,即的行列式不为0,LU分解总是存在的。
作用:LU分解主要应用在数值分析中,用来解线性方程、求反矩阵或计算行列式。
LU分解函数:linalg.lu()
参数以及返回值说明:
a: 分解矩阵
permute_l:False,执行p*l,返回p、l、u;True,返回pl、u
overwrite_a:是否覆盖a中的数据
check_finite:检查输入矩阵是否具有有限数,有限数可能导致程序崩溃
返回值分析:
permute_l=False时:
p: 置换矩阵(M,M);
l: 具有单位对角线的下三角矩阵(M,K)或梯形矩阵K=min(M,N)
u: 上三角矩阵(K,N)或梯形矩阵
permute_l=True时:
pl: 为(M,K)数组形的置换矩阵K=min(M,N);
u: 上三角矩阵(K,N)或梯形矩阵
# # LU分解
from scipy.linalg import lu
"""
LU分解,矩阵分解的一种,将系数矩阵A转为等价的两个矩阵L、U的乘积,L为单位下三角,U为上三角,是高斯消元法的一种表达式。
在线性代数中已经证明,如果方阵是非奇异的,即的行列式不为0,LU分解总是存在的。
LU分解函数:linalg.lu()
作用:LU分解主要应用在数值分析中,用来解线性方程、求反矩阵或计算行列式。
"""
A = np.arange(1, 17).reshape(4, 4)
p, l, u = lu(a=A, permute_l=False, overwrite_a=False, check_finite=True)
"""
a: 分解矩阵
permute_l:False,执行p*l,返回p、l、u;True,返回pl、u
overwrite_a:是否覆盖a中的数据
check_finite:检查输入矩阵是否具有有限数,有限数可能导致程序崩溃
返回值分析:
permute_l=False时:
p: 置换矩阵(M,M);
l: 具有单位对角线的下三角矩阵(M,K)或梯形矩阵K=min(M,N)
u: 上三角矩阵(K,N)或梯形矩阵
permute_l=True时:
pl: 为(M,K)数组形的置换矩阵K=min(M,N);
u: 上三角矩阵(K,N)或梯形矩阵
"""
print('原矩阵\n', A)
print('p矩阵\n', p)
print('l矩阵\n', l)
print('u矩阵\n', u)
输出
原矩阵
[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]
[13 14 15 16]]
p矩阵
[[0. 1. 0. 0.]
[0. 0. 0. 1.]
[0. 0. 1. 0.]
[1. 0. 0. 0.]]
l矩阵
[[ 1. 0. 0. 0. ]
[ 0.07692308 1. 0. 0. ]
[ 0.69230769 0.33333333 1. 0. ]
[ 0.38461538 0.66666667 -0.5 1. ]]
u矩阵
[[ 1.30000000e+01 1.40000000e+01 1.50000000e+01 1.60000000e+01]
[ 0.00000000e+00 9.23076923e-01 1.84615385e+00 2.76923077e+00]
[ 0.00000000e+00 0.00000000e+00 -1.77635684e-15 -1.77635684e-15]
[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]]
2、西尔维斯特方程:linalg.solve_sylvester()
西尔维斯特方程是控制理论里的矩阵方程,其公式为:AX+XB=C。
其中,A、B是已知的方阵,大小分别为n、m,C也已知;而X、C都是n行、m列的矩阵。
该方程存在唯一解的充分必要条件是A、B没有共同特征值。
主要应用在图像处理领域。
参数介绍:
a:西尔维斯特方程的前导二维矩阵,大小n
b:西尔维斯特方程的尾随二维矩阵,大小m
q:西尔维斯特方程的常数项矩阵,可以是一维或n*m矩阵
返回值x:有解返回n行m列的矩阵,无解返回LinAlgError错误
# 西尔维斯特方程:linalg.solve_sylvester()
from scipy.linalg import solve_sylvester, eig
"""
西尔维斯特方程是控制理论里的矩阵方程,其公式为:AX+XB=C
A、B是已知的方阵,大小分别为n、m,C也已知;而X、C都是n行、m列的矩阵。该方程存在唯一解的充分必要条件是A、B没有共同特征值。
应用在图像处理领域
"""
A = np.arange(9).reshape(3, 3)
v1, _ = eig(A)
print('矩阵A的特征值:', v1)
B = np.array([[1, 2], [3, 4]])
v2, _ = eig(B)
print('矩阵B的特征值:', v2)
C = np.ones((3, 2))
X = solve_sylvester(a=A, b=B, q=C)
"""
a:西尔维斯特方程的前导二维矩阵,大小n
b:西尔维斯特方程的尾随二维矩阵,大小m
q:西尔维斯特方程的常数项矩阵,可以是一维或n*m矩阵
返回值x:有解返回n行m列的矩阵,无解返回LinAlgError错误
"""
print('西尔维斯特方程的解为:\n', X)
输出
矩阵A的特征值: [ 1.33484692e+01+0.j -1.34846923e+00+0.j -2.48477279e-16+0.j]
矩阵B的特征值: [-0.37228132+0.j 5.37228132+0.j]
西尔维斯特方程的解为:
[[ 0.0529132 0.25386445]
[ 0.05826397 0.07728894]
[ 0.06361474 -0.09928656]]
3、建立块对角矩阵:linalg.block_diag()
A = np.array([[1, 0], [0, 1]])
B = np.ones((2, 2))
C = np.array([9])
D = block_diag(A, B, C)
print(D)
输出
[[1. 0. 0. 0. 0.]
[0. 1. 0. 0. 0.]
[0. 0. 1. 1. 0.]
[0. 0. 1. 1. 0.]
[0. 0. 0. 0. 9.]]