计算物理(七)线性代数
fengxiaot Lv4

本文简要介绍如何使用 NumPy 进行矩阵生成、求解特征值与特征向量。

矩阵生成

数组类

NumPy 提供数组类 ndarray ,其定义为

1
class numpy.ndarray

ndarray 对象包括以下重要属性

  • ndarray.ndim - 数组的维数,例如矩阵的 ndim 为 2 ;
  • ndarray.shape - 数组的维度/形状,以整数型元组给出。nnmm 列矩阵的 shape 为 (n,m)
  • ndarray.size - 数组的元素个数;
  • ndarray.dtype - 数组中元素的数据类型;

数组创建

  • numpy.array(array_like_obj, dtype = None) 将列表、元组或其他序列对象,转化并创建为 ndarray 对象;

  • numpy.zeros(shape, dtype = None) 接收数组维度 (shape tuple),并创建全 0 数组,例如 2×22\times 2 零矩阵 np.zeros((2,2))

  • numpy.eye(N, M = None, k = 0) 创建 NNMM 列 ( MM 默认等于 NN ) 单位对角矩阵,对角元上移 kk 个元素;

  • numpy.full(shape, fill_value, dtype = None) 接收数组维度创建数组,并将 fill_value 赋给数组的每个元素;

  • numpy.zeros_like(array_like_obj) 创建一个形状和数据类型与 array_like_obj 均相同的全零数组

  • numpy.arange(start, stop, step, dtype) 生成区间 [start, stop) ,步长为 step 的数组

  • numpy.linspace(start, stop, num = 50, endpoint = True) 生成 [start, stop],样本数量为 num,按照 endpoint 为 True/False 包含/不包含 stop point 的数组,参见以下示例


特征值与特征向量

对于方阵 AA,若存在标量 λ\lambda 和非零向量 v\mathbf{v} 使得

Av=λvA\mathbf{v} = \lambda \mathbf{v}

则称 λ\lambda 为矩阵 AA 的特征值,v\mathbf{v} 为对应的特征向量。

标准特征值问题

一般方阵(可能是非对称、复矩阵)的特征分解使用 numpy.linalg.eig()

1
2
3
A = np.array([[2, 1],
[1, 2]])
eigvals, eigvecs = np.linalg.eig(A)

eigvals 为特征值数组,形状为 (n,)eigvecs 为特征向量矩阵,每一列为一个归一化的特征向量,形状为 (n, n)

以上代码输出

1
2
3
4
Eigenvalues: [3. 1.]
Eigenvectors:
[[ 0.707 -0.707]
[ 0.707 0.707]]

其中第一个特征值为 λ1=3\lambda_1=3 ,对应的特征向量为 12(1,1)T\frac{1}{\sqrt{2}}(1,1)^T;第二个特征值为 λ2=1\lambda_2=1,对应的特征向量为 12(1,1)T\frac{1}{\sqrt{2}}(-1,1)^T

对称矩阵的特征值问题

对于实对称矩阵或厄米矩阵,更推荐使用 numpy.linalg.eigh()

1
2
3
A = np.array([[4, 1],
[1, 3]])
eigvals, eigvecs = np.linalg.eigh(A)

返回的特征值有序,默认从小到大。