高斯消元法简介
数学上,高斯消元法,是线性代数规划中的一个算法,可用来为线性方程组求解。但其算法十分复杂,不常用于加减消元法,求出矩阵的秩,以及求出可逆方阵的逆矩阵。不过,如果有过百万条等式时,这个算法会十分省时。一些极大的方程组通常会用迭代法以及花式消元来解决。当用于一个矩阵时,高斯消元法会产生出一个“行梯阵式”。高斯消元法可以用在电脑中来解决数千条等式及未知数。亦有一些方法特地用来解决一些有特别排列的系数的方程组。
内容
消元法是将方程组中的一方程的未知数用含有另一未知数的代数式表示,并将其代入到另一方程中,这就消去了一未知数,得到一解;或将方程组中的一方程倍乘某个常数加到另外一方程中去,也可达到消去一未知数的目的。消元法主要用于二元一次方程组的求解。
核心
1)两方程互换,解不变;
2)一方程乘以非零数k,解不变;
3)一方程乘以数k加上另一方程,解不变
算法思路
思路就是根据高斯消元法的特性,先将矩阵化成行阶梯型矩阵,由行阶梯型矩阵得出秩再判断线性方程组解的个数
如果R(A)<=R(Ab) 则方程无解
R(A)=R(Ab)=N时方程有唯一解 (齐次方程称无非0解)
R(A)=R(Ab)<N时方程有无穷个解 (齐次方程称有非0解)
得出解的个数后,如果存在唯一解,再将之前的矩阵化为行最简形矩阵,得出线性方程组的解
代码
import numpy as np
def swap(a, b, k, n):
ans = 0
for i in range(k, n):
if ans < np.fabs(a[i][k]):
ans = a[i][k]
maxn = i
a[[k, maxn], :] = a[[maxn, k], :]
b[k], b[maxn] = b[maxn], b[k]
def gaosi(a, b):
cout = 0
m, n = a.shape
if ( m < n ):
print("有解")
else:
l = np.zeros((n,n))
for i in range(n):
if (a[i][i] == 0):
print("无解")
for k in range(n - 1):
swap(a, b, k, n)
for i in range(k + 1, n):
l[i][k] = a[i][k] / a[k][k]
cout += 1
for j in range(m):
a[i][j] = a[i][j] - l[i][k] * a[k][j]
cout += 1
b[i] = b[i] - l[i][k] * b[k]
x = np.zeros(n)
x[n - 1] = b[n - 1] / a[n - 1][n - 1]
for i in range(n - 2, -1, -1):
for j in range(i + 1, n):
b[i] -= a[i][j] * x[j]
x[i] = b[i] / a[i][i]
for i in range(n):
print("x" + str(i + 1) + " = ", x[i])
print("x" " = ", x)
print("计算次数","=",cout)
if __name__ == '__main__':
a= np.loadtxt('D:/1.txt',delimiter=',')
b= np.loadtxt('D:/2.txt',delimiter=',')
gaosi(a, b)