通过python求解m×n矩阵形式的多元一次方程组
python的Numpy模块已经提供了对多元一次方程组的求解函数,
本程序仅使用python的基础模块,只是用于检验python学习成果。
python3.9 PyCharm2022社区版
# coding=UTF-8
def MatSolve(list1: list):
"""
:param list1: 需要求解的二维矩阵
:return: 求出的二维矩阵
"""
list2 = []
for i in range(len(list1)):
# 处理矩阵list1,使第一列只有一个非0元素,然后取出第一行,形成一个新的矩阵,继续处理,直到只剩下一行
# 循环结束矩阵list1将转换为阶梯矩阵list2
if list1[0]:
while list1[0][0] == 0 and len(list1) > 1:
list1 = SwapList(list1)
list1 = iniFirstColumn(list1)
for j in range(i):
list1[0] = [0] + list1[0]
# 将矩阵第一行取出,然后删除第一行和第一列,继续循环
list_temp = list1[0][:]
list2.append(list_temp)
for j in range(len(list1)):
del list1[j][0]
del list1[0]
list3 = []
for i in range(len(list2)):
# 处理矩阵list2,使每一列只有一个非0元素,然后取出该列,形成一个新的矩阵,继续循环
# 循环结束矩阵list2转换为单位矩阵和常数项矩阵拼接而成的矩阵3
list2 = iniLastColumn(list2)
list_temp = list2[-1][:]
list3.append(list_temp)
del list2[-1]
return list3
def SwapList(list1: list):
"""
:param list1: 二维矩阵
:return: 交换完成后的二维矩阵
""""""
若矩阵首个元素为0,则将首个元素非0的行交换到第一行
若所有行的首个元素为0,则删除第一列
保证每次计算时首个元素非0
"""
if list1[0][0] == 0 and len(list1) > 1:
for i in range(len(list1)):
if list1[i][0] != 0:
list_temp = list1[0]
list1[0] = list1[i]
list1[i] = list_temp
return list1
elif i == len(list1) - 1 and list1[i][0] == 0:
for j in range(len(list1)):
del list1[j][0]
return list1
return list1
def iniFirstColumn(list1: list):
"""
:param list1: 二维矩阵
:return: 二维矩阵
""""""
通过计算,使首列只有一个非0元素
"""
if list1[0][0] != 0:
n = list1[0][0]
for j in range(len(list1[0])):
list1[0][j] = list1[0][j] / n
for i in range(len(list1)):
if i != 0:
n = list1[i][0]
for j in range(len(list1[0])):
list1[i][j] -= list1[0][j] * n
return list1
def iniLastColumn(list1: list):
"""
:param list1: 二维矩阵
:return: 二维矩阵
""""""
矩阵其余行依次减去最后一行,使最后一行首个非0元素的对应列只有一个非0元素
"""
m = len(list1) - 1
if list1[m][m] == 1 and len(list1) > 1:
for i in range(len(list1)):
if i != len(list1) - 1:
n = list1[i][m]
for j in range(len(list1[-1])):
list1[i][j] -= list1[-1][j] * n
return list1
if __name__ == "__main__":
# 需要计算的m*n矩阵list_start
list_start = [[0, 0, 1, 0, 23, 3], [1, 4, 0, 7, 0, 12], [0, 2, 11, 4, 0, 8], [0, 3, 0, 9, 5, 0]]
# 最终的结果矩阵list_end
list_end = []
list_start = MatSolve(list_start)
# 对结果矩阵进行排序,输出美化
for i in range(len(list_start)):
list_temp = list_start[-1][:]
list_end.append(list_temp)
del list_start[-1]
for i in range(len(list_end)):
for j in range(len(list_end[0])):
if type(list_end[i][j]) != float:
list_end[i][j] = float(list_end[i][j])
print(list_end[i])