线性代数——高斯消元 学习笔记

这篇具有很好参考价值的文章主要介绍了线性代数——高斯消元 学习笔记。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

线性代数——高斯消元

引入

消元法

消元法是将方程组中的一方程的未知数用含有另一未知数的代数式表示,并将其带入到另一方程中,这就消去了一未知数,得到一解;或将方程组中的一方程倍乘某个常数加到另外一方程中去,也可达到消去一未知数的目的。消元法主要用于二元一次方程组的求解。

矩阵表示线性方程组

例如,将线性方程组:

\( \left\{\begin{matrix} 7x_1+8x_2+9x_3=13 \\ 4x_1+5x_2+6x_3=12 \\ x_1+2x_2+3x_3=11 \end{matrix}\right. \)

写成矩阵乘法的形式(将系数抽出来):

\( \begin{pmatrix} 7 & 8 & 9 \\ 4 & 5 & 6 \\ 1 & 2 & 3 \end{pmatrix}\begin{pmatrix} x_1 \\ x_2 \\ x_3 \end{pmatrix}=\begin{pmatrix} 13 \\ 12 \\ 11 \end{pmatrix} \)

简记为:\(Ax = b\),其中系数矩阵 \(A = \begin{pmatrix} 7 & 8 & 9 \\ 4 & 5 & 6 \\ 1 & 2 & 3 \end{pmatrix}\);未知量 \(x = \begin{pmatrix} x_1 \\ x_2 \\ x_3 \end{pmatrix}\);常数项 \(b = \begin{pmatrix} 13 \\ 12 \\ 11 \end{pmatrix}\).

其本质是:矩阵 \(A\)(系数矩阵)左乘一个列向量 \(x\)(未知量)等与一个列向量 \(b\)(常数项)。

增广矩阵

对于一个线性方程组,未知数前的系数构成系数矩阵,如果在系数矩阵右端补上线性方程组的常数项则构成增广矩阵。即为方程组系数矩阵 \(A\) 与常数列 \(b\) 的并生成的新矩阵,表示为 \((A | b)\)

应用初等行变换,可以将线性方程组对应的增广矩阵先转化为行阶梯形矩阵,再转化为行最简形矩阵,进而完成线性方程组的求解。这个方法叫做消元法解线性方程组,而高斯消元法,是按照一定的顺序进行的消元算法。

增广矩阵行初等变换化为行最简形,即是利用了高斯消元法的思想理念,省略了变量而用变量的系数位置表示变量,增广矩阵中用竖线隔开了系数矩阵和常数列,代表了等于符号。

例如方程 \(\begin{cases} 4x+y&=100 \\ x-y&=100 \end{cases}\) 可以表示为:\(\left(\begin{matrix} 4 & 1 \\ 1 & -1 \end{matrix} \middle| \begin{matrix} 100 \\ 100 \end{matrix} \right)\)

行最简形矩阵

在阶梯形矩阵中,若其各行的第一个非零元素均为 \(1\),且所在列的其他元素都为 \(0\),就称该矩阵为行最简形矩阵。

消元法理论的核心

考虑将消元法的思想引入 \(n\) 元一次方程组中,我们可以得到如下结论:

  • 两方程互换,解不变;
  • 一方程乘以非零数 \(k\),解不变;
  • 一方程加上另一方程的 \(k\) 倍,解不变。

初等变换

对于矩阵 \(A\),可以进行[初等行变换]和[初等列变换],统称为初等变换(初等行列变换)。初等行变换与初等列变换一样,都有 \(3\) 种:对换(switching)、倍乘(multiplication)、倍加(addition)。

初等行变换(列同行) 对应到方程组里的描述
对换:第 \(i\)\(j\) 行互换 两方程互换,解不变
倍乘:第 \(i\) 行乘非零数 \(k\) 一方程乘以非零数 \(k\),解不变
倍加:第 \(j\) 行乘 \(k\) 加到第 \(i\) 一方程加上另一方程的 \(k\) 倍,解不变

在初等变换中,对换可以通过倍乘和倍加实现,而倍加不能通过倍乘和对换实现。因此,相较对换而言,倍乘和倍加是更为本质的操作。对换操作是为了在消元法中,保证消元的有序,而引入的辅助操作。

高斯消元法(人工)

理论基础

德国数学家高斯对消元法进行了思考分析,得出了如下结论:

  • 在消元法中,参与计算和发生改变的是方程中各变量的系数;
  • 各变量并未参与计算,且没有发生改变;
  • 可以利用系数的位置表示变量,从而省略变量;
  • 在计算中将变量简化省略,方程的解不变。

高斯在这些结论的基础上,提出了高斯消元法,首先将方程的增广矩阵利用行初等变换化为行最简形,然后以线性无关为准则对自由未知量赋值,最后列出表达方程组通解。

标准形式

已知 \(n\) 元线性一次方程组。

\(\begin{cases} a_{1, 1} x_1 + a_{1, 2} x_2 + \dots + a_{1, n} x_n = b_1 \\ a_{2, 1} x_1 + a_{2, 2} x_2 + \dots + a_{2, n} x_n = b_2 \\ \dots \\ a_{n,1} x_1 + a_{n, 2} x_2 + \dots + a_{n, n} x_n = b_n \end{cases}\)

求方程组的解的情况。

方法及步骤

高斯消元法在将增广矩阵化为最简形后对于自由未知量的赋值,我们可以将高斯消元法划分为五步骤,从而提出五步骤法,内容如下:

  1. 增广矩阵行初等行变换为行最简形;
  2. 还原线性方程组;
  3. 求解第一个变量;
  4. 补充自由未知量;
  5. 列表示方程组通解。

下面我们举例说明。

过程

例:利用高斯消元法五步骤法求解线性方程组:

\(\begin{cases} 2x_1+5x_3+6x_4&=9 \\ x_3+x_4&=-4 \\ 2x_3+2x_4&=-8 \end{cases}\)

  1. 化为行最简形矩阵:
    具体方法:后面讲(建议先看完这些内容再往下进行)。
原始矩阵
\[\left(\begin{matrix} 2 & 0 & 5 & 6 \\ 0 & 0 & 1 & 1 \\ 0 & 0 & 2 & 2 \end{matrix} \middle| \begin{matrix} 9 \\ -4 \\ -8 \end{matrix} \right) \]
将第二行的 $2$ 倍加到第三行
\[\left(\begin{matrix} 2 & 0 & 5 & 6 \\ 0 & 0 & 1 & 1 \\ 0 & 0 & 0 & 0 \end{matrix} \middle| \begin{matrix} 9 \\ -4 \\ 0 \end{matrix} \right) \]
将第一行乘以 $\dfrac{1}{2}$
\[\left(\begin{matrix} 1 & 0 & 2.5 & 3 \\ 0 & 0 & 1 & 1 \\ 0 & 0 & 0 & 0 \end{matrix} \middle| \begin{matrix} 4.5 \\ -4 \\ 0 \end{matrix} \right) \]
将第二行的 $2.5$ 倍加到第一行
\[\left(\begin{matrix} 1 & 0 & 0 & 0.5 \\ 0 & 0 & 1 & 1 \\ 0 & 0 & 0 & 0 \end{matrix} \middle| \begin{matrix} 14.5 \\ -4 \\ 0 \end{matrix} \right) \]
  1. 还原线性方程组:
    在行最简形矩阵的基础上,将之重新书写为线性方程组的形式,即将行最简形中各位置的系数重新赋予变量,中间的竖线还原为等号。

    \(\begin{cases} x_1+0.5x_4 &= 14.5\\ x_3+x_4 &= -4 \\ \end{cases}\)

  2. 求解第一个变量:
    对于所还原的线性方程组而言,将方程组中每个方程的第一个变量,用其他量表达出来;即对于每个方程,仅将第一个变量放在方程左边,其他所有量都放在方程右边。

    \(\begin{cases} x_1 = -0.5x_4+14.5\notag \\ x_3 = -x_4-4\notag \end{cases}\)

    ※因为是行最简形矩阵,所以每个方程的第一个变量的系数一定是 \(1\)

  3. 补充自由未知量:
    \(3\) 步中,求解出变量 \(x_1\)\(x_3\),从而说明了方程剩余的变量 \(x_2\)\(x_4\) 不受方程组的约束,是自由未知量,可以取任意值,所以需要在第 \(3\) 步骤解得基础上进行解得补充,即 \(x_2 = x_2\)\(x_4 = x_4\)

    \(\begin{cases} x_1 = -0.5x_4+14.5 \\ x_2 = x_2 \\ x_3 = -x_4-4 \\ x_4 = x_4 \end{cases}\)

  4. 表示方程组的通解:
    在第 \(4\) 步的基础上,将解表达为列向量组合的表示形式,同时由于 \(x_2\)\(x_4\) 是自由未知量,可以取任意值,所以在解得右边,令二者分别为任意常数 \(C_1\)\(C_2\),即实现了对方程组的求解。

    \(\begin{aligned} \begin{pmatrix} x_1 \\ x_2 \\ x_3 \\ x_4 \end{pmatrix} &= \begin{pmatrix} 0 \\ 1 \\ 0 \\ 0 \end{pmatrix} x_2+ \begin{pmatrix} -0.5 \\ 0 \\ -1 \\ 1 \end{pmatrix} x_4 + \begin{pmatrix} 14.5 \\ 0 \\ -4 \\ 0 \end{pmatrix} \\ &= \begin{pmatrix} 0 \\ 1 \\ 0 \\ 0 \end{pmatrix} C_1+ \begin{pmatrix} -0.5 \\ 0 \\ -1 \\ 1 \end{pmatrix} C_2 + \begin{pmatrix} 14.5 \\ 0 \\ -4 \\ 0 \end{pmatrix} \end{aligned}\)

    ※用 \(C_1\)\(C_2\)\(C_3\)\(\dots\) 表示任意常数。

高斯消元法(计算机)

可以看出来,最难的一步其实是第 \(1\) 步:化为行最简形矩阵。如果是手工计算的话,依次考虑每一列,随便找一个这一列非零的且前面均为 \(0\) 的行,将这一行全部除以这个数就可以了。

但是程序就需要考虑效率以及除法的精度了,具体思想是将前面已经有非零的数的行固定在最前面,即 \(1 \sim r\) 的位置固定、后面不再考虑。

方法

初始时 \(r = 0\),依次枚举每一列:

  1. 找到这一列绝对值最大的行(下面做除法的时候,分子大,可以减小精度误差);\(\in [r + 1, n]\)
  2. 把这一行换到第 \(r + 1\)
  3. 将这一行的每个数同时除以这一个非零的数;如果没有非零的数则表示没有唯一解(取决于行最简形矩阵的右侧是否非零,所以如果要确定是无穷解还是无解,就需要继续算,在求出行最简形矩阵后再判断)
  4. 把这一列,除了第一个数,全都消成零;即按比例减去
  5. 固定这个方程,以后不再考虑;即 \(r = r + 1\)

解的情况判断

  1. 完美阶梯型:唯一解;
    即第 \(i\) 行,第一个非零在第 \(i\) 个。
  2. 左边没有未知数,右边系数非零:无解;
    \(r + 1 \sim n\) 行中,有右侧非零的方程。
  3. 否则:无穷组解。

高斯-约旦消元法

高斯-约旦消元法,是高斯消元法的另一个版本,其方法与高斯消去法相同;唯一相异之处就是这算法产生出来的矩阵是一个简化行梯阵式,而不是高斯消元法中的行梯阵式。相比起高斯消元法,此算法的效率比较低,却可把方程组的解用矩阵一次过表示出来。

高斯-约旦消元法就是将下面的方程的倍数也减到上面已经考虑过的方程中(有回代,而普通高斯消元法无回代),使上面的方程的该列也变为 \(0\);具体来说就是用当前选中的方程去消掉其他方程的时候,是否消去其上面已经算过的方程。

用高斯消元法和高斯-约旦消元法算出来的行最简形矩阵有如下区别:

高斯消元法
\[\left(\begin{matrix} 1 & * & * & * \\ 0 & 1 & * & * \\ 0 & 0 & 1 & * \\ 0 & 0 & 0 & 1 \end{matrix} \middle| \begin{matrix} * \\ * \\ * \\ * \end{matrix}\right)\]
高斯-约旦消元法
\[\left(\begin{matrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{matrix} \middle| \begin{matrix} * \\ * \\ * \\ * \end{matrix} \right)\]

具体的内容可以见:https://www.cnblogs.com/mk-oi/p/14290455.html;
这篇文章中说高斯-约旦消元法不可判无解和无穷解,但我实测也是可以的。

代码实现

为了代码简便,下文的代码使用的都是高斯-约旦消元法,而不是普通的高斯消元法。

[P3389 高斯消元法]
  • \(n \times n\) 的矩阵,仅需输出唯一解或无唯一解。
const int N = 110;

double a[N][N], b[N];

int main()
{
    int n = rr;

    for (int i = 1; i <= n; ++i)
    {
        for (int j = 1; j <= n; ++j)
            a[i][j] = rr;
        b[i] = rr;
    }

    for (int i = 1; i <= n; ++i)
    {
        int r = 0;
        for (int j = i; j <= n; ++j)
            if (fabs(a[j][i]) > fabs(a[r][i]))
                r = j;

        if (a[r][i] == 0)
            printf("No Solution\n"), exit(0);

        const double t = a[r][i];
        for (int j = 1; j <= n; ++j)
            swap(a[i][j], a[r][j]), a[i][j] /= t;
        swap(b[i], b[r]), b[i] /= t;

        for (int j = 1; j <= n; ++j)
        {
            if (i == j || a[j][i] == 0)
                continue;
            const double c = a[j][i];
            for (int k = i; k <= n; ++k)
                a[j][k] -= c * a[i][k];
            b[j] -= c * b[i];
        }
    }

    for (int i = 1; i <= n; ++i)
        printf("%.2lf\n", b[i]);
    return 0;
}
[P2455 线性方程组]
  • \(n \times n\) 的矩阵,需要判断解的三种情况。
const int N = 55;

double a[N][N], b[N];

int main()
{
    int n = rr;

    for (int i = 1; i <= n; ++i)
    {
        for (int j = 1; j <= n; ++j)
            a[i][j] = rr;
        b[i] = rr;
    }

    int row = 1;
    for (int col = 1; col <= n; ++col)
    {
        int mi = 0;
        double cm = -1;

        for (int i = row; i <= n; ++i)
            if (fabs(a[i][col]) > cm)
                cm = fabs(a[i][col]), mi = i;

        if (a[mi][col] == 0)
            continue;

        const double t = a[mi][col];
        for (int i = 1; i <= n; ++i)
            swap(a[row][i], a[mi][i]), a[row][i] /= t;
        swap(b[row], b[mi]), b[row] /= t;

        for (int i = 1; i <= n; ++i)
        {
            if (i == row || a[i][col] == 0)
                continue;
            const double c = a[i][col];
            for (int j = 1; j <= n; ++j)
                a[i][j] -= c * a[row][j];
            b[i] -= c * b[row];
        }

        ++row;
    }

    if (row == n + 1)
    {
        for (int i = 1; i <= n; ++i)
            printf("x%d=%.2lf\n", i, b[i]);
        exit(0);
    }

    for (int i = row; i <= n; ++i)
        if (b[i] != 0)
            printf("-1\n"), exit(0);

    printf("0\n");
    return 0;
}

Reference

[1] https://oi-wiki.org/math/linear-algebra/matrix/
[2] https://oi-wiki.org/math/linear-algebra/elementary-operations/
[3] https://oi-wiki.org/math/numerical/gauss/
[4] https://www.cnblogs.com/mk-oi/p/14290455.html文章来源地址https://www.toymoban.com/news/detail-710140.html

到了这里,关于线性代数——高斯消元 学习笔记的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 线性代数 --- LU分解(Gauss消元法的矩阵表示)

                     首先, LU分解实际上就是用矩阵的形式来记录的高斯消元的过程 。其中,对矩阵A进行高斯消元后的结果为矩阵U,是LU分解后的两个三角矩阵中其中之一。U是一个上三角矩阵,U就是上三角矩阵upper triangle的首字母的大写。         高斯消元的每一步都

    2024年02月02日
    浏览(52)
  • 线性代数:齐次线性方程组学习笔记

    齐次线性方程组是指所有方程的常数项均为零的线性方程组,即形如 A x = 0 Ax=0 A x = 0 的方程组。 其中,矩阵 A A A 是一个 m × n m times n m × n 的矩阵,向量 x x x 是一个 n n n 维列向量, 0 mathbf{0} 0 是一个 m m m 维零向量。 齐次线性方程组有以下性质: 1. 性质1 齐次线性方程组的

    2024年01月20日
    浏览(50)
  • 深度学习笔记之线性代数

    一、向量 在数学表示法中,向量通常记为粗体小写的符号(例如, x , y , z )当向量表示数据集中的样本时,它们的值具有一定的现实意义。例如研究医院患者可能面临的心脏病发作风险,用一个向量表示一个患者,其分量为最近的生命特征、胆固醇水平、每天运动时间等

    2024年02月08日
    浏览(49)
  • 线性代数:增广矩阵学习笔记

    定义 对于一个 n × m ntimes m n × m 的矩阵 A = [ a i j ] A=[a_{ij}] A = [ a ij ​ ] ,我们可以在它的右边加上一个 n × 1 ntimes1 n × 1 的列向量 b b b ,得到一个 n × ( m + 1 ) ntimes(m+1) n × ( m + 1 ) 的矩阵 [ A ∣ b ] begin{bmatrix} A bigl| bend{bmatrix} [ A ​ ​ ​ b ​ ] ,这个矩阵被称为 A A A 的

    2024年02月05日
    浏览(61)
  • 线性代数:正交变换学习笔记

    在线性代数中,如果一个矩阵 A A A 满足 A T A = A A T = I A^T A = A A^T = I A T A = A A T = I ,则称其为正交矩阵。正交矩阵也常被称为正交变换。 正交变换是线性变换的一种特殊形式,它不改变向量的长度和夹角。因此,它可以用来描述旋转、镜像等几何变换。 正交矩阵有以下性质:

    2024年02月03日
    浏览(58)
  • 线性代数:克莱姆法则学习笔记

    克莱姆(Cramer)法则又称为克拉默法则,是在线性代数中解决线性方程组问题的一种方法。克莱姆法则的基本思想是通过用系数矩阵的行列式来判断线性方程组是否有唯一解,从而进一步求出各个未知数的值。其原理基于克莱姆定理: 对于 n 元线性方程组 Ax = b,如果系数矩

    2024年02月08日
    浏览(49)
  • 线性代数:约当标准型学习笔记

    线性代数是数学中重要的分支之一,在各个领域中都有广泛的应用。其中,矩阵的基本理论与方法是线性代数的重点和难点。本文主要介绍线性代数中的一种特殊矩阵形式:约当标准型。通过对约当标准型的定义、求法、性质及应用的介绍,希望读者能够深入理解和应用矩阵

    2024年02月04日
    浏览(42)
  • 线性代数 --- 向量的内积(点积)(个人学习笔记)

    向量与向量的乘法 - 内积         两个向量的内积,也叫点积(但在我们这个笔记的前半部分,我们说的,或者用到的更多的应该是点积),他的计算方式是两个同维度向量(例如两个n维向量)的内部元素从1到n, 逐一相乘再相加后的累加和 ,得到的是一个数。 注意,

    2023年04月08日
    浏览(79)
  • 线代学习笔记(一)——线性代数的通俗理解

    本篇笔记内容主要来源于45分钟线性代数通俗讲解_哔哩哔哩_bilibili,非常感谢up主的分享,这里我加入了部分自己的理解,与自己所学的知识结合完成。 数据的维度:即数据含有参数的个数,描述一个对象所需要的参数个数,这样一组数据构成一个多维数据,如一个空间坐标

    2024年02月06日
    浏览(44)
  • 【学习笔记】(数学)线性代数-矩阵的概念和特殊矩阵

    由 m × n mtimes n m × n 个数按一定的次序排成的 m m m 行 n n n 列的矩形数表成为 m × n mtimes n m × n 的矩阵,简称 矩阵 (matrix)。 横的各排称为矩阵的 行 ,竖的各列称为矩阵的 列 。 元素为实数的称为 实矩阵 ,一般情况下我们所讨论的矩阵均为实矩阵。 1 行 n n n 列的矩阵称为

    2024年02月09日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包