MINIBLOG

Blog Note Tags Links About
Home Search
Mar 16, 2026
miniyuan

解线性方程组的直接法(Gauss 消去法、列主元消去法)


概述

对于 nnn 阶线性代数方程组:

Ax=b\mathbf A \mathbf x = \mathbf bAx=b

其中 A∈Rn×n\mathbf A\in\mathbb{R}^{n\times n}A∈Rn×n 且非奇异,x,b∈Rn\mathbf x,\mathbf b\in\mathbb{R}^nx,b∈Rn.

直接法是指,通过有限次确定的算术运算得到舍入误差以内精确的数值解。


常见矩阵结构

  • 对角矩阵:A=diag⁡(a11,…,ann)\mathbf A=\operatorname{diag}(a_{11},\dots,a_{nn})A=diag(a11​,…,ann​)。
  • 三对角矩阵(tridiagonal):仅在主对角线及其上下各一条对角线非零。
  • 上/下三角矩阵:上三角 U\mathbf UU、下三角 L\mathbf LL;
  • 单位三角矩阵:对角线元素全为1。
  • 对称/正定矩阵:A⊤=A\mathbf A^\top=\mathbf AA⊤=A,且 x⊤Ax>0\mathbf x^\top \mathbf A \mathbf x>0x⊤Ax>0(正定),或 ≥0\ge0≥0(半正定)。
  • 正交矩阵:Q⊤=Q−1\mathbf Q^\top = \mathbf Q^{-1}Q⊤=Q−1。

注:这些结构(稠密性)会影响解法选择与复杂度。


GAUSS 消去法

通过初等行变换将 A\mathbf AA 化为上三角矩阵 U\mathbf UU,再回代求解 x\mathbf xx。

GAUSS 消去法思想

按列逐步消元。

  • 在第 kkk 步,用第 kkk 行消去第 kkk 列下面的元素,使得第 kkk 列除对角元外均为 0。
  • 对 k=1,2,…,n−1k=1,2,\dots,n-1k=1,2,…,n−1 分别操作,最终得到上三角矩阵 U\mathbf UU 与相应的右端项 b~\tilde {\mathbf b}b~,再通过回代得到解。

数学基础:SWM 公式

Sherman–Morrison–Woodbury 公式:

(A+UV⊤)−1=A−1−A−1U(I+V⊤A−1U)−1V⊤A−1.(\mathbf A+\mathbf U\mathbf V^\top)^{-1} = \mathbf A^{-1} - \mathbf A^{-1} \mathbf U (\mathbf I + \mathbf V^\top \mathbf A^{-1} \mathbf U)^{-1} \mathbf V^\top \mathbf A^{-1}.(A+UV⊤)−1=A−1−A−1U(I+V⊤A−1U)−1V⊤A−1.

其中 A∈Rn×n\mathbf A \in \mathbb R^{n \times n}A∈Rn×n 是可逆阵,U,  V∈Rn×k\mathbf U, \; \mathbf V \in \mathbb R^{n \times k}U,V∈Rn×k

证明: 构造块矩阵 M\mathbf MM:

(AUV⊤−I)\begin{pmatrix} \mathbf A & \mathbf U \\ \mathbf V^\top & -\mathbf I \end{pmatrix}(AV⊤​U−I​)

将其对角化,可得恒等式:

(AUV⊤−I)=(I0V⊤A−1I)(A00−I−V⊤A−1U)(IA−1U0I)\begin{pmatrix} \mathbf A & \mathbf U \\ \mathbf V^\top & -\mathbf I \end{pmatrix} = \begin{pmatrix} \mathbf I & \mathbf 0 \\ \mathbf V^\top \mathbf A^{-1} & \mathbf I \end{pmatrix} \begin{pmatrix} \mathbf A & \mathbf 0 \\ \mathbf 0 & -\mathbf I - \mathbf V^\top \mathbf A^{-1} \mathbf U \end{pmatrix} \begin{pmatrix} \mathbf I & \mathbf A^{-1}\mathbf U \\ \mathbf 0 & \mathbf I \end{pmatrix}(AV⊤​U−I​)=(IV⊤A−1​0I​)(A0​0−I−V⊤A−1U​)(I0​A−1UI​)

