以下代码实现了高斯消元算法来求解线性方程组 Ax=b,其中 A 是系数矩阵,b 是右端向量。
程序的主要部分是 solve 方法,该方法接受矩阵 A 和向量 b 作为输入,返回解向量 x。
该方法首先进行前向消元,将系数矩阵 A 化为上三角形矩阵 U,并将右端向量 b 也相应地进行变换。然后,程序进行回带求解,计算出解向量 x。
在前向消元的过程中,程序依次将每一行消元为上三角形矩阵的一行。
对于第 k 行之后的每一行 i,程序计算出一个系数 factor,然后将第 i 行中第 k 列之后的元素减去 factor 乘以第 k 行中对应元素的值。
同时,右端向量 b 的第 i 个分量也要减去 factor 乘以第 k 行中对应元素的值。 在回带求解的过程中,程序从最后一行开始,计算出该行之后的所有元素对解向量的影响,然后计算出该行的解分量。对于第 i 行,程序计算出一个累加和 sum,该累加和包括第 i 行之后的所有元素对解向量的影响。然后,程序计算出第 i 行的解分量,即将右端向量 b 中第 i 个分量减去 sum,然后除以系数矩阵 A 中第 i 行第 i 列的元素。
最后,在主函数中,程序定义了一个示例矩阵 A 和向量 b,并调用 solve 方法来求解方程 Ax=b。程序输出了解向量 x 的值。
以下是Java版本的高斯消元程序代码:
public class GaussElimination { public static void main(String[] args) { // 矩阵A和向量b double[][] A = {{2, 1, -1}, {-3, -1, 2}, {-2, 1, 2}}; double[] b = {8, -11, -3}; // 高斯消元求解方程Ax=b double[] x = solve(A, b); // 输出解向量x System.out.println("Solution vector:"); for (int i = 0; i < x.length; i++) { System.out.printf("%.2f ", x[i]); } } /** * 高斯消元求解线性方程组Ax=b * @param A 系数矩阵 * @param b 右端向量 * @return 解向量 */ public static double[] solve(double[][] A, double[] b) { int n = A.length; // 前向消元 for (int k = 0; k < n - 1; k++) { for (int i = k + 1; i < n; i++) { double factor = A[i][k] / A[k][k]; for (int j = k + 1; j < n; j++) { A[i][j] -= factor * A[k][j]; } b[i] -= factor * b[k]; } } // 回带求解 double[] x = new double[n]; for (int i = n - 1; i >= 0; i--) { double sum = 0.0; for (int j = i + 1; j < n; j++) { sum += A[i][j] * x[j]; } x[i] = (b[i] - sum) / A[i][i]; } return x; } }
评论