矩阵最重要的应用之一,就是表示和求解线性方程组。本章讲清楚"Ax = b"到底是什么意思,以及如何求解。
18.1 什么是线性方程组
你肯定见过这种方程:
2x + y = 5
x + 3y = 10
两个未知数 x、y,两个方程。求 x、y 的值,就是解线性方程组。
"线性"指:每个方程里未知数都是一次的(没有 x²、没有 xy、没有 sin(x))。
18.2 用矩阵表示方程组
上面的方程组可以写成矩阵形式:
[ 2 1 ] [ x ] [ 5 ]
[ 1 3 ] [ y ] = [ 10 ]
也就是:
A · x = b
A = [ 2 1 ] x = [ x ] b = [ 5 ]
[ 1 3 ] [ y ] [ 10 ]
- A:系数矩阵(未知数前面的系数)
- x:未知数向量
- b:常数向量(等号右边的数)
于是"解方程组"就变成了"已知 A 和 b,求 x"。
验证一下:A·x 展开就是
[ 2 1 ] [ x ] [ 2x + y ]
[ 1 3 ] [ y ] = [ x + 3y ]
等于 b,正好就是原来的两个方程!所以 Ax = b 就是线性方程组的矩阵写法。
18.3 解方程组的方法
方法一:代入消元(中学方法)
2x + y = 5 … ①
x + 3y = 10 … ②
从 ① 得 y = 5 – 2x,代入 ②:
x + 3(5 – 2x) = 10
x + 15 – 6x = 10
-5x = -5
x = 1
代回 y = 5 – 2×1 = 3。所以 x=1,y=3。
方法二:高斯消元(计算机用)
计算机用的是高斯消元:通过"行变换"把矩阵变成"阶梯形",再回代求解。核心操作:
这些操作不改变方程组的解,但能把矩阵化简成容易求解的形式。
你不需要手算高斯消元,Eigen 会帮你做。但理解"解方程组 = 消元"这个思想很重要,因为 Eigen 的 solve() 内部就是在做这类分解。
18.4 解的存在性
方程组可能有三种情况:
| 唯一解 | 两条不平行的直线 | 交于一点 |
| 无解 | 两条平行直线 | 永远不相交 |
| 无穷多解 | 两条重合直线 | 处处相交 |
几何上看,两个未知数两个方程 = 两条直线,解就是它们的交点。
- 相交 → 唯一解
- 平行 → 无解
- 重合 → 无穷多解
对应到矩阵:A 是否可逆(第 19 章)决定了是否有唯一解。
18.5 用 Eigen 解方程组
#include <Eigen/Dense>
#include <iostream>
int main() {
Eigen::Matrix2d A;
A << 2, 1,
1, 3;
Eigen::Vector2d b(5, 10);
// 求解 Ax = b
Eigen::Vector2d x = A.colPivHouseholderQr().solve(b);
std::cout << "x = " << x.transpose() << std::endl; // 1 3
// 验证
std::cout << "A*x = " << (A * x).transpose() << std::endl; // 5 10
return 0;
}
A.分解方法().solve(b) 就是 Eigen 解方程组的标准写法(第 29 章详解各分解方法的选择)。
18.6 实际应用
线性方程组是科学计算的核心:
- 电路分析:基尔霍夫定律列出的方程
- 结构力学:受力平衡方程
- 经济模型:投入产出方程
- 最小二乘拟合:拟合数据(第 36 章项目会用到)
很多实际问题最终都归结为"解一个 Ax = b"。
18.7 小结
- 线性方程组 = Ax = b(A 系数、x 未知、b 常数)。
- 几何意义:两条(或多条)直线的交点。
- 解有唯一解、无解、无穷多解三种情况。
- Eigen 用 A.分解().solve(b) 求解。
下一章,学习行列式与逆矩阵,理解"可逆"和"唯一解"的关系。
网硕互联帮助中心



评论前必须登录!
注册