線性方程組求解(高斯消元法 LU三角分解法)

2021-08-13 18:27:42 字數 2885 閱讀 6963

''' 列主元高斯消元法

a:係數增廣矩陣

n:未知數個數

'''def

main_element_gauss

(a,n):

for i in range(0,n-1):

if(np.max(a[i:,i])!=a[i,i]): #如果當前係數不是最大值,則列主元

temp_i=int(np.where(a==np.max(a[i:,i]))[0]) #temp_i為最大值所在的行索引

a[[i,temp_i],:]=a[[temp_i,i],:] #交換

for j in range(1,(n-i)):

a[i+j,:]=a[i+j,:]-a[i,:]*(a[i+j,i]/a[i,i]) #消元

print("第%d次消元係數矩陣為:\n"%(i+1),a)

#回代得解

x=np.zeros((n,1))

for i in range(n-1,-1,-1):

temp=0

for j in range(0,n):

temp+=a[i,j]*x[j,0]

x[i,0]=(a[i,n]-temp)/a[i,i]

print("方程組的解為:\n",x)

''' lu三角分解法

a:係數增廣矩陣

'''def

lu_break_down

(a):

#生成維度為(3,3)的矩陣,初值為0

l=np.zeros((3,3))

u=np.zeros((3,3))

#根據公式得到l和u的具體值

u[0,:]=a[0,:3]

for i in range(3):

l[i,i]=1.0

l[1,0]=a[1,0]/u[0,0]

l[2,0]=a[2,0]/u[0,0]

u[1,1]=a[1,1]-l[1,0]*u[0,1]

u[1,2]=a[1,2]-l[1,0]*u[0,2]

l[2,1]=(a[2,1]-l[2,0]*u[0,1])/u[1,1]

u[2,2]=a[2,2]-(l[2,0]*u[0,2]+l[2,1]*u[1,2])

print("l為:\n",l)

print("u為:\n",u)

#將b新增到l,使之變為增廣矩陣

l=np.hstack((l,a[:,3].reshape(3,1)))

#回代得解

y=np.zeros((3,1))

for i in range(0,3):

temp=0

for j in range(0,3):

temp+=l[i,j]*y[j,0]

y[i,0]=(l[i,3]-temp)/l[i,i]

#將y新增到u,使之變為增廣矩陣

u=np.hstack((u,y))

#回代得解

x=np.zeros((3,1))

for i in range(2,-1,-1):

temp=0

for j in range(0,3):

temp+=u[i,j]*x[j,0]

x[i,0]=(u[i,3]-temp)/u[i,i]

print("方程組的解為:\n",x)

defmain

():#輸入

n=int(input("請輸入未知數個數:"))

temp=

print("請輸入係數的增廣矩陣:\n")

for i in range(n):

a=np.array(temp).reshape(n,n+1)

#只有n=3時,有兩種方法。因為lu沒有支援除3元以外的解法

if(n==3):

#選單選擇

print("解方程組方法:\n\t1.列主元高斯消元法\n\t2.lu三角分解法")

choice=int(input("請選擇一種:"))

if(choice==1):

main_element_gauss(a,n)

else:

lu_break_down(a)

else:

main_element_gauss(a,n)

if __name__=='__main__':

main()

(方程組一)列主元高斯消元法:

(方程組一)lu三角分解法:

(方程組二)列主元高斯消元法:

(方程組二)lu三角分解法:

(拓展)未知數為4時:

對於python的更深層次的理解,尤其是在切片的運用以及切片的淺拷貝還有深拷貝,最後意外學會了如何合併矩陣,運用np.hstack()和np.vstack()可實現水平和豎直方向的合併,很滿足。

將課堂是將的理論內容用**實現,實在有一種數不出的欣喜。

高斯消元求解線性方程組

蒟蒻 nanjo qi 前天考了一次試 第一題就華麗麗地爆零了。解一次方程組我會啊,但是解一千個有百來八十個未知數的 棄了棄了orz。考完了才知道有高斯消元這個神奇的東西,於是就去簡單了解了一下。高斯消元法是線性代數規劃中的乙個演算法,可用來為線性方程組求解,還可以求出矩陣的秩,以及求出可逆方陣的逆...

消元法求解線性方程組

這裡的消元法,主要是針對矩陣 a 可逆的情況下 如果 a 不可逆消元後不好回代 即線性方程組只有唯一解的情況下,有多解的情況的解法在後面介紹。目前我們用於解線性方程組的方法依然是gauss消元法。在gauss消元法中,我們將右側向量b與a寫在一起作為乙個增廣矩陣進行同步的操作,這就預設了對a與b的運...

線性方程組(高斯消元)

acm模版 列主元gauss消去求解a x b 返回是否有唯一解,若有解在b中 define fabs x x 0 x x define eps 1e 10 const int maxn 100 int gausscpivot int n,double a maxn double b if fabs...