MINIBLOG

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

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


概述

研究对象是 nnn 阶线性代数方程组

Ax=bA x = bAx=b

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

直接法:通过有限次确定的算术运算(消元/分解)得到舍入误差以内精确的数值解。


常见矩阵结构

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

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


GAUSS 消去法

通过初等行变换将 AAA 化为上三角矩阵 UUU,再回代求解 xxx。

GAUSS 消去法思想

按列逐步消元。

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

数学基础:SWM 公式

Sherman–Morrison–Woodbury 公式:

(A+UVT)−1=A−1−A−1U(I+VTA−1U)−1VTA−1.(A+UV^T)^{-1}=A^{-1} - A^{-1} U (I + V^T A^{-1} U)^{-1} V^T A^{-1}.(A+UVT)−1=A−1−A−1U(I+VTA−1U)−1VTA−1.

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

证明: 构造块矩阵 MMM:

(AUVT−I)\begin{pmatrix} A & U \\ V^T & -I \end{pmatrix}(AVT​U−I​)

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

(AUVT−I)=(I0VTA−1I)(A00−I−VTA−1U)(IA−1U0I)\begin{pmatrix} A & U \\ V^T & -I \end{pmatrix} = \begin{pmatrix} I & 0 \\ V^T A^{-1} & I \end{pmatrix} \begin{pmatrix} A & 0 \\ 0 & -I - V^T A^{-1} U \end{pmatrix} \begin{pmatrix} I & A^{-1}U \\ 0 & I \end{pmatrix}(AVT​U−I​)=(IVTA−1​0I​)(A0​0−I−VTA−1U​)(I0​A−1UI​)

对 MMM 直接求逆,并取左上角块得:

M1,1−1=(A+UVT)−1M_{1, 1}^{-1} = (A + UV^T)^{-1}M1,1−1​=(A+UVT)−1

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

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

故

M1,1−1=A−1−A−1U(I+VTA−1U)−1VTA−1□M_{1, 1}^{-1} = A^{-1} - A^{-1} U (I + V^T A^{-1} U)^{-1} V^T A^{-1} \quad \BoxM1,1−1​=A−1−A−1U(I+VTA−1U)−1VTA−1□

矩阵视角下的 GAUSS 消去法

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

Mk=I−mkekT,M_k = I - m_k e_k^T,Mk​=I−mk​ekT​,

其中向量

mk=[0,…,0, mk+1,k,…,mn,k]T,mj,k=aj,k(k)ak,k(k),  j=k+1,…,n,m_k = [0,\dots,0,\,m_{k+1,k},\dots,m_{n,k}]^T,\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​]T,mj,k​=ak,k(k)​aj,k(k)​​,j=k+1,…,n,

且 eke_kek​ 是第 kkk 个标准基向量。

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

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

且每个 MkM_kMk​ 可逆。

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

(A+uvT)−1=A−1−A−1uvTA−11+vTA−1u.(A+uv^T)^{-1}=A^{-1}-\frac{A^{-1} u v^T A^{-1}}{1+v^T A^{-1} u}.(A+uvT)−1=A−1−1+vTA−1uA−1uvTA−1​.

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

Mk−1=I+mkekT,M_k^{-1}=I + m_k e_k^T,Mk−1​=I+mk​ekT​,

令

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

则得到标准的 LU 分解

A=LU,A = L U,A=LU,

其中 LLL 为单位下三角矩阵,UUU 为上三角矩阵。

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

L=(1m211m31m321⋮⋮⋱⋱mn1mn2⋯mn,n−11)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×nA \in \mathbb{R}^{n \times n}A∈Rn×n 存储于 A[i, j],b∈Rnb \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\frac{n(n-1)}{2}2n(n−1)​;
  • 乘法数:约 n(n−1)(n+1)3\frac{n(n-1)(n+1)}{3}3n(n−1)(n+1)​;
  • 加法数:同样约 13n3\frac{1}{3} n^331​n3;
  • 时间复杂度:O(n3)O(n^3)O(n3);
  • 空间复杂度:原地修改 AAA,只需 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+ε].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].x = \begin{bmatrix}0\\ 1\end{bmatrix}.x=[01​].

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

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

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

数学基础:初等交换阵

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

Pij=I−eieiT−ejejT+eiejT+ejeiTP_{ij} = I - e_i e_i^T - e_j e_j^T + e_i e_j^T + e_j e_i^TPij​=I−ei​eiT​−ej​ejT​+ei​ejT​+ej​eiT​

其中 eke_kek​ 是第 kkk 个标准基向量。

性质:

  1. PijT=PijP_{ij}^T = P_{ij}PijT​=Pij​
  2. Pij−1=PijP_{ij}^{-1} = P_{ij}Pij−1​=Pij​

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

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

A(n)=Mn−1Pn−1Mn−2Pn−2⋯M2P2M1P1A(1)\mathbf{A}^{(n)} = \mathbf{M}_{n-1}\mathbf{P}_{n-1}\mathbf{M}_{n-2}\mathbf{P}_{n-2}\cdots\mathbf{M}_2\mathbf{P}_2\mathbf{M}_1\mathbf{P}_1\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{M}_kMk​ 为消元矩阵,A(n)≡U\mathbf{A}^{(n)} \equiv \mathbf{U}A(n)≡U 为上三角矩阵。

对于 Mk=I−mkekT\mathbf{M}_k = \mathbf{I} - \mathbf{m}_k\mathbf{e}_k^TMk​=I−mk​ekT​,定义

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

其中由于原消元矩阵的稀疏性,故 M‾k\overline{\mathbf{M}}_kMk​ 实际上仅是将 Mk\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{A}^{(n)} = \mathbf{M}_{n-1}\mathbf{P}_{n-1}\cdots\mathbf{M}_1\mathbf{P}_1\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{M}}_1^{-1}\overline{\mathbf{M}}_2^{-1}\cdots\overline{\mathbf{M}}_{n-2}^{-1}\mathbf{M}_{n-1}^{-1}\mathbf{U} = \underbrace{\mathbf{P}_{n-1}\mathbf{P}_{n-2}\cdots\mathbf{P}_2\mathbf{P}_1}_{\equiv \mathbf{P}}\mathbf{A}M1−1​M2−1​⋯Mn−2−1​Mn−1−1​U=≡PPn−1​Pn−2​⋯P2​P1​​​A

即 带列主元的 LU 分解:

PA=LU\boxed{\mathbf{PA} = \mathbf{LU}}PA=LU​

其中:

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

列主元消去法代码

假设 A∈Rn×nA \in \mathbb{R}^{n \times n}A∈Rn×n 存储于 A[i, j],b∈Rnb \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