第一章 线性代数 (Linear Algebra)#

[18]:
# 本章代码通过numpy展示,导入numpy库
import numpy as np
from scipy import linalg as la

1 向量#

1.1 向量 (vector)#

具有大小和方向的量,用 \(\vert v\rangle\) 表示列向量,\(\langle v\vert\) 表示行向量。

[59]:
# 下面是一个二维向量的例子

print("行向量:")
print(np.array([2, 3]))

print()

print("列向量:")
print(np.array([[2], [3]]))
行向量:
[2 3]

列向量:
[[2]
 [3]]

1.2 线性无关(linear independent)#

在线性代数里,一组向量中\(A: a_1, a_2, ... a_n\),没有向量可以通过其他向量的线性组合而得到,我们称这一组向量为线性无关。

公式上,如果只存在\(k_1,k_2, \cdots k_n\)全为0的一组解满足

\[k_1 a_1 + k_2 a_2 + \cdots k_n a_n = 0\]

则向量组\(A\)是线性无关。

[60]:
A = (np.array([[1, 0, 0]]), np.array([[1, 1, 0]]), np.array([[1, 0, 1]]))

# 或者一般我们写成矩阵的形式

np.array([[1, 1, 0], [0, 1, 0], [0, 0, 1]])
[60]:
array([[1, 1, 0],
       [0, 1, 0],
       [0, 0, 1]])

1.3 基 (Basis)#

在线性空间中,一组向量 \(\{ |v_0\rangle, |v_1\rangle, ...\} \in \mathbb{C}^m\) 的所有线性组合(span)的集合叫 \(\mathbb{C}^m\)的子空间(subspace).

如果这一组向量是线性无关的,那么这组向量是所有线性组合所构成的子空间中的基。

假设一组向量是基,那么基中的向量的个数 <= \(m\),反之,向量个数大于所在空间维度则一定不是基。

2. 矩阵 (matrix)#

数学上,一个\(m \times n\)的矩阵是一个由\(m\)\(n\)列元素排列成的矩阵阵列。矩阵可以将向量进行线性变换:

\[|v\rangle \rightarrow | v^{\prime} \rangle = M |v\rangle\]
[61]:
M = np.array([[1, 2], [2, 1]])

v = np.array([1, 2])

np.matmul(M, v)
[61]:
array([5, 4])

2.1 矩阵相乘#

\(A\)\(m \times n\)的矩阵,\(B\)\(n \times p\)的矩阵,则他们的乘积\(AB\)(有时记作\(A \cdot B\))是一个\(m \times p\)的矩阵,记作\(C = A \cdot B\),其中矩阵\(C\)中的第\(i\)行第\(j\)列元素可以表示为:

\[C_{ij} = (AB)_{ij} = a_{i1}b_{1j} + a_{i2}b_{2j} + \cdots + a_{in}b_{nj} = \sum_{r=1}^na_{ir}b_{rj}\]
[62]:
A = np.array([[1, 2], [2, 1]])

B = np.array([[0, 1], [1, 0]])

np.matmul(A, B)
[62]:
array([[2, 1],
       [1, 2]])

2.2 内积(inner product)#

內积可以看成是一种特殊的矩阵乘法。对于在希尔伯特空间中的两个向量\(|a\rangle\)\(|b\rangle\)\(\langle a | b \rangle\)表示它们的内积,\(\langle a|\)定义为向量\(|a\rangle\)的共轭转置(conjugate transpose),也可以记作\(|a\rangle^\dagger\),有

\[\begin{split}\langle a|b \rangle = (a_1^*, a_2^*, \cdots, a_n^*)\left( \begin{array}{c} b_1 \\ b_2 \\ \vdots \\ b_n \\ \end{array} \right) = a_1^*b_1 + a_2^*b_2 + \cdots + a_n^*b_n\end{split}\]

​此处\(*\)表示共轭复数(对于实数\(a\)\(b\)\(a+ib\)的共轭复数是\(a-ib\))。

[63]:
base = np.arange(3)

a = base - 1j * base
b = base - 2j * base

print("向量 a:")
print(a)
print("向量 b:")
print(b)

print("a的共轭转置:")
print(a.conj().T)
np.inner(a.conj().T, b)
向量 a:
[0.+0.j 1.-1.j 2.-2.j]
向量 b:
[0.+0.j 1.-2.j 2.-4.j]
a的共轭转置:
[0.-0.j 1.+1.j 2.+2.j]
[63]:
(15-5j)

2.3 外积(outer product)#

