Python解线性方程组:列主元Gauss消元法

目录

  • 算法流程
  • 代码
  • 测试

列主元Gauss消元法各大教科书都有,是很基础的解方程组方法。其主要思想是把方程组化为上三角方程组,然后通过回代的方法求得方程组的解。

Gauss的具体原理请参照数值分析的相关教课书这里不再赘述。


算法流程

输入:增广矩阵
输出:方程组的解,或方程组无解的提示

  1. 对于k = 1,2,…,n-1,执行步骤2到步骤5
  2. 选择第k列中最大的元素,将其所在行换到第k行。如果最大元素是0,则方程无解,程序退出
  3. 对于i = k + 1,…,n,计算
    l i k = a i k a k k    a i j = a i j − l i k a k j    b i = b i − l i k b k l_{ik} = \frac{a_{ik}}{a_{kk}}\\ \;\\ a_{ij}=a_{ij}-l_{ik} a_{kj}\\ \;\\ b_{i}=b_{i}-l_{ik} b_{k} lik=akkaikaij=aijlikakjbi=bilikbk
  4. 回代
    x n = b n a n n    x i = b i − ∑ j = i + 1 n a i j x j a i i x_n = \frac{b_n}{a_{nn}}\\ \;\\ x_i = \frac{b_i-\sum_{j=i+1}^na_{ij}x_j}{a_{ii}} xn=annbnxi=aiibij=i+1naijxj
  5. 输出 x 1 , x 2 , . . . , x n x_1,x_2,...,x_n x1,x2,...,xn.

代码

def SolvingLinearEquations(AugmentedMatrix):
    col = A.shape[1] #增广矩阵列数
    #消元
    for i in range(col- 2):
        current_column  = AugmentedMatrix[i:,i] 
        max_index = np.argmax(current_column) + i #寻找最大元
        if(AugmentedMatrix[max_index,i] == 0):
            print("无唯一解")
            return
        AugmentedMatrix[[i,max_index],:] = AugmentedMatrix[[max_index,i],:] #交换
        l = AugmentedMatrix[i+1:,i] / AugmentedMatrix[i,i] #计算系数
        m =  np.tile(AugmentedMatrix[i,:],(l.shape[0],1)) * np.tile(l,(col,1)).T #计算消元时减去的矩阵
        AugmentedMatrix[i+1:,:] = AugmentedMatrix[i+1:,:] - m #消元
    if(AugmentedMatrix[col - 2,col - 2] == 0):
            print("无唯一解")
            return
   #代入
    x = np.zeros(col-1)
    for i in range(col-2,-1,-1):
        x[i] = (AugmentedMatrix[i,-1] - np.dot(AugmentedMatrix[i,:-1] , x.T)) / AugmentedMatrix[i,i]
    return x    
                

测试

以下面这道题做实验
Python解线性方程组:列主元Gauss消元法_第1张图片

#增广矩阵
A =  np.array([[0.0120,0.0100,0.1670,0.6781],
               [1.000,0.8334,5.910,12.10],
               [3200,1200,4.200,983.3]])
x = SolvingLinearEquations(A)

程序计算结果
[ 17.4605799 , -45.76154086, 5.54603862]

你可能感兴趣的:(算法,算法,矩阵,线性代数,python)