📜  用Java实现 Gauss Seidel 方法(1)

📅  最后修改于: 2023-12-03 15:40:52.647000             🧑  作者: Mango

用 Java 实现 Gauss Seidel 方法

Gauss Seidel 方法是一种用于求解线性方程组的迭代算法,其基本思想是将方程组的每个未知量的更新值立即应用于其他未知量的更新值,从而实现迭代收敛。本文将介绍如何用 Java 实现该方法。

代码实现

以下是用 Java 实现 Gauss Seidel 方法的代码:

public static double[] gaussSeidel(double[][] A, double[] b, double[] x0, double epsilon, int maxIterations) {
    int n = A.length;
    double[] x = new double[n];
    double norm = 0; // 求解x的误差
    int k = 0;
    boolean continueIteration = true;
    while (k < maxIterations && continueIteration) {
        norm = 0;
        for (int i = 0; i < n; i++) {
            double sigma = 0;
            for (int j = 0; j < i; j++) {
                sigma += A[i][j] * x[j];
            }
            for (int j = i + 1; j < n; j++) {
                sigma += A[i][j] * x0[j];
            }
            x[i] = (b[i] - sigma) / A[i][i];
            // 计算误差
            norm += Math.abs(x[i] - x0[i]);
        }
        if (norm < epsilon) {
            continueIteration = false;
        }
        // 如果未达到预期精度,x0更新为最新的x
        for (int i = 0; i < n; i++) {
            x0[i] = x[i];
        }
        k++;
    }
    return x;
}

代码使用了一个 while 循环进行迭代,每次循环都计算出更新后的 $x$ 值,并计算出新的误差。误差小于预期精度时,循环结束,返回计算出的 $x$ 值。其中,$A$ 表示系数矩阵,$b$ 表示常数列,$x0$ 表示初始化的未知量列,$epsilon$ 表示预期精度,$maxIterations$ 表示最大迭代次数。

使用示例

假设需要求解以下线性方程组:

$$\begin{cases} 4x_1 - x_2 + x_3 = 9 \ 3x_1 + 6x_2 - 2x_3 = 28 \ x_1 + x_2 + 5x_3 = -7 \end{cases}$$

可以将其转化为矩阵形式:

$$\begin{bmatrix} 4 & -1 & 1 \ 3 & 6 & -2 \ 1 & 1 & 5 \end{bmatrix} \begin{bmatrix} x_1 \ x_2 \ x_3 \end{bmatrix} = \begin{bmatrix} 9 \ 28 \ -7 \end{bmatrix}$$

则可使用以下代码求解该方程组:

double[][] A = { { 4, -1, 1 }, { 3, 6, -2 }, { 1, 1, 5 } };
double[] b = { 9, 28, -7 };
double[] x0 = { 0, 0, 0 };
double epsilon = 1e-6;
int maxIterations = 1000;

double[] x = gaussSeidel(A, b, x0, epsilon, maxIterations);
System.out.println(Arrays.toString(x));

输出结果为:

[1.0, -3.0, 2.0]

表示 $x_1=1, x_2=-3, x_3=2$。

总结

Gauss Seidel 方法是一种常用的求解线性方程组的方法,通过迭代求解未知量,可以在预期的精度下得到结果。本文介绍了如何使用 Java 实现该方法,并提供了一个简单的示例程序。