2.矩阵消元

第二课时、矩阵的消元(Elimination)回代(back substitution)法

        本课时主要讲解了矩阵的消元回代法,来求解方程组。该方法时高斯提出的,也叫做高斯消元法,主要是求解方程组的解,复杂矩阵一般不采用此方法,下面对高斯消元法进行简单的了解和学习。

一.消元法(Elimination)的两种情况

       (1)主元存在,可直接消元

                      例子如下:

                                                     \left\{\begin{matrix} x+2y+z=2 \\ 3x+8y+z=12 \\ 4y+z=2 \end{matrix}\right.

                       上述式子转换成矩阵形式:

                                                                AX=b

                        其中A是系数矩阵,X是未知数,b是方程组右侧值。

                                                      A=\begin{bmatrix} 1 &2 &1 \\ 3& 8 &1 \\ 0&4 &1 \end{bmatrix}

                       对A进行消元,过程如下:

                      首先找到主元(主元不能为零),从上边矩阵可以知道,第一个主元为1,在第一行,我们保持第一行不变,消去第二行的主元下边也就是3这个数消为0.

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

上述就是消元的过程,第一个主元是第一行的第一个数;第二个主元是第二行的第二个数。执行完消元以后的矩阵如上所示。通过消元之后,就直接可以求出方程组的解了,其实消元的目的就是求解线性方程组,通过把不同行的未知数不断的消去。最后求解出方程组的解。但是如果第一个主元是零的话怎么办呢?

        (2) 主元(pivot)不存在

            1. (例子1):方程组无解的情况,消元失败

                                                                      

        上述左边是一个方程组,右边是通过常规方法得到的方程组的解,我们可以看到方程组是无解的。在几何图像中我们也可以看出,下图是方程组的几何图。

图上可以看出,从方程组的行来看,这是两条平行线,永远是没有交点的,也就是说他们永远没有解。而从右边的列向量来看,他们是两个相对方向的向量,永远无法组合得到向量b。关于方程组的几何意义,我已经在上一节方程组的几何解释中说明了(行图像和列图像)https://blog.csdn.net/LLLLLLLLLLLLLLYYYYYY/article/details/103513854。上述的情况,我们是无法进行消元处理的,即所谓的消元法失败。

           2. (例子2):方程组有无穷解的情况,消元失败

上述左边是一个方程组,右边是通过常规方法得到的方程组的解,我们可以看到方程组是有无穷个解的。在几何图像中我们也可以看出,下图是方程组的几何图。

同上原理一样,上边的方程组在几何中的表示如上所示,这是无穷多解的情况,这种情况下也是无法消元的。消元失败。

             3. (例子3):当矩阵的主元是零的时候,我们无法消元的情况下,可以通过行变换来进行消元

上边的公式是一个方程组,把他写成矩阵的形式如下所示:

                                                                        AX=b\rightarrow \begin{bmatrix} 0&2 \\ 3&-2 \end{bmatrix}*\bigl(\begin{smallmatrix} x\\ y \end{smallmatrix}\bigr)=\begin{bmatrix} 4\\5 \end{bmatrix}

上式第一个主元的位置式0,不能消元,那么我们可以把行进行互换,找出新的主元,这在消元法中叫做行变换,其实就是方程组调换位置。调换之后消元如下:

                                                                             \begin{bmatrix} 0 & 2\\ 3&-2 \end{bmatrix}\rightarrow \begin{bmatrix} 3&-2 \\ 0&2 \end{bmatrix}

直接得到我们需要的消元举着,要记得把b也进行调换,直接可以求得消元后的解。

二、矩阵消元

在这一部分,我们就直接给出一个矩阵,来对他进行消元,也就是求出直角三角型状。矩阵如下所示:

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

消元步骤如下:

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

上述是通过一步一步的消元得到了最终得消元结果,也就是三角型得结果。那么接下来我们分解步骤。

           1.第一次消元其实是在原始矩阵的左边乘了一个消元矩阵,为了消去第二行第一列的数。

                                            E_{21}*A\rightarrow {\begin{bmatrix} 1 &0 &0 \\ -3&1 &0 \\ 0&0 &1 \end{bmatrix}}{}*\begin{bmatrix} 1 &2 &1 \\ 3&8 &1 \\ 0& 4 &1 \end{bmatrix}=\begin{bmatrix} 1& 2 &1 \\ 0& 2 &-2 \\ 0&4 & 1 \end{bmatrix}

           2.第二次消元其实是在第一次消元后矩阵的左边乘了一个消元矩阵,为了消去第三行第二列的数。

                                             E_{32}*(E_{21}*A)\rightarrow {\begin{bmatrix} 1 &0 &0 \\ 0&1 &0 \\ 0&-2 &1 \end{bmatrix}}{}*\begin{bmatrix} 1 &2 &1 \\ 0&2 &-2 \\ 0& 4 &1 \end{bmatrix}=\begin{bmatrix} 1& 2 &1 \\ 0& 2 &-2 \\ 0&0 & -5 \end{bmatrix}

           3.把上面两个步骤合并

                                                E_{32}*(E_{21}*A)=U

              U是消元之后得到的矩阵,A是原始的矩阵,E_{32} ,E_{21}是消元矩阵,两者可以利用乘法的结合率结合到一起。矩阵的结合律证明比较麻烦,我们只要了解就好,这些就交给大数学家们证明吧,我们站在巨人的肩膀上,知道了矩阵也可以用乘法的结合律。所以我们把E_{32} ,E_{21}相乘得到了原始矩阵A的消元矩阵,如下所示:

                                       E_{32}*E_{21}=\begin{bmatrix} 1 &0 &0 \\ -3& 1 &0 \\ 0&0 &1 \end{bmatrix}*\begin{bmatrix} 1 &0 &0 \\ 0& 1 &0 \\ 0&-2 &1 \end{bmatrix}=\begin{bmatrix} 1 &0 &0 \\ -3& 1 &0 \\ 0&-2 &1 \end{bmatrix}

上面就是最终得到的原始矩阵A的消元矩阵。

三、(置换矩阵)补充知识

             1.行变换(矩阵左边)

                                                             \begin{bmatrix} 0 &1 \\ 1&0 \end{bmatrix}*\begin{bmatrix} a &b \\ c&d \end{bmatrix}=\begin{bmatrix} c &d \\ a&b \end{bmatrix}

             2.列变换(矩阵右边)

                                                              \begin{bmatrix} a &b \\ c&d \end{bmatrix}*\begin{bmatrix} 0 &1 \\ 1&0 \end{bmatrix}=\begin{bmatrix} b &a \\ d&c \end{bmatrix}

 

四、引申知识(逆矩阵)

上述都是通过消元法找到消元矩阵E。都是通过E*A=U。那么我们思考一下,怎么通过U得到A呢,按照一般乘除法的思路,就是U/A而已,可这是矩阵,方法不在适用。大家思考一下,我们引出下节要讲的内容:逆矩阵(Inverses)。

 

 

 

 

 

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: C语言写矩阵消元代码的步骤如下: 1、定义一个二维数组,用于存储矩阵中的元素; 2、用for循环遍历数组,将最大元素置于对角线上; 3、用for循环实现除法运算,将其他元素除以对角线元素,形成单位化矩阵; 4、用for循环实现减法运算,将其他元素减去对角线元素,将其余元素置零; 5、用for循环实现乘法运算,将结果矩阵的元素乘以原矩阵的元素,得到最终结果。 ### 回答2: 矩阵消元是一种线性代数中常用的操作,可以将一个矩阵通过一系列行变换,得到一个上三角矩阵或者是行最简形矩阵。以下是用C语言编写的一个简单矩阵消元代码的示例: ```c #include <stdio.h> #define SIZE 3 // 矩阵的大小 void printMatrix(float matrix[SIZE][SIZE+1]) { for(int i=0; i<SIZE; i++) { for(int j=0; j<SIZE+1; j++) { printf("%6.2f ", matrix[i][j]); } printf("\n"); } } void gaussianElimination(float matrix[SIZE][SIZE+1]) { for(int i=0; i<SIZE-1; i++) { // 寻找主元素 int max_row = i; float max_val = matrix[i][i]; for(int j=i+1; j<SIZE; j++) { if(matrix[j][i] > max_val) { max_row = j; max_val = matrix[j][i]; } } // 交换行 if(max_row != i) { for(int j=i; j<SIZE+1; j++) { float temp = matrix[i][j]; matrix[i][j] = matrix[max_row][j]; matrix[max_row][j] = temp; } } // 消元 for(int j=i+1; j<SIZE; j++) { float factor = matrix[j][i] / matrix[i][i]; for(int k=i; k<SIZE+1; k++) { matrix[j][k] -= factor * matrix[i][k]; } } } } void backSubstitution(float matrix[SIZE][SIZE+1]) { float solution[SIZE]; for(int i=SIZE-1; i>=0; i--) { solution[i] = matrix[i][SIZE]; for(int j=i+1; j<SIZE; j++) { solution[i] -= matrix[i][j] * solution[j]; } solution[i] /= matrix[i][i]; } // 输出解 printf("解为:\n"); for(int i=0; i<SIZE; i++) { printf("x%d = %6.2f\n", i+1, solution[i]); } } int main() { float matrix[SIZE][SIZE+1] = { {2, 1, -1, -8}, {-3, -1, 2, 1}, {-2, 1, 2, -3} }; printf("原始矩阵:\n"); printMatrix(matrix); gaussianElimination(matrix); printf("上三角矩阵:\n"); printMatrix(matrix); backSubstitution(matrix); return 0; } ``` 这段代码实现了对一个大小为3的矩阵进行消元操作。在`main`函数中,我们首先定义了一个大小为3x4的二维数组`matrix`,其中前3列是矩阵的系数矩阵,最后1列是等号右侧的常数矩阵。 然后,通过调用`printMatrix`函数,我们输出了原始矩阵的内容。 接下来,我们调用`gaussianElimination`函数来进行高斯消元,将矩阵转化为上三角形式。在该函数中,我们采用了主元选取策略,确保每次消元时使用绝对值最大的元素作为主元素。然后通过行交换和消元操作,将主元下方的元素都变为0。 最后,我们调用`backSubstitution`函数对上三角矩阵进行回代操作,求解方程组的解,并输出结果。 运行该代码,输出结果将包括原始矩阵、上三角矩阵和方程组的解。这就是使用C语言编写的一个简单的矩阵消元的示例代码。 ### 回答3: 矩阵消元是线性代数中的一种常用操作,可以将一个矩阵转化为其标准形式,简化后续的计算操作。下面是一个用C语言写的简单矩阵消元的代码: ```c #include <stdio.h> #define MAX_SIZE 100 void printMatrix(int n, int mat[][MAX_SIZE]) { for(int i=0; i<n; i++) { for(int j=0; j<n; j++) { printf("%d ", mat[i][j]); } printf("\n"); } } void rowOperation(int n, int mat[][MAX_SIZE], int row1, int row2, int scalar) { for(int i=0; i<n; i++) { mat[row2][i] += scalar * mat[row1][i]; } } void rowEchelonForm(int n, int mat[][MAX_SIZE]) { int lead = 0; for(int r=0; r<n; r++) { if(lead >= n) return; int i = r; while(mat[i][lead] == 0) { i++; if(i == n) { i = r; lead++; if(lead == n) return; } } // 交换第r行和第i行 for(int j=0; j<n; j++) { int temp = mat[r][j]; mat[r][j] = mat[i][j]; mat[i][j] = temp; } // 将第r行的首元素变为1 int scalar = mat[r][lead]; for(int j=0; j<n; j++) { mat[r][j] /= scalar; } // 去其他行中的首元素 for(int j=0; j<n; j++) { if(j != r) { scalar = mat[j][lead]; rowOperation(n, mat, r, j, -scalar); } } lead++; } } int main() { int n; printf("请输入矩阵的维度:"); scanf("%d", &n); int matrix[MAX_SIZE][MAX_SIZE]; printf("请输入矩阵的元素:\n"); for(int i=0; i<n; i++) { for(int j=0; j<n; j++) { scanf("%d", &matrix[i][j]); } } printf("原始矩阵为:\n"); printMatrix(n, matrix); rowEchelonForm(n, matrix); printf("矩阵消元后的结果为:\n"); printMatrix(n, matrix); return 0; } ``` 以上代码实现了一个求矩阵消元的函数`rowEchelonForm`,可以将输入的矩阵转化为行阶梯形式。在`main`函数中,首先获取矩阵的维度,然后输入矩阵的元素,调用`rowEchelonForm`函数进行消元,并打印消元后的结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值