水平有限,代码随便写写的,没怎么优化,供参考:
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))
没什么技巧,就是很直球的思路,算呗。
使用方法:
输入一个线性方程组的增广矩阵,以字典形式返回解.(若有唯一解则返回,若没有则返回没有唯一解)