python实现列主元消去法解线性方程组

水平有限,代码随便写写的,没怎么优化,供参考:

def findsolution(mat):
    ans=[]
    dic={}
    error=0 #ans用于保存运算结果,dic将解以字典的形式表示,error用于判断该方程组是否有唯一解,error=0则有唯一解
    for i in range(len(mat)-1):
        max=0
        change=[]
        for j in range(i,len(mat)):
            if mat[j][i]>=max:
                max=mat[j][i]
                sign=j
            else:
                pass
        change=mat[i]
        mat[i]=mat[sign]
        mat[sign]=change #将i列最大主元所在行与i行交换
        for k in range(i+1,len(mat)):
            yin=mat[k][i]/mat[i][i]
            for v in range(i,len(mat[0])):
                mat[k][v]=float(format((mat[k][v]-mat[i][v]*yin),'.10f')) #从上往下将每个系数依次减去乘积因子与i行中每列的元素乘积
    d=len(mat)
    while d:
        try:
            x=mat[d-1][len(mat[0])-1]
            for l in range(len(ans)):
                x-=ans[l]*mat[d-1][len(mat[0])-2-l]
            x=x/mat[d-1][d-1] #回代求解,每解出一个就保存在ans中,供下次回代使用
        except ZeroDivisionError:
            error=1
            break #如果消元过程中列主元素为0,则触发ZeroDiv错误,从而得知该线性方程组没有唯一解
        ans.append(x)
        d-=1
    lenth = len(ans)
    i = 1
    while lenth:
        dic['x' + str(i)] = ans[lenth - 1]
        i += 1
        lenth-=1
    if error==1 or not len(mat)+1==len(mat[0]):
        return '方程没有唯一解'
    else:
        return dic
mat=eval(input('请输入一个线性方程组的增广矩阵\n'))
print(findsolution(mat))

没什么技巧,就是很直球的思路,算呗。

使用方法:

输入一个线性方程组的增广矩阵,以字典形式返回解.(若有唯一解则返回,若没有则返回没有唯一解)

python实现列主元消去法解线性方程组_第1张图片

python实现列主元消去法解线性方程组_第2张图片

你可能感兴趣的:(线性代数,python)