线性方程组

2020-05-15 17:09:03 浏览数 (3)

作者:老齐

线性方程组,是任何标准大学数学教材讲解矩阵是都要用到的,并用它引出矩阵概念。之所以如此,可能有两个原因:一是因为我们在初中的时候就已经学习过线性方程组,对它不陌生,正所谓“温故而知新”;二是矩阵的确是为了求解线性方程组而被提出的。所以,此处也不免俗,依然从线性方程组开始,引出矩阵。

begin{cases}-x_1 3x_2-5x_3=-3\2x_1-2x_2 4x_3=8\x_1 3x_2 = 6end{cases}

如果将上述线性方程组的等号左侧各个多项式的系数,按照下面的方式排列:

begin{bmatrix}-1 & 3 & -5 \ 2 & -2 & 4 \ 1 & 3 & 0 end{bmatrix}

这就是矩阵。

线性方程组中第三个方程式缺少

x_3

,可以认为该变量的系数是0。上面的矩阵中的数字来自线性方程组左侧多项式的系数,此矩阵也称为系数矩阵。

如果将线性方程组等号右侧的常数也纳入到矩阵中,其样式如下:

begin{bmatrix}begin{array}{c c c | c}-1 & 3 & -5 & -3 \ 2 & -2 & 4 & 8 \ 1 & 3 & 0 & 6 end{array}end{bmatrix}

这种类型的矩阵称为增广矩阵。

对于增广矩阵,用下面所演示的步骤,完成对线性方程组的求解过程。注:以下演示中,数字①②③分别指增广矩阵的第一行、第二行和第三行。

  1. 分别对第一行和第二行执行如下操作:
    • 第一行:
    ①×(-1)
    • 第二行:
    ②×(frac12)

结果如下:

begin{bmatrix}begin{array}{c c c | c}1 & -3 & 5 & 3 \ 1 & -1 & 2 & 4 \ 1 & 3 & 0 & 6 end{array}end{bmatrix}
  1. 第二行和第三行分别与第一行做减法,第一行不变,即:
    • 第二行:
    ② ①×(-1)
    • 第三行:
    ③ ①×(-1)

结果如下:

begin{bmatrix}begin{array}{c c c | c}1 & -3 & 5 & 3 \ 0 & 2 & -3 & 1 \ 0 & 6 & -5 & 3 end{array}end{bmatrix}
  1. 第一行和第二行不变,第三行做如下变化:
    • 第三行:
    ③ ②×(-3)

结果如下:

begin{bmatrix}begin{array}{c c c | c}1 & -3 & 5 & 3 \ 0 & 2 & -3 & 1 \ 0 & 0 & -14 & 0 end{array}end{bmatrix}

此矩阵对应着一个新的线性方程组,只是此线性方程组与前面我们求解的线性方程组具有相同的解。

begin{cases}x_1-3x_2 5x_3=3\2x_2-3x_3=1\-14x_3 = 0end{cases}

由此线性方程组,比较容易求得:

begin{cases}x_1=frac92\x_2=frac12\x_3 = 0end{cases}

在上面的操作过程中,经过一系列的变换,最终得到了一个非常容易求解的矩阵,该矩阵称之为阶梯形矩阵。

定义 如果满足如下条件,该矩阵称为阶梯形矩阵

  1. 矩阵中如果有元素都是0的行,那么它位于矩阵的下方。
  2. 矩阵中每个非零行的第一个不是0的元素,称为矩阵的主元,主元的列索引随着行索引的递增而严格增大。

例如,下面是一个阶梯形矩阵:

begin{bmatrix}1 & -3 & 5 & 3 & 9 \ 0 & 2 & -8 & 1 & 0 \ 0 & 0 & 0 & 1 & 2 \ 0 & 0 & 0 & 0 & 0end{bmatrix}
  • 第一行主元1,位于第一列
  • 第二行主元2,位于第二列
  • 第三行主元1,位于第四列
  • 第四行是元素都为0的零行

前述将增广矩阵变换成比较容易求解的阶梯矩阵的过程,称为矩阵的初等变换,严格地说,上述进行的是初等行变换。

上述经过初等变换所得到的的阶梯矩阵,还可以继续进行如下变换:

  1. 第一行不变,将第二行和第四行的主元分别变为1:
    • 第二行:
    ②×frac12
    • 第三行:
    ③×(-frac1{14})
begin{bmatrix}begin{array}{c c c | c}1 & -3 & 5 & 3 \ 0 & 1 & -frac32 & frac12 \ 0 & 0 & 1 & 0 end{array}end{bmatrix}
  1. 第三行不变:
    • 第一行:
    ① ②×3
    • 第二行:
    ② ③×frac32
begin{bmatrix}begin{array}{c c c | c}1 & 0 & frac12 & frac92 \ 0 & 1 & 0 & frac12 \ 0 & 0 & 1 & 0 end{array}end{bmatrix}
  1. 第二行和第三行不变:
    • 第一行:
    ① ③×(-frac12)
begin{bmatrix}begin{array}{c c c | c}1 & 0 & 0 & frac92 \ 0 & 1 & 0 & frac12 \ 0 & 0 & 1 & 0 end{array}end{bmatrix}

