第二课-矩阵消元

1 概述

本节主要是对消元法的讲解。首先主要介绍了消元法的具体步骤使用消元法对矩阵A的要求,然后介绍了如何使用矩阵乘法来表示消元操作

2 消元法求解方程

2.1 消元法介绍

首先通过一个例子来求解 A x = b Ax=b Ax=b,这里 A A A需要是可逆矩阵,即非奇异矩阵
{ x + 2 y + z = 2 3 x + 8 y + z = 12 4 y + z = 2 (1) \tag{1} \left \{ \begin{aligned} x+2y+z&=2\\ 3x+8y+z&=12\\ 4y+z &=2 \end{aligned} \right. x+2y+z3x+8y+z4y+z=2=12=2(1)
我们先按行将方程组写成矩阵形式:
[ 1 2 1 3 8 1 0 4 1 ] [ x y z ] = [ 2 12 2 ] \begin{array}{cccc} \begin{bmatrix} 1&2&1 \\ 3&8&1 \\ 0&4&1 \end{bmatrix} \begin{bmatrix} x\\y\\z \end{bmatrix} = \begin{bmatrix} 2\\12\\2 \end{bmatrix} \end{array} 130284111xyz=2122

这里矩阵的消元法和我们在初等数学中求解二元一次方程组的方法本质上是一样的,都是通过对不同行的方程进行四则运算来消去未知元,得到简化后的方程组。在线性代数中,我们把系数抽取出来,组合成矩阵,寻找一种普遍规律。

系数矩阵 A = [ 1 2 1 3 8 1 0 4 1 ] A=\begin{bmatrix}\textcolor{red}{1}&2&1\\3&8&1\\0&4&1\end{bmatrix} A=130284111,这里用 A i j A_{ij} Aij表示系数矩阵中第 i i i行,第 j j j列的数。其中 A 11 = 1 A_{11}=1 A11=1主元1,主元是矩阵经过消元操作,变为阶梯形之后,非零行左边第一个非零元素。在消元操作中我们让主元 A i j A_{ij} Aij保持不变,主元所在列的其它元素 A k j ( k > i ) A_{kj}(k>i) Akj(k>i)化为0。
通过 r o w 2 − r o w 1 ∗ 3 row2-row1*3 row2row13的操作我们能够将 A 21 A_{21} A21消为 0 0 0,得到主元2 A 22 A_{22} A22,这时矩阵为 [ 1 2 1 0 2 − 2 0 4 1 ] \begin{bmatrix}1&2&1\\0&2&-2\\0&4&1\end{bmatrix} 100224121
观察 [ 2 − 2 4 1 ] \begin{bmatrix}\textcolor{red}{2}&-2\\4&1\end{bmatrix} [2421],同理,我们可以通过 r o w 3 − r o w 2 ∗ 2 row3-row2*2 row3row22 操作将 A 32 A_{32} A32消为 0 0 0,得到 U = [ 1 2 1 0 2 − 2 0 0 5 ] U=\begin{bmatrix}1&2&1\\0&2&-2\\0&0&5\end{bmatrix} U=100220125

  • A 11 = 1 A_{11}=1 A11=1 A 22 = 2 A_{22}=2 A22=2 A 33 = 5 A_{33}=5 A33=5为三个主元。
  • 消元的目的是从 A    ⟹    U ( U 为 上 三 角 阵 ) A \implies U(U为上三角阵) AU(U),找到三个主元。在消元过程中,为了满足主元不能为 0 0 0的要求,可以交换行。
  • A A A的行列式=各主元的乘积 = 1 ∗ 2 ∗ 5 = 10 =1*2*5=10 =125=10
  • [ 2 12 2 ] ⏟ B \underbrace{\begin{bmatrix}2\\12\\2\end{bmatrix}}_{B} B 2122 A A A进行一样的倍数操作可以得到 [ 2 6 − 10 ] ⏟ C \underbrace{\begin{bmatrix}2\\6\\-10\end{bmatrix}}_{C} C 2610

2.2 回代

  • 将原方程用 U U U c c c代入得:
    { x + 2 y + z = 2 2 y − 2 z = 6 5 z = − 10 (2) \left\{\tag{2} \begin{aligned} x+2y+z&=2\\2y-2z&=6\\5z&=-10 \end{aligned} \right. x+2y+z2y2z5z=2=6=10(2)

  • 公式(2)由下往上递归很容易求出: { x = 2 y = 1 z = − 2 \left\{\begin{aligned}x&=2\\y&=1\\z&=-2\end{aligned}\right. xyz=2=1=2

3 消元矩阵(矩阵的线性组合)

接下来我们需要用矩阵来表示上文具体的变换步骤,首先介绍下向量与矩阵的乘法。

  • 列向量与矩阵的乘法
    [ ⋯ ⋯ ⋯ ⋮ ⋱ ⋮ ⋯ ⋯ ⋯ ] [ 3 4 5 ] = [ 3 ∗ c o l 1 4 ∗ c o l 2 5 ∗ c o l 3 ] \begin{bmatrix} \cdots&\cdots&\cdots\\ \vdots&\ddots&\vdots\\ \cdots&\cdots&\cdots \end{bmatrix} \begin{bmatrix}3\\4\\5\end{bmatrix}= \begin{bmatrix}3*col_{1}\\4*col_{2}\\5*col_{3}\end{bmatrix} 345=3col14col25col3

  • 行向量与矩阵的乘法
    [ 1 2 7 ] [ ⋯ ⋯ ⋯ ⋮ ⋱ ⋮ ⋯ ⋯ ⋯ ] = [ 1 ∗ r o w 1 2 ∗ r o w 2 7 ∗ r o w 3 ] \begin{bmatrix}1&2&7\end{bmatrix} \begin{bmatrix} \cdots&\cdots&\cdots\\ \vdots&\ddots&\vdots\\ \cdots&\cdots&\cdots \end{bmatrix}= \begin{bmatrix}1*row_{1}\\2*row_{2}\\7*row_{3}\end{bmatrix} [127]=1row12row27row3

消元矩阵的实质就是将消元过程中的行变换操作转化为矩阵之间的乘法形式。我们由行向量与矩阵的乘法很容易就可以知道: [ 1 0 ⋯ 0 ] \begin{bmatrix}1&0&\cdots&0\end{bmatrix} [100]乘以一个矩阵,会得到该矩阵的第一行。 [ 0 1 ⋯ 0 ] \begin{bmatrix}0&1&\cdots&0\end{bmatrix} [010] [ 0 0 ⋯ 1 ] \begin{bmatrix}0&0&\cdots&1\end{bmatrix} [001]分别可以得到矩阵的其余行。将这些向量组合起来,就可以得到单位矩阵 I I I(对角线上元素为1,其余元素均为0): I = [ 1 ⋯ 0 0 ⋱ 0 0 ⋯ 1 ] I=\begin{bmatrix}1&\cdots&0\\0&\ddots&0\\0&\cdots&1\end{bmatrix} I=100001,单位矩阵乘以任何一个矩阵还是等于该矩阵本身,即 I A = A IA=A IA=A

观察我们之前的消元操作, r o w 2 − r o w 1 ∗ 3 row2-row1*3 row2row13。为了让 A 21 = 0 A_{21}=0 A21=0,让矩阵 [ 1 2 1 3 8 1 0 4 1 ] \begin{bmatrix}1&2&1\\3&8&1\\0&4&1\end{bmatrix} 130284111的第二行加上第一行的-3倍,结合上文提到的行向量乘法,我们可以将操作 r o w 2 − r o w 1 ∗ 3 row2-row1*3 row2row13转化为向量 [ − 3 1 0 ] ∗ [ 1 2 1 3 8 1 0 4 1 ] = [ 0 2 − 2 ] \begin{bmatrix}-3&1&0\end{bmatrix}*\begin{bmatrix}1&2&1\\3&8&1\\0&4&1\end{bmatrix}=\begin{bmatrix}0&2&-2\end{bmatrix} [310]130284111=[022],为了让矩阵的其他行保持不变,我们用消元矩阵 E 21 E_{21} E21(让矩阵第二行第一列元素变化0)乘上矩阵 A A A
[ 1 0 0 − 3 1 0 0 0 1 ] ⏟ E 21 [ 1 2 1 3 8 1 0 4 1 ] ⏟ A = [ 1 2 − 1 0 2 − 2 0 4 1 ] ⏟ B \underbrace{\begin{bmatrix}1&0&0\\-3&1&0\\0&0&1\end{bmatrix}}_{E_{21}} \underbrace{\begin{bmatrix}1&2&1\\3&8&1\\0&4&1\end{bmatrix}}_{A}= \underbrace{\begin{bmatrix}1&2&-1\\0&2&-2\\0&4&1\end{bmatrix}}_{B} E21 130010001A 130284111=B 100224121

同理,我们可以将操作 r o w 3 − r o w 2 ∗ 2 row3-row2*2 row3row22化为消元矩阵 E 32 ∗ B E_{32}*B E32B
[ 1 0 0 0 1 0 0 − 2 1 ] ⏟ E 32 [ 1 2 − 1 0 2 − 2 0 4 1 ] ⏟ B = [ 1 2 1 0 2 − 2 0 0 5 ] ⏟ U \underbrace{\begin{bmatrix}1&0&0\\0&1&0\\0&-2&1\end{bmatrix}}_{E_{32}} \underbrace{\begin{bmatrix}1&2&-1\\0&2&-2\\0&4&1\end{bmatrix}}_{B}= \underbrace{\begin{bmatrix}1&2&1\\0&2&-2\\0&0&5\end{bmatrix}}_{U} E32 100012001B 100224121=U 100220125

最终我们得到: E 32 ( E 21 A ) = U E_{32}(E_{21}A)=U E32(E21A)=U,观察 E 21 , E 32 E_{21},E_{32} E21,E32我们可以对单位矩阵 I = [ 1 0 0 0 1 0 0 0 1 ] I=\begin{bmatrix}1&0&0\\0&1&0\\0&0&1\end{bmatrix} I=100010001进行操作 r o w 2 − r o w 1 ∗ 3 row2-row1*3 row2row13得到 E 21 = [ 1 0 0 − 3 1 0 0 0 1 ] E_{21}=\begin{bmatrix}1&0&0\\-3&1&0\\0&0&1\end{bmatrix} E21=130010001,对 I = [ 1 0 0 0 1 0 0 0 1 ] I=\begin{bmatrix}1&0&0\\0&1&0\\0&0&1\end{bmatrix} I=100010001进行操作 r o w 3 − r o w 2 ∗ 2 row3-row2*2 row3row22得到 [ 1 0 0 0 1 0 0 − 2 1 ] \begin{bmatrix}1&0&0\\0&1&0\\0&-2&1\end{bmatrix} 100012001。我们将 E 21 , E 32 E_{21},E_{32} E21,E32称为初等变换。我们可以使用乘法结合律,先计算 E 32 ∗ E 21 E_{32} * E_{21} E32E21,记做 E E E, E E E就是整个消元过程的消元矩阵。

求消元矩阵就是把 A A A每次变换的消元步骤操作在 I I I矩阵上,得到相应的 E i j E_{ij} Eij,最后累积得到 E E E

置换矩阵 P P P

  • A n ∗ n A_{n*n} Ann的置换矩阵 P P P的数量个数为 n 2 n^2 n2,其中包括单位阵 I I I在内
  • 置换 A A A的两行,置换矩阵 P P P A A A的左侧
    [ 0 1 1 0 ] ⏟ P [ a b c d ] ⏟ A = [ c d a b ] \underbrace{\begin{bmatrix}0&1\\1&0\end{bmatrix}}_{P}\underbrace{\begin{bmatrix}a&b\\c&d\end{bmatrix}}_{A}=\begin{bmatrix}c&d\\a&b\end{bmatrix} P [0110]A [acbd]=[cadb]
  • 置换 A A A的两列,置换矩阵 P P P A A A的右侧
    [ a b c d ] ⏟ A [ 0 1 1 0 ] ⏟ P = [ b a d c ] \underbrace{\begin{bmatrix}a&b\\c&d\end{bmatrix}}_{A}\underbrace{\begin{bmatrix}0&1\\1&0\end{bmatrix}}_{P}=\begin{bmatrix}b&a\\d&c\end{bmatrix} A [acbd]P [0110]=[bdac]

逆矩阵

从上面我们可以得到: P ∗ A = U P*A=U PA=U,即用矩阵乘法对一个矩阵进行变化。现在我们考虑一个反过程,怎样把 U U U还原成矩阵 A A A?
r o w 2 − r o w 1 ∗ 3 row2-row1*3 row2row13,我们得到 E 21 = [ 1 0 0 − 3 1 0 0 0 1 ] E_{21}=\begin{bmatrix}1&0&0\\-3&1&0\\0&0&1\end{bmatrix} E21=130010001;现在我们进行相反操作 r o w 2 + r o w 1 ∗ 3 row2+row1*3 row2+row13,得到 E 21 − 1 = [ 1 0 0 3 1 0 0 0 1 ] E_{21}^{-1}=\begin{bmatrix}1&0&0\\3&1&0\\0&0&1\end{bmatrix} E211=130010001
E 21 ∗ E 21 − 1 = [ 1 0 0 − 3 1 0 0 0 1 ] ∗ [ 1 0 0 3 1 0 0 0 1 ] = [ 1 0 0 0 1 0 0 0 1 ] = I E_{21}*E_{21}^{-1}=\begin{bmatrix}1&0&0\\-3&1&0\\0&0&1\end{bmatrix}*\begin{bmatrix}1&0&0\\3&1&0\\0&0&1\end{bmatrix}= \begin{bmatrix}1&0&0\\0&1&0\\0&0&1\end{bmatrix}=I E21E211=130010001130010001=100010001=I
我们将 E 21 − 1 E_{21}^{-1} E211称为 E 21 E_{21} E21的逆矩阵,逆矩阵是唯一的。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值