高斯消元法(二):高斯消元法原理

高斯消去法是一种常用的求解线性方程组的方法,通过逐次消元后,在回代求解,实际计算中常用的一种方法。


顺序消去法

将Ax=b按照从上至下、从左至右的顺序化为上三角方程组,中间过程不对矩阵进行交换,主要步骤如下。


STEP1:

将第2行至第n行,每行分别与第一行做运算,消掉每行第一个参数。公式如:

形成如下图所示新矩阵:



STEP2:

从新矩阵的a22开始(a22不能为0),以第二行为基准,将第三行至第n行分别与第二行做运算,消掉每行第二个参数。

公式如:,形成如下图所示新矩阵:



STEP K:

按照上述方法,当第k步运算时,公式为:

运算前后的矩阵为:




STEP (n-1):

经过 n-1 步,方程组也就转化为了我们希望得到的上三角方程组,如下:



再通过回代过程即可求解 X1至 Xn 的值。


顺序消去法计算量

消去过程:


回代过程:   


总运算量:



顺序消去法虽然编程操作简单,但是存在以下两方面限制:

(1)每次运算时,必须保证对角线上的元素不为0(即运算中的分母不为0),否则算法无法继续进行。

(2)即使a(kk)的值不为零,但如果绝对值很小,由于第k次运算中a(kk)在分母位置,因此作除数会引起很大的误差,从而影响算法的稳定性。





正是由于顺序消去法会因为 a(kk) 的值过小而引入计算误差,为了减少计算过程中舍入误差对方程组求解的影星,因此是否可以选择绝对值尽可能大的 a(kk) 主元作为除数,基于这种思想就有了高斯消去法的改进型:列主元消去法 和 全主元消去法。


列(全)主元消去法

基本思想:

在第k步消元钱,找出k行下所有第k列元素最大的非零元素 a(pk), 将第 p 行与第 k行进行整行交换,这样既不影响原方程的解,也可以将绝对值最大的a(pk)作为主元,放在处暑的位置上,尽可能减小引入误差。   

全主元消除法与列主元消除法类似,只不过列主元消除法是从第k列中选取一个最大的元素,与第k行进行交换。 而全主元消除法释从第k行第k列开始的右下角矩阵中所有元素中选取一个最大的元素作为主元,同时交换p行与q列,从而保证稳定性。


如下面这个列主元消去法的例子:











  • 18
    点赞
  • 88
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
高斯消元法是一种线性代数中求解线性方程组的方法,其基本思想是通过初等变换将系数矩阵化为上三角矩阵,然后通过回代求解方程组的解。下面是高斯消元法Python代码: ``` import numpy as np def Gauss_elimination(A): # 消元,化为上三角 for k in range(len(A[0])): for i in range(k+1,len(A)): m=A[i][k]/A[k][k] for j in range(k,len(A[0])): A[i][j]-=m*A[k][j] A[i][k]=0 #回代 X=[] X.append(A[len(A)-1][len(A)]/A[len(A)-1][len(A)-1]) for i in range(len(A)-2,-1,-1): s=A[i][len(A)] for j in range(i+1,len(A)): s = s - A[i][j] * X[len(A)-1-j] X.append(s/A[i][i]) X.reverse() return X A = np.array([[3,1,-1,4],[4,0,4,8],[12,-3,3,9]]) print(Gauss_elimination(A)) ``` 列主元高斯消元法高斯消元法的一种改进方法,其在消元过程中每次选择系数矩阵中绝对值最大的元素作为主元素,以提高计算精度。下面是列主元高斯消元法Python代码: ``` import numpy as np def Gauss_Lelimination(A): # 列主元高斯消去法求解 for k in range(len(A[0])-1): # 在整个系数矩阵中选择列主元 max=A[k][k] for i in range(k+1,len(A)): # 选主元 if (abs(max)<abs(A[i][k])): max=A[i][k] x=i #记录选择交换的行数 A[[k,x],:]=A[[x,k],:] return Gauss_elimination(A) def Gauss_elimination(A): # 消元,化为上三角 for k in range(len(A[0])): for i in range(k+1,len(A)): m=A[i][k]/A[k][k] for j in range(k,len(A[0])): A[i][j]-=m*A[k][j] A[i][k]=0 #回代 X=[] X.append(A[len(A)-1][len(A)]/A[len(A)-1][len(A)-1]) for i in range(len(A)-2,-1,-1): s=A[i][len(A)] for j in range(i+1,len(A)): s = s - A[i][j] * X[len(A)-1-j] X.append(s/A[i][i]) X.reverse() return X A = np.array([[3,1,-1,4],[4,0,4,8],[12,-3,3,9]]) print(Gauss_Lelimination(A)) ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值