📜  使用消元法求解线性方程(1)

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

使用消元法求解线性方程

线性方程组是数学中非常重要的一种方程组,其求解方法众多,在此介绍一种常用的方法——消元法。消元法是以高斯为创始人的一类求解线性方程组的方法,又被称之为高斯消元法。

高斯消元法的基本思路

高斯消元法的基本思路是通过运用高斯消元运算将线性方程组变为更易解的三角形式,从而得到方程的解。具体来说,即将n个未知量的n个方程表示成如下形式:

$\begin{cases} a_{11}x_1+a_{12}x_2+...+a_{1n}x_n=b_1 \ a_{21}x_1+a_{22}x_2+...+a_{2n}x_n=b_2 \ ... \ a_{n1}x_1+a_{n2}x_2+...+a_{nn}x_n=b_n \end{cases}$

对其进行初等行变换,并使其化为阶梯形式,即:

$\begin{pmatrix} a_{11}&a_{12}&...&a_{1n}&b_1 \ 0&a_{22}&...&a_{2n}&b_2 \ ...&...&...&...&... \ 0&0&...&a_{nn}&b_n \end{pmatrix}$

这个矩阵是上三角矩阵,可以通过回代求得每个变量的解。

高斯消元法的实现

下面给出高斯消元法的具体实现步骤:

  1. 将系数矩阵 $A$ 和常数矩阵 $B$ 按行拼接成一个增广矩阵 $M$。
  2. 从第一行开始,选取第一个不为零的元素作为主元素。如果第一个元素为零,则向下寻找下一个不为零的元素,并与第一行交换。
  3. 将主元素除以 $a_{11}$,使其成为 $1$,同时将其下面的所有列消为 $0$。具体来说,就是将第一行的每个元素除以 $a_{11}$,然后将所有的下面的行都减去第一行的相应倍数,使其下面的第一个元素为 $0$。
  4. 从第二行开始重复步骤2-3,即选取该行的主元素,将其左下部分的元素消为 $0$。
  5. 一直重复步骤2-4,直到矩阵 $M$ 变为上三角形。

在得到上三角矩阵之后,就可以通过回代求得每个变量的解了。假设上三角矩阵为:

$\begin{pmatrix} a_{11}&a_{12}&...&a_{1n}&b_1 \ 0&a_{22}&...&a_{2n}&b_2 \ ...&...&...&...&... \ 0&0&...&a_{nn}&b_n \end{pmatrix}$

则有 $x_n = \frac{b_n}{a_{nn}}$,然后依次代入上一行,就可以求出 $x_{n-1},x_{n-2}$ 等变量的值。

下面是一个 Python 实现的例子:

def gauss_elimination(A, B):
    """
    Gauss elimination method to solve linear equation.
    """
    n = len(A)
    M = [[0] * (n+1) for i in range(n)]
    for i in range(n):
        for j in range(n):
            M[i][j] = A[i][j]
        M[i][n] = B[i]

    for i in range(n):
        # pivoting
        max_row = i
        max_val = M[i][i]
        for j in range(i+1, n):
            if abs(M[j][i]) > max_val:
                max_row = j
                max_val = abs(M[j][i])
        if max_row != i:
            M[i], M[max_row] = M[max_row], M[i]

        # elimination
        for j in range(i+1, n):
            f = M[j][i] / M[i][i]
            for k in range(i, n+1):
                M[j][k] -= f * M[i][k]

    # back substitution
    x = [0] * n
    for i in range(n-1, -1, -1):
        x[i] = M[i][n] / M[i][i]
        for j in range(i-1, -1, -1):
            M[j][n] -= M[j][i] * x[i]

    return x

该函数的输入是系数矩阵 $A$ 和常数矩阵 $B$,输出是解向量 $x$。该函数实现了上述的高斯消元法算法,其中 pivoting 是选主元的过程,elimination 是消元的过程,back substitution 是回代的过程。