对 M\mathbf MM 直接求逆,并取左上角块得:

M1,1−1=(A+UV⊤)−1\mathbf M_{1, 1}^{-1} = (\mathbf A + \mathbf U\mathbf V^\top)^{-1}M1,1−1​=(A+UV⊤)−1

对恒等式右侧分别求逆并相乘得:

M−1=(I−A−1U0I)(A−100−(I+V⊤A−1U)−1)(I0−V⊤A−1I)\mathbf M^{-1} = \begin{pmatrix} \mathbf I & -\mathbf A^{-1}\mathbf U \\ \mathbf 0 & \mathbf I \end{pmatrix} \begin{pmatrix} \mathbf A^{-1} & \mathbf 0 \\ \mathbf 0 & -(\mathbf I + \mathbf V^\top \mathbf A^{-1} \mathbf U)^{-1} \end{pmatrix} \begin{pmatrix} \mathbf I & \mathbf 0 \\ -\mathbf V^\top \mathbf A^{-1} & \mathbf I \end{pmatrix}M−1=(I0​−A−1UI​)(A−10​0−(I+V⊤A−1U)−1​)(I−V⊤A−1​0I​)

故

M1,1−1=A−1−A−1U(I+V⊤A−1U)−1V⊤A−1\mathbf M_{1, 1}^{-1} = \mathbf A^{-1} - \mathbf A^{-1} \mathbf U (\mathbf I + \mathbf V^\top \mathbf A^{-1} \mathbf U)^{-1} \mathbf V^\top \mathbf A^{-1}M1,1−1​=A−1−A−1U(I+V⊤A−1U)−1V⊤A−1

矩阵视角下的 GAUSS 消去法

消元可以用矩阵乘法描述。定义第 kkk 步的消元矩阵:

Mk=I−mkek⊤,\mathbf M_k = \mathbf I - \mathbf m_k \mathbf e_k^\top,Mk​=I−mk​ek⊤​,

其中向量

mk=[0,…,0, mk+1,k,…,mn,k]⊤,mj,k=aj,k(k)ak,k(k),  j=k+1,…,n,\mathbf m_k = [0,\dots,0,\,m_{k+1,k},\dots,m_{n,k}]^\top,\quad m_{j,k}=\frac{a^{(k)}_{j,k}}{a^{(k)}_{k,k}},\; j=k+1,\dots,n,mk​=[0,…,0,mk+1,k​,…,mn,k​]⊤,mj,k​=ak,k(k)​aj,k(k)​​,j=k+1,…,n,

且 ek\mathbf e_kek​ 是第 kkk 个标准基向量。

第 kkk 步变换为左乘(行变换) Mk\mathbf M_kMk​:A(k+1)=MkA(k)\mathbf A^{(k+1)} = \mathbf M_k \mathbf A^{(k)}A(k+1)=Mk​A(k)。经过 n−1n-1n−1 步:

A(n)=Mn−1⋯M2M1A(1)≡U\mathbf A^{(n)} = \mathbf M_{n-1} \cdots \mathbf M_2 \mathbf M_1 \mathbf A^{(1)} \equiv \mathbf UA(n)=Mn−1​⋯M2​M1​A(1)≡U

且每个 Mk\mathbf M_kMk​ 可逆。

由 k=1k = 1k=1 时的 SWM 公式:

(A+uv⊤)−1=A−1−A−1uv⊤A−11+v⊤A−1u(\mathbf A+\mathbf u\mathbf v^\top)^{-1} = \mathbf A^{-1}-\frac{\mathbf A^{-1} \mathbf u \mathbf v^\top \mathbf A^{-1}}{1+\mathbf v^\top \mathbf A^{-1} \mathbf u}(A+uv⊤)−1=A−1−1+v⊤A−1uA−1uv⊤A−1​

取 A=I\mathbf A=\mathbf IA=I,u=−mk\mathbf u=-\mathbf m_ku=−mk​, v=ek\mathbf v=\mathbf e_kv=ek​,则有(虽然好像可以直接验证 www):

