''' 列主元高斯消元法
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...