\(| a \rangle \langle b |\)表示希尔伯特空间中两个向量的外积,有

\[\begin{split}|a \rangle \langle b| = \begin{pmatrix} a_1 \\ a_2 \\ \vdots \\ a_n \\ \end{pmatrix}(b_1^*, b_2^*, \cdots, b_n^*) = \begin{pmatrix} a_1b_1^* & a_1b_2^* & \cdots & a_1b_n^* \\ a_2b_1^* & a_2b_2^* & & \vdots \\ \vdots & & \ddots & \vdots \\ a_nb_1^* & \cdots & \cdots & a_nb_n^* \\ \end{pmatrix}\end{split}\]
[64]:
np.outer(a, b.conj().T)
[64]:
array([[ 0.+0.j,  0.+0.j,  0.+0.j],
       [ 0.-0.j,  3.+1.j,  6.+2.j],
       [ 0.-0.j,  6.+2.j, 12.+4.j]])

2.4 张量积(tensor product)#

\(| a \rangle \otimes | b \rangle\)表示希尔伯特空间中两个向量的张量积,有

\[\begin{split}|a \rangle \otimes |b \rangle = \begin{pmatrix} a_1 \begin{pmatrix} b_1 \\ b_2 \end{pmatrix} \\ a_2 \begin{pmatrix} b_1 \\ b_2 \end{pmatrix} \\ \end{pmatrix} = \begin{pmatrix} a_1b_1 \\ a_1b_2 \\ a_2b_1 \\ a_2b_2 \\ \end{pmatrix}\end{split}\]
[65]:
np.kron(a, b)
[65]:
array([ 0. +0.j,  0. +0.j,  0. +0.j,  0. +0.j, -1. -3.j, -2. -6.j,
        0. +0.j, -2. -6.j, -4.-12.j])

矩阵\(A\)\(B\)的张量积,有

\[\begin{split}A \otimes B = \begin{pmatrix} a_{11}B & \cdots & a_{1n}B \\ \vdots & \ddots & \vdots \\ a_{m1}B & \cdots & a_{mn}B \\ \end{pmatrix}\end{split}\]
[66]:
np.kron(np.eye(2), np.ones((2, 2)))
[66]:
array([[1., 1., 0., 0.],
       [1., 1., 0., 0.],
       [0., 0., 1., 1.],
       [0., 0., 1., 1.]])

2.5 正交完备集#

  1. 集合只含有单位向量(向量长度为1)

  2. 两两向量之间的内积都为0

以下就是一组正交完备集。

[67]:
v = np.array([[1, 0, 0], [0, 1, 0], [0, 0, 1]])
v
[67]:
array([[1, 0, 0],
       [0, 1, 0],
       [0, 0, 1]])
[68]:
print(np.dot(v[0], v[1]))
print(np.dot(v[1], v[2]))
print(np.dot(v[0], v[2]))

print(np.linalg.norm(v[0]))
print(np.linalg.norm(v[1]))
print(np.linalg.norm(v[2]))
0
0
0
1.0
1.0
1.0

3. 特殊矩阵#

3.1 可逆矩阵#

给定一个\(n\)阶方阵\(A\),若存在一\(n\)阶方阵\(B\),使得\(AB = BA = I_n\),其中\(I_n\)\(n\)阶单位矩阵,则称\(A\)是可逆的,且\(B\)\(A\)的逆矩阵,记作\(A^{-1}\)

[3]:
A = np.array(np.arange(4).reshape((2, 2)))
B = np.linalg.inv(A)

print(A)
print(B)
print(A @ B)
[[0 1]
 [2 3]]
[[-1.5  0.5]
 [ 1.   0. ]]
[[1. 0.]
 [0. 1.]]

3.2 转置(transpose)#

矩阵\(A\)的转置是另一个矩阵\(A^T\),由下列等价动作建立:

  • \(A\)的横行写为\(A^T\)的纵列

  • \(A\)的纵列写为\(A^T\)的横行

形式上说,\(m \times n\)矩阵的转置是\(n \times m\)的矩阵。

[70]:
print(A)
print(A.T)
[[0 1]
 [2 3]]
[[0 2]
 [1 3]]

3.3 共轭转置(conjugate transpose)#

矩阵\(A\)的共轭转置\(A^\dagger\)是通过对矩阵A转置后再将所有元素替换为各自的共轭复数得到的。

[71]:
C = A + 1j * A
print(C)
print(C.conj().T)
[[0.+0.j 1.+1.j]
 [2.+2.j 3.+3.j]]