Mk−1=I+mkek⊤\mathbf M_k^{-1}=\mathbf I + \mathbf m_k \mathbf e_k^\topMk−1​=I+mk​ek⊤​

令

L=M1−1M2−1⋯Mn−1−1\mathbf L = \mathbf M_1^{-1} \mathbf M_2^{-1}\cdots \mathbf M_{n-1}^{-1}L=M1−1​M2−1​⋯Mn−1−1​

则得到标准的 LU 分解

A=LU\mathbf A = \mathbf L \mathbf UA=LU

其中 L\mathbf LL 为单位下三角矩阵,U\mathbf UU 为上三角矩阵。

注: 有趣的时,此处 L\mathbf LL 的第 (j,k)(j,k)(j,k) 元就是在第 kkk 步用来消去 aj,ka_{j,k}aj,k​ 的乘子 mj,km_{j,k}mj,k​,也即 L\mathbf LL 就是把之前各消元矩阵中乘子放在对应位置拼成的矩阵。注意符号!

L=(1m211m31m321⋮⋮⋱⋱mn1mn2⋯mn,n−11)\mathbf L = \begin{pmatrix} 1 & & & & \\ m_{21} & 1 & & & \\ m_{31} & m_{32} & 1 & & \\ \vdots & \vdots & \ddots & \ddots & \\ m_{n1} & m_{n2} & \cdots & m_{n,n-1} & 1 \end{pmatrix}L=​1m21​m31​⋮mn1​​1m32​⋮mn2​​1⋱⋯​⋱mn,n−1​​1​​

GAUSS 消去法代码

假设 A∈Rn×n\mathbf A \in \mathbb{R}^{n \times n}A∈Rn×n 存储于 A[i, j],b∈Rn\mathbf b \in \mathbb{R}^{n}b∈Rn 存储于 b[i]

# 消去算法
for k in range(n - 1): # 枚举列
   for i in range(k + 1, n): # 枚举行
      c = -A[i, k] / A[k, k] # 乘子
      for j in range(k + 1, n + 1): # 消元
         A[i, j] = A[i, j] + c * A[k, j]
      b[i] = b[i] + c * b[k]

# 回代算法
for i in range(n - 1, -1, -1): # 逆序回代
   for j in range(i + 1, n - 1): # 此时这些 b[j] 已经是准确的了
      b[i] = b[i] - A[i, j] * b[j]
   b[i] = b[i] / A[i, i] # 因为没有规约化

注: 算法中没有必要对 A[k, k] 做归一化(节约运算),同时只需更新矩阵的上三角部分(下三角不再需要)。计算中没有考虑除 0 问题。


GAUSS 消去法复杂度分析

  • 除法数:约 n(n−1)2\dfrac{n(n-1)}{2}2n(n−1)​;
  • 乘法数:约 n(n−1)(n+1)3\dfrac{n(n-1)(n+1)}{3}3n(n−1)(n+1)​;
  • 加法数:同样约 13n3\dfrac{1}{3} n^331​n3;
  • 时间复杂度:O(n3)O(n^3)O(n3);
  • 空间复杂度:原地修改 A\mathbf AA,只需 O(n2)O(n^2)O(n2) 存储。

列主元消去法

列主元消去法思想

考虑下面问题:

[ε111][x1x2]=[1ε],\begin{bmatrix}\varepsilon & 1\\ 1 & 1\end{bmatrix}\begin{bmatrix}x_1\\x_2\end{bmatrix}=\begin{bmatrix}1\\\varepsilon\end{bmatrix},[ε1​11​][x1​x2​​]=[1ε​],

真实解: x=[−11+ε]\mathbf x = \begin{bmatrix}-1\\ 1+\varepsilon\end{bmatrix}x=[−11+ε​]

直接 Gauss 消去得:

[ε1101−1/εε−1/ε]\begin{bmatrix} \varepsilon & 1 & 1 \\ 0 & 1-1/\varepsilon & \varepsilon-1/\varepsilon \end{bmatrix}[ε0​11−1/ε​1ε−1/ε​]

