n*n矩阵方程组Ax=b,使用Eigen矩阵库常用解法介绍
在使用 Eigen 矩阵库求解n×n 线性方程组 Ax=b 时,有多种分解方法可供选择。不同的方法在精度、稳定性、速度和适用条件上各有优劣。
n×n 矩阵方程组 Ax = b 的 Eigen 常用解法(适用于 Microsoft Word)
在使用 Eigen C++ 矩阵库求解线性方程组
A𝐱 = 𝐛
其中 A 是 n×n 矩阵,𝐱 和 𝐛 是 n 维向量,有多种数值方法可供选择。以下是常用分解方法的对比与使用方式。
1. SVD 分解(最精确、最稳健)
- 适用条件:任意矩阵(包括奇异、病态、秩亏)
- 优点:数值最稳定,精度最高
- 缺点:计算较慢(O(n³))
Eigen 代码:x = A.bdcSvd(ComputeThinU | ComputeThinV).solve(b);
数学原理:
对矩阵 A 进行奇异值分解:
A = UΣVᵀ
则解为:
𝐱 = VΣ⁻¹Uᵀ𝐛
2. 列主元 QR 分解
- 适用条件:满秩或接近满秩矩阵
- 优点:精度高,稳定性好,速度较快
- 缺点:比无主元 QR 稍慢
Eigen 代码:x = A.colPivHouseholderQr().solve(b);
数学原理:
A = QR(带列主元置换 P)
P⁻¹A = QR
解:𝐱 = R⁻¹Qᵀ𝐛
3. 普通 QR 分解(无主元)
- 适用条件:非病态满秩矩阵
- 优点:速度快
- 缺点:无主元,数值稳定性较差
Eigen 代码:x = A.householderQr().solve(b);
4. LU 分解(带全主元)
- 适用条件:可逆矩阵
- 优点:中等速度
- 缺点:不如 QR/SVD 稳定
Eigen 代码:x = A.fullPivLu().solve(b);
5. LDLᵀ 分解(对称矩阵专用)
- 适用条件:对称矩阵(正定或半正定)
- 优点:速度快,内存少,专为对称矩阵优化
- 缺点:仅适用于对称矩阵
Eigen 代码:x = A.ldlt().solve(b);
6. LLT 分解(Cholesky,正定专用)
- 适用条件:对称正定矩阵
- 优点:最快,精度高
- 缺点:仅适用于正定矩阵,否则会失败
Eigen 代码:x = A.llt().solve(b);
选择建议(决策树)
- 是否对称正定? → 使用 LLT 或 LDLT
- 是否对称但可能奇异? → 使用 LDLT
- 是否病态或条件数大? → 使用 SVD
- 一般情况,追求精度? → 使用 colPivHouseholderQr
- 追求速度且矩阵良好? → 使用 householderQr