[[0.-0.j 2.-2.j]
 [1.-1.j 3.-3.j]]

3.4 厄米矩阵(Hermitian matrix)#

\(H\)是一个厄米矩阵,满足

\[H = H^\dagger,\]

也就是 \(H_{ij} = H_{ji}^*\)

[72]:
H = np.array([[3, 3 - 2j], [3 + 2j, 2]])

H.conj().T
[72]:
array([[3.-0.j, 3.-2.j],
       [3.+2.j, 2.-0.j]])

3.5 幺正矩阵(unitary matrix)#

\(U\) 是一个幺正矩阵,满足

\[UU^\dagger = I,\]

也就是

\[\sum_j U_{ij}U^*_{jk} = \delta_{ik}.\]

幺正矩阵的各行和各列可以看做正交完备向量组。 幺正矩阵作用在向量上,向量的长度不变。

[73]:
# 幺正矩阵例子
U = np.array([[1 + 1j, 1 - 1j], [1 - 1j, 1 + 1j]]) / 2

np.matmul(U, U.conj().T)
[73]:
array([[1.+0.j, 0.+0.j],
       [0.+0.j, 1.+0.j]])

4. 矩阵本征分解#

\[A|v \rangle = \lambda|v \rangle\]

符合上式的向量\(|v \rangle\)是矩阵A的特征向量(eigenvector),\(\lambda\)是与特征向量对应的特征值(eigenvalue)。值得注意的是,任意满足\(AA^\dagger = A^\dagger A\)的矩阵可以进行以下分解:

\[A = \sum_j \lambda_j|v_j\rangle\langle v_j|\]

其中,\(\lambda_j\)\(A\)的第\(j\)个本征值,\(|v_j\rangle\) 是是其对应的本征向量,且\(\{|v_j\rangle\}\)构成正交归一的基。

[74]:
A = np.array([[0, -1j], [1j, 0]])

print(np.matmul(A, A.conj().T))
print(np.matmul(A.conj().T, A))

w, v = np.linalg.eigh(A)
# 验证第一对特征值和特征向量,第四部分会进行讲解
print(np.dot(A, v[:, 0]) - w[0] * v[:, 0])
# 验证第二对特征值和特征向量
print(np.dot(A, v[:, 1]) - w[1] * v[:, 1])
[[1.+0.j 0.+0.j]
 [0.+0.j 1.+0.j]]
[[1.+0.j 0.+0.j]
 [0.+0.j 1.+0.j]]
[0.+0.j 0.+0.j]
[0.+0.j 0.+0.j]

5. 矩阵函数#

矩阵函数根据泰勒展开定义(对于矩阵,乘法和加法有定义,而泰勒展开中只有这两种计算) 特殊的对于 Hermitian 矩阵 A,我们有对角化 \(A = U^\dagger \Lambda U\) ,其中 \(\Lambda_{ij} = (\lambda_i)\delta_{ij}\) 是对角矩阵。那么我们有 \(f(A) = U^\dagger f(\Lambda) U\), 其中 \(f(\Lambda)_{ij} = f(\lambda_i)\delta_{ij}\) .

例子:根据以上矩阵函数定义,分析对于矩阵欧拉公式是否成立 何时成立 \(e^{ix} = \cos(x)+i\sin(x)\)

[4]:
X = np.array([[0, 1.0], [1.0, 0]])
Z = np.array([[1.0, 0], [0, -1.0]])
[21]:
e, U = np.linalg.eigh(X)
print(U)
[[-0.70710678  0.70710678]
 [ 0.70710678  0.70710678]]
[27]:
lbd = U.conj().T @ X @ U
np.testing.assert_allclose(np.diag(e), lbd, atol=1e-8)
print(lbd)
cos1 = la.cosm(X)
print(cos1)
cos2 = U @ np.diag(np.cos(e)) @ U.conj().T
print(cos2)
np.testing.assert_allclose(cos1, cos2, atol=1e-8)
[[-1.00000000e+00 -2.23711432e-17]
 [ 2.23711432e-17  1.00000000e+00]]
[[0.54030231 0.        ]
 [0.         0.54030231]]
[[5.40302306e-01 2.28559205e-17]
 [2.28559205e-17 5.40302306e-01]]
[23]:
np.sin(Z), la.sinm(Z)
[23]:
(array([[ 0.84147098,  0.        ],
        [ 0.        , -0.84147098]]),
 array([[ 0.84147098,  0.        ],
        [ 0.        , -0.84147098]]))