高斯消元法是求解线性方程组的经典算法,通过初等行变换将增广矩阵化为上三角(或行最简形),时间复杂度 O(n³)。
一、问题形式
Mermaid · 渲染中(下方为源码)
graph TD A[增广矩阵] --> B[初等行变换] B --> C[上三角/行最简] C --> D[回代求解]
求解 n 个未知数、n 个方程的线性方程组:
a₁₁x₁ + a₁₂x₂ + ... + a₁ₙxₙ = b₁
a₂₁x₁ + a₂₂x₂ + ... + a₂ₙxₙ = b₂
...
aₙ₁x₁ + aₙ₂x₂ + ... + aₙₙxₙ = bₙ
二、算法步骤
- 消元:将矩阵化为上三角
- 回代:从最后一行向上求解
代码实现
// 高斯消元求解 Ax = b
// a[i][0..n-1] 是系数,a[i][n] 是常数项
// 返回解 x[],无解/无穷解返回 null
double[] gauss(double[][] a, int n) {
for (int col = 0; col < n; col++) {
// 选主元(部分选主元,提高数值稳定性)
int maxRow = col;
for (int row = col + 1; row < n; row++) {
if (Math.abs(a[row][col]) > Math.abs(a[maxRow][col])) {
maxRow = row;
}
}
// 交换行
double[] tmp = a[col]; a[col] = a[maxRow]; a[maxRow] = tmp;
// 主元为 0 → 奇异
if (Math.abs(a[col][col]) < 1e-9) return null;
// 消去下方
for (int row = col + 1; row < n; row++) {
double factor = a[row][col] / a[col][col];
for (int j = col; j <= n; j++) {
a[row][j] -= factor * a[col][j];
}
}
}
// 回代
double[] x = new double[n];
for (int i = n - 1; i >= 0; i--) {
x[i] = a[i][n];
for (int j = i + 1; j < n; j++) {
x[i] -= a[i][j] * x[j];
}
x[i] /= a[i][i];
}
return x;
}