矩阵变换到这里,就可以直接“读”出解了。在这里我们得到了一种特殊的矩阵(去掉常数项):

begin{bmatrix}1 & 0 & 0 \ 0 & 1 & 0 \ 0 & 0 & 1 end{bmatrix}

这个矩阵称为单位矩阵

定义 主对角线元素都是1,其他元素都为0的矩阵,称为单位矩阵。通常用符号

mathbf I

表示。 ”

在上述计算过程中,将最初的矩阵(增广矩阵),经过一系列变换,最终得到了阶梯形矩阵,乃至于还能得到单位矩阵,这个变换的过程称为矩阵的初等行变换

★对矩阵反复施行以下三种变换:

  1. 把某一行的倍数加到另一行上;
  2. 两行位置互换;
  3. 用一个非零数乘以某一行。

这三种变换称为矩阵的初等行变换。 ”

显然,求解线性方程组,即写出其增广矩阵,然后通过初等行变换化成阶梯形矩阵(包括最终的单位矩阵),从而得到原线性方程组的解。这种方法称为高斯(Gauss)消元法

★任意一个矩阵都可以通过一系列的初等行变换化成阶梯形矩阵。 ”

正如你所知,线性方程组的系数和常数项为有理数时,线性方程组的解有三种可能:无解、有唯一解、有无穷多个解。

n

元线性方程组(即含有

n

个未知量的线性方程组)的增广矩阵经过初等行变换化成阶梯形矩阵:

  • 若阶梯形矩阵形如:
begin{bmatrix}0 & 0 & 0 & ... 0 & bend{bmatrix},b≠0

,则原方程组无解。

  • 否则,有解:
    • 若阶梯形矩阵的非零行数(用
    r

    表示)等于未知量的数,即

    r=n

    ,则原方程组有唯一解;

    • 若$r

以上简要说明了利用矩阵求解线性方程组的方法,当然,这种方法是用手工计算完成的。那么,利用计算机程序如何实现?Numpy是机器学习的基础库,它提供了一种途径。

代码语言:javascript复制
import numpy as np

A = np.mat("-1 3 -5; 2 -2 4;1 3 0")    # 系数矩阵
b = np.mat("-3 8, 6").T                # 常数项矩阵

r = np.linalg.solve(A,b)               # 调用 solve 函数求解
print(r)

输出结果为:

代码语言:javascript复制
[[ 4.5]
 [ 0.5]
 [-0. ]]

此结果中的三项依次对应为

x_1, x_2, x_3

的结果。

但是,如果要利用上述方法求解下面的线性方程组:

begin{cases}x_1 3x_2-4x_3 2x_4=0\3x_1-x_2 2x_3-x_4=0\-2x_1 4x_2-x_3 3x_4= 0\3x_1 9x_2-7x_3 6x_4=0end{cases}

会得到如下的解:

代码语言:javascript复制
A = np.mat("1 3 -4 2;3 -1 2 -1;-2 4 -1 3;3 0 -7 6")
b = np.mat("0 0 0 0").T

r = np.linalg.solve(A, b)
print(r)

# 输出结果
[[ 0.]
 [ 0.]
 [-0.]
 [ 0.]]

观察线性方程组,如果各个变量的值都是0,此线性方程组成立。

不妨对线性方程组的系数矩阵经过初等行变换化成阶梯形矩阵:

begin{bmatrix}1 & 3 & -4 & 2 \ 3 & -1 & 2 & -1 \ -2 & 4 & -1 & 3 \3 & 9 & -7 & 6 end{bmatrix} to begin{bmatrix}1 & 0 & 0 & -frac{1}{10}\0 & 1 & 0 & frac{7}{10}\ 0 & 0 & 1 & 0 \0 & 0 & 0 & 0end{bmatrix}

观察阶梯形矩阵可知,原线性方程组有解,且$r=3,n=4,r

begin{cases}x_1=frac{1}{10}x_4\x_2=-frac{7}{10}x_4\x_3= 0end{cases}

这个解称为原线性方程组的一般解,其中

x_4

称为自由变量。

那么,如果通过程序,是否可以求得一般解?

代码语言:javascript复制
from sympy import *
from sympy.solvers.solveset import linsolve
x1, x2, x3, x4 = symbols("x1 x2 x3 x4")
linsolve([x1   3*x2 - 4*x3   2*x4, 3*x1 - x2   2*x3 - x4, -2*x1   4*x2 - x3   3*x4, 3*x1  9*x2 - 7*x3   6*x4], (x1, x2, x3, x4))

输出结果:

{(frac{x_4}{10}, -frac{7x_4}{10}, 0, x_4)}

用未知量表示,即为:

begin{cases}x_1 = frac{x_4}{10} \ x_2 = -frac{7x_4}{10} \ x_3 = 0 \ x_4 = x_4end{cases}

此结果与上述运用初等行变换手工计算结果一样。

关于使用SymPy求解线性方程组的详细说明,请参阅文档:https://docs.sympy.org/latest/index.html。

从上述计算中可知,为了求解线性方程组,引入了矩阵——这项工作是19世纪英国数学家凯利发起的,自此之后,不仅形成了以矩阵为研究对象的数学分支,矩阵在电路、力学、量子力学、计算机科学等领域亦有广泛应用。

0 人点赞