列主元Gauss消元法各大教科书都有,是很基础的解方程组方法。其主要思想是把方程组化为上三角方程组,然后通过回代的方法求得方程组的解。
Gauss的具体原理请参照数值分析的相关教课书这里不再赘述。
算法流程
输入:增广矩阵
输出:方程组的解,或方程组无解的提示
- 对于k = 1,2,…,n-1,执行步骤2到步骤5
- 选择第k列中最大的元素,将其所在行换到第k行。如果最大元素是0,则方程无解,程序退出
- 对于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=aij−likakjbi=bi−likbk - 回代
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=aiibi−∑j=i+1naijxj - 输出 x 1 , x 2 , . . . , x n x_1,x_2,...,x_n x1,x2,...,xn.
代码
def SolvingLinearEquations(AugmentedMatrix):
col = AugmentedMatrix.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
测试
以下面这道题做实验
#增广矩阵
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]