9 NumPy求解线性方程
线性代数是数学的一个重要分支。numpy.linalg模块包含线性代数的函数。使用这个模块,我们可以计算逆矩阵、求特征值、解线性方程组以及求解行列式等。
9.1 数学概念
根据矩阵的乘法,可以将线性方程组写成矩阵形式。
1). n元齐次线性方程组 $A_{m\times n}x_n = 0$
2). n元非齐次线性方程组 $A_{m\times n}x_n = b$
3). 称A为方程组的系数矩阵,B=(A,b)为非齐次线性方程组的增广矩阵。
9. 1.1 判定方程有解没解的定理
定理1:n元齐次线性方程组 $A_{m\times n}x_n = 0$有非零解的充分必要条件的系数矩阵A的秩即R(A)<n,当R(A) = n时有0解。
定理2:n元非齐次线性方程组 $A_{m\times n}x_n = b$有解的充分必要条件的系数矩阵A的秩等于增广矩阵B=(A,b)的秩, R(A) = R(A, b) = n有唯一解,R(A) = R(A, b) < n有无穷个解。
9.1.2 NumPy里求秩序函数
Numpy的linalg模块里的matrix_rank函数可以求得矩阵的秩。
import numpy as np
c = np.eye(2, dtype=int)
print c, '# c'
print 'rank->', np.linalg.matrix_rank(c)
程序执行结果:
[[1 0]
[0 1]]# c
rank-> 2
9.2 求方程组的解
9.2.1 solve函数
Numpy的numpy.linalg.solve可以求得线性方程组的解。
from numpy import *
import numpy as np
a = np.array([[8, -6, 2],[-4, 11, -7],[4, -7, 6]])
b = np.array([[28],[-40],[33]])
x = np.linalg.solve(a, b)
print x
print np.allclose(np.dot(a, x), b)
9.2.2 inv函数
inv函数可以求a矩阵的逆矩阵,方程组$Ax = b$的解$x = A^{-1}b$也可求得方程组的解。
from numpy import *
import numpy as np
a = np.array([[8, -6, 2],[-4, 11, -7],[4, -7, 6]])
b = np.array([[28],[-40],[33]])
at = np.linalg.inv(a)
print at.dot(b)
9.3 linalg里的其他函数
在numpy.linalg模块里还有很多有用的函数,例如det求行列式值、使用eig函数求解特征值和特征向量、eigvals函数可以计算矩阵的特征值、lstsq 函数可以计算Ax = b的最小二乘解、qr函数等。
另外svd函数可以对矩阵进行奇异值分解。该函数返回3个矩阵:U、Sigma和V,其中U和V是正交矩阵,Sigma包含输入矩阵的奇异值。