若 ε\varepsilonε 很小,计算机中会解得: x=[01]\mathbf x = \begin{bmatrix}0\\ 1\end{bmatrix}x=[01​]

也即当主元 ak,k(k)a^{(k)}_{k,k}ak,k(k)​ 为 0 或接近 0 时,直接消元会出现除以极小值导致的数值不稳定性,甚至可能出现除 0 操作。

解决方案是在每一步选择该列中绝对值最大的元素作主元并交换行,称为部分选主元(partial pivoting)。由于 A\mathbf AA 的非奇异性,这是存在的,否则该列会与前面的列线性相关。

注:还有完全选主元法(full pivoting),也即行列同时选,代价更高但更稳定。工业中部分选主元(partial pivoting)通常是均衡的选择。

数学基础:初等交换阵

交换第 iii 行(jjj 列)和第 jjj 行(iii 列)的初等置换矩阵可表为:

Pij=I−eiei⊤−ejej⊤+eiej⊤+ejei⊤\mathbf P_{ij} = \mathbf I - \mathbf e_i \mathbf e_i^\top - \mathbf e_j \mathbf e_j^\top + \mathbf e_i \mathbf e_j^\top + \mathbf e_j \mathbf e_i^\topPij​=I−ei​ei⊤​−ej​ej⊤​+ei​ej⊤​+ej​ei⊤​

其中 ek\mathbf e_kek​ 是第 kkk 个标准基向量。

性质:

  1. Pij⊤=Pij\mathbf P_{ij}^\top = \mathbf P_{ij}Pij⊤​=Pij​
  2. Pij−1=Pij\mathbf P_{ij}^{-1} = \mathbf P_{ij}Pij−1​=Pij​

矩阵视角下的列主元消去法

这一部分对于算法设计用处不大,但还是看一眼喵~在列主元消去法中,每一步消元前需要先进行行交换。设第 kkk 步选择第 ppp 行(p≥kp \geq kp≥k)作为主元行,则完整的变换过程为:

A(n)=Mn−1Pn−1Mn−2Pn−2⋯M2P2M1P1A(1)\mathbf{\mathbf A}^{(n)} = \mathbf{\mathbf M}_{n-1}\mathbf{P}_{n-1}\mathbf{\mathbf M}_{n-2}\mathbf{P}_{n-2} \cdots\mathbf{\mathbf M}_2\mathbf{P}_2\mathbf{\mathbf M}_1\mathbf{P}_1\mathbf{\mathbf A}^{(1)}A(n)=Mn−1​Pn−1​Mn−2​Pn−2​⋯M2​P2​M1​P1​A(1)

其中 Pk\mathbf{P}_kPk​ 为行交换(交换第 kkk 行与第 ppp 行), Mk\mathbf{\mathbf M}_kMk​ 为消元矩阵, A(n)≡U\mathbf{\mathbf A}^{(n)} \equiv \mathbf{\mathbf U}A(n)≡U 为上三角矩阵。

对于 Mk=I−mkek⊤\mathbf{\mathbf M}_k = \mathbf{\mathbf I} - \mathbf{m}_k\mathbf{e}_k^\topMk​=I−mk​ek⊤​,定义

Pk+1MkPk+1≡M‾k\mathbf{P}_{k+1}\mathbf{\mathbf M}_k\mathbf{P}_{k+1} \equiv \overline{\mathbf{\mathbf M}}_kPk+1​Mk​Pk+1​≡Mk​

其中由于原消元矩阵的稀疏性,故 M‾k\overline{\mathbf{\mathbf M}}_kMk​ 实际上仅是将 Mk\mathbf{\mathbf M}_kMk​ 的 (k+1,k)(k+1, k)(k+1,k) 与 (p,k)(p, k)(p,k) 元素进行了置换,仍保持单位下三角。

因为

