python矩阵形式求解多元一次方程组

简介

通过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])

你可能感兴趣的:(python,矩阵)