# -*- 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) #普通的高斯加减消元法 |