A(n)=Mn−1Pn−1⋯M1P1A\mathbf{\mathbf A}^{(n)} = \mathbf{\mathbf M}_{n-1}\mathbf{P}_{n-1}\cdots\mathbf{\mathbf M}_1\mathbf{P}_1\mathbf{\mathbf A}A(n)=Mn−1​Pn−1​⋯M1​P1​A

可得:

M‾1−1M‾2−1⋯M‾n−2−1Mn−1−1U=Pn−1Pn−2⋯P2P1⏟≡PA\overline{\mathbf{\mathbf M}}_1^{-1}\overline{\mathbf{\mathbf M}}_2^{-1} \cdots\overline{\mathbf{\mathbf M}}_{n-2}^{-1}\mathbf{\mathbf M}_{n-1}^{-1}\mathbf{\mathbf U} = \underbrace{\mathbf{P}_{n-1}\mathbf{P}_{n-2} \cdots\mathbf{P}_2\mathbf{P}_1}_{\equiv \mathbf{P}}\mathbf{\mathbf A}M1−1​M2−1​⋯Mn−2−1​Mn−1−1​U=≡PPn−1​Pn−2​⋯P2​P1​​​A

即 带列主元的 LU 分解:

PA=LU\mathbf{P\mathbf A} = \mathbf{LU}PA=LU

其中:

  • P\mathbf{P}P 为排列矩阵(permutation matrix),满足 P−1=P⊤\mathbf{P}^{-1} = \mathbf{P}^\topP−1=P⊤
  • L=\mathbf{\mathbf L} =L= M‾1−1⋯M‾n−2−1Mn−1−1\overline{\mathbf{\mathbf M}}_1^{-1}\cdots\overline{\mathbf{\mathbf M}}_{n-2}^{-1}\mathbf{\mathbf M}_{n-1}^{-1}M1−1​⋯Mn−2−1​Mn−1−1​ 为单位下三角矩阵
  • U\mathbf{\mathbf U}U 为上三角矩阵

列主元消去法代码

假设 A∈Rn×n\mathbf A \in \mathbb{R}^{n \times n}A∈Rn×n 存储于 A[i, j],b∈Rn\mathbf b \in \mathbb{R}^{n}b∈Rn 存储于 b[i]

# 消去算法
# 排列向量 p[i] = j 表示当前的第 i 行对应原始的第 j 行
for i in range(n):
   p[i] = i

for k in range(n - 1): # 枚举列
   s = k
   for i in range(k + 1, n):
      if abs(A[p[i], k]) > abs(A[p[s], k]):
         s = i
   p[s], p[k] = p[k], p[s]
   for i in range(k + 1, n): # 枚举行
      c = -A[p[i], k] / A[p[k], k] # 乘子
      for j in range(k + 1, n + 1): # 消元
         A[p[i], j] = A[p[i], j] + c * A[p[k], j]
      b[p[i]] = b[p[i]] + c * b[p[k]]

# 回代算法
for i in range(n - 1, -1, -1): # 逆序回代
   for j in range(i + 1, n - 1): # 此时这些 b[p[j]] 已经是准确的了
      b[p[i]] = b[p[i]] - A[p[i], j] * b[p[j]]
   b[p[i]] = b[p[i]] / A[p[i], i] # 因为没有规约化

注:操作上使用排列向量 p[i] 来避免昂贵的内存行交换。


列主元消去法复杂度分析

时间复杂度、空间复杂度与 Gauss 消元法量级相同,但是在时间复杂度上会多 O(n2)O(n^2)O(n2) 的比较成本,空间复杂度上会多 O(n)O(n)O(n) 的排列向量成本。

目录
  • 概述
  • 常见矩阵结构
  • GAUSS 消去法
    • GAUSS 消去法思想
    • 数学基础:SWM 公式
    • 矩阵视角下的 GAUSS 消去法
    • GAUSS 消去法代码
    • GAUSS 消去法复杂度分析
  • 列主元消去法
    • 列主元消去法思想
    • 数学基础:初等交换阵
    • 矩阵视角下的列主元消去法
    • 列主元消去法代码
    • 列主元消去法复杂度分析
© 2026 miniyuan. All rights reserved.
Go to miniyuan's GitHub repo