用Python做数据分析之后得到启发,对高斯消元法进行改进。大致思路仍然是将矩阵化为上三角矩阵,只是算法不同。大致思路仍然是将矩阵化为上三角矩阵,只是算法不同。
假设线性方程组 的增广矩阵为
其中,系数矩阵
import numpy as np
# Ab 表示增广矩阵
Ab = np.array([ [11, 12, 13, 14],
[21, 22, 23, 24],
[31, 32, 33, 34] ], dtype = np.float32 )
# 操作1,第一行主对角元素置为1
Ab[0:1, 0:4] = 1/Ab[0, 0] * Ab[0:1, 0:4]
print(Ab)
经过操作1,
下面引入一种特殊的矩阵,它是由相同维数的列向量和行向量通过矩阵乘法得到,其特殊之处就是矩阵的秩为1(各行成比例)。比如
要将
其中
这个时候想必你也知道右边的列向量和行向量是从哪来的了。
import numpy as np
# Ab 表示增广矩阵
Ab = np.array([ [11, 12, 13, 14],
[21, 22, 23, 24],
[31, 32, 33, 34] ], dtype = np.float32 )
# 操作1, 第一行主对角元素置为1
Ab[0:1, 0:4] = 1/Ab[0, 0] * Ab[0:1, 0:4]
# 操作2
# 第一步 构造一个秩为1的矩阵
temp1 = Ab[0:1, 0:4] # 提取第一行
temp2 = Ab[1:3, 0:1] # # 提取第一列的第二行和第三行
temp3 = np.zeros((1,1), dtype = np.float32 )
temp4 = np.vstack((temp3,temp2) ) # 扩展
r1 = np.dot(temp4, temp1) # r1是秩为1的矩阵
Ab = Ab - r1
print(Ab)
输出结果为:
[[ 1. 1.0909091 1.1818182 1.2727273 ]
[ 0. -0.90909195-1.8181839-2.727272 ]
[ 0. -1.8181839-3.636364 -5.454544 ]]
重复上述操作,将第二行主对角元素置为1,第二列主对角以下的元素化为0。第三行主对角元素置为1时结束,系数矩阵就成了上三角矩阵,用回代法就得到了方程组的解。
以下是完整的代码
import numpy as np
def triang_solver(Ab, n):
for i in range(n):
Ab[i:i+1, i:n+1] = 1/Ab[i, i] * Ab[i:i+1, i:n+1]
Ab[i+1:n, i:n+1] = Ab[i+1:n, i:n+1] - np.matmul(Ab[i+1:n, i:i+1],Ab[i:i+1, i:n+1] )
x = np.zeros(n)
# 回代
for i in range(n, 0, -1):
x[i-1] = Ab[i-1, n] - np.dot(Ab[i-1, i:n], x[i:n])
return x
if __name__ == "__main__":
# Ab 表示增广矩阵
Ab = np.array([[4, 2, -1, 5],
[1, 4, 1, 12],
[2, -1, 4, 12] ], dtype = np.float32 )
x = triang_solver(Ab, 3)
print(x)