第二节-矩阵消元

消元法

消元法是高斯首次提出用来求解n元n次方程组的方法,这是一个很自然有效的方法,它可以求解方程组的解也可以判断无解的情况。主要包括消元和回代两个步骤即可求出方程组的解。例如以下方程组
{x+2y+z=23x+8y+z=120x+4y+z=2 \begin{cases} x+2y+z=2\\ 3x+8y+z=12\\ 0x+4y+z =2 \end{cases} x+2y+z=23x+8y+z=120x+4y+z=2
根据上一节对应的矩阵形式Ax = b 为
[121381041][xyz]=[2122] \left[ \begin{array} {ccc} 1&2&1\\ 3&8&1\\ 0&4&1 \end{array} \right] \left[ \begin{array} {ccc} x\\ y\\ z \end{array} \right]= \left[ \begin{array} {ccc} 2\\ 12\\ 2 \end{array} \right] 130284111xyz=2122
按照我们以前做消元法的思路,我们对系数矩阵A进行变换如下(当然向量b也会做对应的变化,这里我们先考虑A)。
[[1]21381041](row2-3row1)⟶[[1]210[2]−2041](row3-2row2)⟶[[1]210[2]−200[5]] \left[ \begin{array} {ccc} \text{[1]} &2&1\\ 3&8&1\\ 0&4&1 \end{array} \right] \text{(row2-3row1)} \longrightarrow \left[ \begin{array} {ccc} \text{[1]} &2&1\\ 0&\text{[2]}&-2\\ 0&4&1 \end{array} \right] \text{(row3-2row2)} \longrightarrow \left[ \begin{array} {ccc} \text{[1]}&2&1\\ 0&\text{[2]}&-2\\ 0&0&\text{[5]} \end{array} \right] [1]30284111(row2-3row1)[1]002[2]4121(row3-2row2)[1]002[2]012[5]

  1. 第一步,在第一个方程以下得所有方程中消去x项,在矩阵A中就需要将主元一以下得所有x项变为0。因此我们将主元行一乘以3可以消去第二行得x,第三行x得位置已经是0,所以不需做任何操作。
  2. 第二步,在第二个方程以下所有方程中消去y项目,选定主元二,将第二行以下所有y项变为0。因此我们进一步消元操作可以得到最终得矩阵:
    U=[[1]210[2]−200[5]] U = \left[ \begin{array} {ccc} \text{[1]}&2&1\\ 0&\text{[2]}&-2\\ 0&0&\text{[5]} \end{array} \right] U=[1]002[2]012[5]
    注意到第三行消元过后仅剩一个非零元素,所以它就成为第三个主元。做到这里就算消元完成了。
    再来讨论一下消元失效的情形:首先,主元不能为零;其次,如果在消元时遇到主元位置为零,则需要交换行,使主元不为零;如果换行也无法解决问题,则可以得出方程无解,或者矩阵不可逆(下一节)。
  3. 回代,以上得矩阵变换只处理了系数矩阵A,要得到最终解需要对结果向量b也进行相应得处理,这时我们在A矩阵后面加上bb向量写成增广矩阵(augmented matrix)的形式:
    [A∣b]=[1212381120412]⟶[121202−260412]⟶[121202−26005−10]=[U∣c] \left[ A|b \right] = \left[ \begin{array}{ccc|c} 1&2&1&2\\ 3&8&1&12\\ 0&4&1&2 \end{array} \right] \longrightarrow \left[ \begin{array} {ccc|c} 1&2&1&2\\ 0&2&-2&6\\ 0&4&1&2 \end{array} \right] \longrightarrow \left[ \begin{array} {ccc|c} 1&2&1&2\\ 0&2&-2&6\\ 0&0&5&-10 \end{array} \right] = \left[ U|c \right] [Ab]=13028411121221002241212621002201252610=[Uc]

最终的矩阵即为【U|c】,对应的方程组为
{x+2y+z=22y−2z=65z=−10 \begin{cases} x+2y+z=2\\ 2y-2z=6\\ 5z =-10 \end{cases} x+2y+z=22y2z=65z=10
可求得解为 z=-2,y=1,x=2。

矩阵消元

矩阵乘法

上面我们通过消元的方式得到了最终的系数矩阵,那么如何通过矩阵的计算得到我们要的结果呢?这要用到矩阵的乘法,上一节我们讨论了矩阵乘以向量可以看成是矩阵列的线性组合,即:
[col1col2col3]×[abc]=a×col1+b×col2+c×col3 \left[ \begin{array} {ccc} col_1&col_2&col_3\\ \end{array} \right] × \left[ \begin{array} {ccc} a\\ b\\ c \end{array} \right] = a×col_1 + b×col_2 + c×col_3 [col1col2col3]×abc=a×col1+b×col2+c×col3
考虑到消元法中讲的都是行变换,我们需要矩阵乘法中按行的情况。即一个行向量乘以矩阵可以看成是矩阵行的线性组合,即
[abc]×[row1row2row3]=a×row1+b×row2+c×row3 \left[ \begin{array} {ccc} a&b&c\\ \end{array} \right] × \left[ \begin{array} {ccc} row_1\\ row_2\\ row_3 \end{array} \right] = a×row_1 + b×row_2 + c×row_3 [abc]×row1row2row3=a×row1+b×row2+c×row3

消元的矩阵解释

回到消元矩阵的步骤,第一步们将矩阵A的第二行减去三倍行一,其他行保持不变。即:
[?????????]×[121381041]=[12102−2041] \left[ \begin{array} {ccc} ?&?&?\\ ?&?&?\\ ?&?&?\\ \end{array} \right] × \left[ \begin{array} {ccc} 1&2&1\\ 3&8&1\\ 0&4&1 \end{array} \right] = \left[ \begin{array} {ccc} 1&2&1\\ 0&2&-2\\ 0&4&1 \end{array} \right] ?????????×130284111=100224121
我们把所求矩阵称为初等矩阵E21E_21E21,因为我们用它来将位置(2,1)变为0,设结果矩阵为A′A'A,利用上面行向量乘法,A′A'A的每一行都是矩阵X对应行针对矩阵AAA行向量的线性组合,要得到A′A'A,即E21×A=A′E_{21}×A=A'E21×A=A,则有:
{E21row1×A=Arow1′E21row2×A=Arow2′E21row3×A=Arow3′ \begin{cases} E_{21_{row1}}×A=A'_{row1}\\ E_{21_{row2}}×A=A'_{row2}\\ E_{21_{row3}}×A=A'_{row3}\\ \end{cases} E21row1×A=Arow1E21row2×A=Arow2E21row3×A=Arow3
由此可以得到:
[100−310001]×[121381041]=[12102−2041] \left[ \begin{array} {ccc} 1&0&0\\ -3&1&0\\ 0&0&1\\ \end{array} \right] × \left[ \begin{array} {ccc} 1&2&1\\ 3&8&1\\ 0&4&1 \end{array} \right] = \left[ \begin{array} {ccc} 1&2&1\\ 0&2&-2\\ 0&4&1 \end{array} \right] 130010001×130284111=100224121
(这里补充一下,根据上面等式,不难看出如果X=[100010001]X= \left[\begin{array}{ccc}1&0&0\\0&1&0\\0&0&1\\\end{array}\right]X=100010001 则有 X×A=AX×A=AX×A=A,这时我们把XXX称为单位矩阵III)。
同理,第二步我们有初等矩阵E32E_{32}E32,即将第三行第二个元素变为零,将第三行减去两倍的行二,即E32×A′=UE_{32}×A'=UE32×A=U,即
{E32row1×A′=Urow1E32row2×A′=Urow2E32row3×A′=Urow3 \begin{cases} E_{32_{row1}}×A'=U_{row1}\\ E_{32_{row2}}×A'=U_{row2}\\ E_{32_{row3}}×A'=U_{row3}\\ \end{cases} E32row1×A=Urow1E32row2×A=Urow2E32row3×A=Urow3
由此可以得到:
[1000100−21]×[12102−2041]=[12102−2005] \left[ \begin{array} {ccc} 1&0&0\\ 0&1&0\\ 0&-2&1\\ \end{array} \right] × \left[ \begin{array} {ccc} 1&2&1\\ 0&2&-2\\ 0&4&1 \end{array} \right] = \left[ \begin{array} {ccc} 1&2&1\\ 0&2&-2\\ 0&0&5 \end{array} \right] 100012001×100224121=100220125
矩阵消元至此结束,每一步用到一个初等矩阵,回顾一下这两个步骤我们是如何从矩阵AAA得到矩阵UUU的呢。通过公式描述以上过程如下:
E32×(E21×A)=U E_{32}×(E_{21}×A) = U E32×(E21×A)=U矩阵乘法虽然不能随意变动相乘次序,但是可以变动括号位置,也就是满足结合律(associative law),因此如下等式成立:
(E32×E21)×A=U (E_{32}×E_{21})×A = U (E32×E21)×A=U
这样我们就可以通过一个矩阵解决所有消元操作,设E=E32×E21E=E_{32}×E_{21}E=E32×E21,下一节我们将讨论如何得到EEE

### C语言实现增广矩阵形成上三角矩阵 在C语言中,可以通过高斯消元法将增广矩阵转换为上三角矩阵。以下是一个完整的代码示例,展示如何通过用户输入的增广矩阵进行操作,最终得到上三角矩阵[^3]。 ```c #include <stdio.h> #define N 3 // 假设是3个未知数的方程组 double A[N][N + 1]; // 增广矩阵 // 输入增广矩阵 void inputMatrix() { for (int i = 0; i < N; ++i) { for (int j = 0; j <= N; ++j) { printf("请输入第%d行第%d列的素:", i + 1, j + 1); scanf("%lf", &A[i][j]); } } } // 高斯形成上三角矩阵 void gaussEliminationToUppperTriangular() { for (int k = 0; k < N - 1; ++k) { // 外层循环选择主行 if (A[k][k] == 0) { printf("主为零,无法继续计算。\n"); return; } for (int i = k + 1; i < N; ++i) { // 内层循环去下三角部分 double factor = A[i][k] / A[k][k]; for (int j = k; j <= N; ++j) { A[i][j] -= factor * A[k][j]; } } } } // 打印矩阵 void printMatrix() { for (int i = 0; i < N; ++i) { for (int j = 0; j <= N; ++j) { printf("%.2lf ", A[i][j]); } printf("\n"); } } int main() { printf("请输入增广矩阵的值:\n"); inputMatrix(); // 输入增广矩阵 gaussEliminationToUppperTriangular(); // 高斯形成上三角矩阵 printf("\n形成的上三角矩阵为:\n"); printMatrix(); // 打印结果矩阵 return 0; } ``` 上述代码实现了从用户输入增广矩阵开始,到通过高斯消元法矩阵转换为上三角矩阵的过程[^3]。代码中的`gaussEliminationToUppperTriangular`函数负责执行操作,确保每次迭代后,当前列下方的所有素都被去。 ### 注意事项 - 如果主(即对角线上的素)为零,则需要进行行交换以避免除以零的操作[^4]。 - 矩阵的大小可以通过修改`#define N`的值来调整,但需注意内存限制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值