[python]代码库
# -*- coding: utf-8 -*-
"""
Created on Wed May 25 10:49:19 2022
@author: 陶成
"""
import numpy as np
import time
def gaussElimination(A,dispFlag):
'''
利用高斯消元法即直接消元法求解线性方程组的解
:param A:增广矩阵,n行n列为系数矩阵,n+1列为常数项
:param dispFlag:值为1则显示中间结果,其他值不显示
:return flag,x,dist:方程组的解及计算时间
'''
t1=time.time() #开始时间
nRow,nCol=A.shape #获取数组的行数与列数
if (nRow+1!=nCol):
return 0,0,0
else:
#从0列~nCol-3列,nCol-2为最后一列,nCol-1为常数列
#第i列,用i行作为基准去消i+1~nRow行
#第j行中,依次修改列i~nCol-1列
i=0
while (i<nCol-2): #0列~nCol-3列
j=i+1 #用i行作为基准去消i+1~nRow行
while (j<nRow): #i+1行~nRow-1行
tmp=A[j][i]/A[i][i] #此值*i行+j行(j:i+1~nRow-1)
A[j][i]=0.0 #A[j][i]=0,即i列值为0
k=i+1
while (k<nCol): #j行k列(k:i+1列~nCol-1列)修改其值
A[j][k]=A[j][k]-tmp*A[i][k]
k=k+1 #j的下一格即k=k+1
j=j+1 #再消下一行j=j+1
i=i+1 #下一列 i=i+1
if (dispFlag==1):
printMatrix(A)
#到此得到上三角形,则逆向求方程的根
x=np.zeros(nRow) #生成nRow个0的一维数组
i=nRow-1 #xn-1,xn-2,....,x1,x0
while (i>=0): #列数nCol=nRow+1 列数比行数多1
j=i+1
x[i]=A[i][nCol-1] #右边的常量
while (j<nCol-1): #减去a[i][j]*x[j]
x[i]=x[i]-A[i][j]*x[j]
j=j+1 #右边的常数-减已算出来的x与系数积
x[i]=x[i]/A[i][i] #除以A[i][i]得到相应的根
if (dispFlag==1):
print("x[%d]=%0.9f"%(i,x[i]))
i=i-1 #向上求下一个根
t2=time.time()
t=t2-t1
return t,x
def printMatrix(A):
#显示一个数组的内容
'''
:param A:待显示的数组
:return -没有返回修值
'''
nRow,nCol=A.shape
for i in range(0,nRow):
for j in range(0,nCol):
print("%12.9f "%A[i][j],end='')
print("")
def getExamCof13():
'''
获取主元很小的矩阵
:return--
'''
A=np.array([[-2.0,1.072,5.643,3.00],
[-1.0,3.712,4.623,2.0],
[0.001,2.0,3.0,1.0]])
return A
A=np.array(getExamCof13(),dtype='float32')#转换为numpy数组
print("原始数据")
printMatrix(A) #显示数组
nRow,nCol=A.shape #行数列数
x=np.zeros(nRow) #得到一个数组
BB=np.zeros((nRow,nRow))
#必须一次调一个算法,否则A的值好象有变化
t=0
#t,x=gaussElimination(A,0) #普通的高斯加减消元法
t,x=gaussElimination(A,0)
print(x) #普通的高斯加减消元法