Skip to content

MATLAB - 高斯消元法

线性方程组是工程、物理、统计和金融领域无数问题的核心。虽然像高斯消元法(Gaussian Elimination)这样的方法对于理解理论至关重要,但 MATLAB 提供了高度优化且数值鲁棒的工具,使求解这些系统变得高效而直接。

线性方程组通常以矩阵形式 Ax = b 表示,其中:

  • A 是已知系数矩阵。
  • x 是我们想找到的未知变量列向量。
  • b 是已知结果列向量。

考虑以下系统:

2x₁ + 3x₂ = 8 4x₁ + 9x₂ = 20

以矩阵形式表示,则为:

A = [2 3; 4 9];
b = [8; 20];
x = [x₁; x₂];

MATLAB 的方法:反斜杠运算符(\)

Section titled “MATLAB 的方法:反斜杠运算符(\)”

在 MATLAB 中,求解 Ax = b 的主要、最有效且推荐的方法是使用反斜杠运算符(backslash operator),也称为 mldivide(矩阵左除)。

% 定义系数矩阵 A 和结果向量 b
A = [2 3; 4 9];
b = [8; 20];
% 使用反斜杠运算符求解 x
x = A \ b

MATLAB 执行此操作并返回解向量:

x =
2.0000
1.3333

为什么要使用反斜杠? 它不仅仅是矩阵求逆的快捷方式。A \ b 是一个复杂的函数,它会分析矩阵 A 并自动选择最适合速度和准确性的算法(例如,对于方阵使用 LU 分解,对于非方系统使用 QR 分解)。它在数值上比计算 inv(A) * b 更稳定。

为了理解解是如何找到的,我们可以学习高斯消元法(Gaussian Elimination)。目标是使用初等行运算将 增广矩阵 [A|b] 转换为上三角形式(行阶梯形),然后使用回代法求解变量。

A = [2 3; 4 9];
b = [8; 20];
Ab = [A b]
Ab =
2 3 8
4 9 20

目标是在主对角线下方创建零。为了消除第二行中的 4,我们执行操作:Row2 = Row2 - 2 * Row1。

Ab(2, :) = Ab(2, :) - 2 * Ab(1, :)
Ab =
2 3 8
0 3 4

新系统为: 2x₁ + 3x₂ = 8 0x₁ + 3x₂ = 4

从第二个方程,我们可以很容易地求解 x₂: 3x₂ = 4 => x₂ = 4/3

将其代入第一个方程: 2x₁ + 3(4/3) = 8 => 2x₁ + 4 = 8 => 2x₁ = 4 => x₁ = 2

rref(简化行阶梯形,Reduced Row Echelon Form)函数是一个出色的教学工具,它执行完整的高斯消元法以在左侧生成一个单位矩阵。然后,解将直接出现在最后一列中。

A = [2 3; 4 9];
b = [8; 20];
Ab = [A b];
R = rref(Ab)
R =
1.0000 0 2.0000
0 1.0000 1.3333

这直接告诉我们 x₁ = 2 和 x₂ = 1.3333。

  • 始终首选 \:对于求解 Ax = b,反斜杠运算符是 MATLAB 中的黄金标准。
  • 检查解的存在性:一个系统可能无解或有无限多解。您可以通过比较系数矩阵 A 和增广矩阵 [A b] 的秩来研究这一点。如果 rank(A) < rank([A b]),则无解。如果 rank(A) == rank([A b]) 但这小于变量的数量,则有无限多解。
  • 大型稀疏系统:对于包含大量零(稀疏)的超大型矩阵系统,直接方法(如 “)可能过慢或占用过多内存。在这种情况下,请使用迭代求解器,如 pcg(预处理共轭梯度法)或 gmres。