Files
notes_estom/Python/scipy/8linalg.md
2020-10-07 20:26:19 +08:00

3.8 KiB
Raw Permalink Blame History

线性代数

简介

SciPy是使用优化的ATLAS LAPACK和BLAS库构建的。 它具有非常快的线性代数能力。 所有这些线性代数例程都需要一个可以转换为二维数组的对象。 这些例程的输出也是一个二维数组。

SciPy.linalg与NumPy.linalg

scipy.linalg包含numpy.linalg中的所有函数。 另外scipy.linalg还有一些不在numpy.linalg中的高级函数。 在numpy.linalg上使用scipy.linalg的另一个优点是它总是用BLAS/LAPACK支持编译而对于NumPy这是可选的。 因此根据NumPy的安装方式SciPy版本可能会更快。

线性方程组

数学实例

scipy.linalg.solve特征为未知的xy值求解线性方程a * x + b * y = Z。 作为一个例子,假设需要解下面的联立方程。

x+3y+5z=10
2x+5y+z=8
2x+3y+8z=3

要求解xyz值的上述方程式可以使用矩阵求逆来求解向量如下所示。


A[x,y,z]^T=[10,8,3]^T\\
[x,y,z]^T=A^{-1}[10,8,3]^T

编程实现

但是最好使用linalg.solve命令该命令可以更快更稳定。求解函数采用两个输入'a'和'b',其中'a'表示系数,'b'表示相应的右侧值并返回解矩阵。

#importing the scipy and numpy packages
from scipy import linalg
import numpy as np

#Declaring the numpy arrays
a = np.array([[3, 2, 0], [1, -1, 0], [0, 5, 1]])
b = np.array([2, 4, -1])

#Passing the values to the solve function
x = linalg.solve(a, b)

#printing the result array
print (x)

执行上面示例代码,得到以下结果

[ 2. -2.  9.]

行列式

方阵A的行列式通常表示为| A |并且是线性代数中经常使用的量。 在SciPy中这是使用det()函数计算的。 它将矩阵作为输入并返回一个标量值。

#importing the scipy and numpy packages
from scipy import linalg
import numpy as np

#Declaring the numpy array
A = np.array([[1,2],[3,4]])

#Passing the values to the det function
x = linalg.det(A)

#printing the result
print (x)

# 执行上面示例代码,得到以下结果 - 
-2.0

特征值和特征向量特征值

特征向量问题是最常用的线性代数运算之一。 我们可以通过考虑以下关系式来找到方阵(A)的特征值(λ)和相应的特征向量(v)

Av = λv

scipy.linalg.eig从普通或广义特征值问题计算特征值。 该函数返回特征值和特征向量。

#importing the scipy and numpy packages
from scipy import linalg
import numpy as np

#Declaring the numpy array
A = np.array([[1,2],[3,4]])

#Passing the values to the eig function
l, v = linalg.eig(A)

#printing the result for eigen values
print (l)

#printing the result for eigen vectors
print (v)

执行上面示例代码,得到以下结果 -

[-0.37228132+0.j  5.37228132+0.j]
[[-0.82456484 -0.41597356]
 [ 0.56576746 -0.90937671]]

奇异值分解奇异值分解(SVD)

可以被认为是特征值问题扩展到非矩阵的矩阵。 scipy.linalg.svd将矩阵'a'分解为两个酉矩阵'U'和'Vh',以及一个奇异值(实数,非负)的一维数组's'使得a == U * S * Vh其中'S'是具有主对角线's'的适当形状的零点矩阵。

#importing the scipy and numpy packages
from scipy import linalg
import numpy as np

#Declaring the numpy array
a = np.random.randn(3, 2) + 1.j*np.random.randn(3, 2)

#Passing the values to the eig function
U, s, Vh = linalg.svd(a)

# printing the result
print (U, Vh, s)

# 执行上面示例代码,得到以下结果 - 
[[-0.60142679+0.28212127j  0.35719830-0.03260559j  0.61548126-0.22632383j]
 [-0.00477296+0.44250532j  0.64058557+0.15734719j -0.40414313+0.45357092j]
 [ 0.46360086+0.38462177j -0.18611686+0.6337182j   0.44311251+0.06747886j]] [[ 0.98724353+0.j         -0.01113675+0.15882756j]
 [-0.15921753+0.j         -0.06905445+0.9848255j ]] [ 2.04228408  1.33798044]