防止对角线元素为0的情况
import numpy as np
def gauss(a):
n, m = a.shape
x = np.zeros(n)
# 阶梯化矩阵
for k in range(n):
# 第k个子矩阵
f = -1 # 最长的那一行
for l in range(k, n):
# 找最长
if a[l][k] != 0 and f < 0:
z = a[l][k]
f = l
# 归一化
for i in range(m):
a[l][i] /= z
# -0 变成 0
if a[l][i] == -0:
a[l][i] = 0
continue
# 处理其他行
if a[l][k] != 0 and f >= 0:
j = a[l][k]
# 第l行所有元素,从第k个元素开始
for h in range(k, m):
a[l][h] -= j * a[f][h]
# 最长的行放在最上层
if f > 0 and f != k:
a[[k, f], :] = a[[f, k], :]
print(a)
# 求解
for i in range(n - 1, -1, -1):
sum = 0
for j in range(i, m - 1):
sum += a[i][j] * x[j]
x[i] = (a[i][m - 1] - sum)
return x
if __name__ == "__main__":
# a是增广矩阵
a = np.array([[0, 0, 0.8642, -0.7521],
[0, 1, 0.1463, 0.6310],
[-0.8641, -0.4243, 0.071, 0.2501]])
print(gauss(a))
"""
a = np.array([[2, -2, 5, 13],
[2, 3, 4, 20],
[3, -1, 3, 10]], dtype=float)
"""