首页 > 技术文章 > LU分解和求解线性方程组

qw12 2016-11-18 17:36 原文

 1 # coding:utf8
 2 import numpy as np
 3 
 4 def lu(mat):
 5     r,c=np.shape(mat)
 6     s=min(r,c)
 7     for k in range(s):
 8         x=1.0/mat[k][k]  # 将后续除法变成乘法
 9         for i in range(k+1,r):
10             mat[i][k]=mat[i][k]*x  # L[1:][0]*U[0][0]=A[1:][0];A[0][:]=mat[0][:]
11         for i in range(k+1,r):
12             for j in range(k+1,c):
13                 # U[1][2]*L[1][1]=A[1][2]-U[0][2]*L[1][0];L[1][1]=1
14                 # L[2][1]*U[1][1]=A[2][1]-U[0][1]*L[2][0];下一个k时mat[i][j]/mat[k][k](i>j)
15                 mat[i][j]=mat[i][j]-mat[k][j]*mat[i][k]
16     return mat,c
17 
18 def solve(A,b):
19     mat,n=lu(A)  # LU合并
20     print mat  # [[16, 4, 8], [0.25, 4.0, -6.0], [0.5, -1.5, 9.0]]
21     Z= np.zeros(n)  # L*Z=b U*X=Z
22     X= np.zeros(n)
23     Z[0]=b[0]
24     for i in range(1,n):
25         sumup=0
26         for tmp in range(0,i):
27             sumup+=mat[i][tmp]*Z[tmp]
28         Z[i]=(b[i]-sumup)
29     X[n-1]=Z[n-1]/mat[n-1][n-1]
30     for i in range(n-2,-1,-1):
31         sumup=0
32         for tmp in range(i+1,n):
33             sumup+=mat[i][tmp]*X[tmp]
34         X[i]=(Z[i]-sumup)/mat[i][i]
35     return X
36 
37 A=[[16,4,8],[4,5,-4],[8,-4,22]]
38 y=[-4,3,10]
39 print "The result of the fomula is:"+str(solve(A,y))  # [-2.25  4.    2.  ]

 

推荐阅读