1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
| from numpy import *
def LU_column_pivoting(A,b):
row = A.shape[0] column = A.shape[1] if row != column: print('A不是方阵!') return
n = row Ip = list(range(n))
for k in range(0,n):
h = argmax(abs(A[:,k]))
if Ip[h] == h: temp = copy(A[k, :]) A[k, :] = A[h, :] A[h, :] = temp Ip[k] = h
A[k,k] = A[k,k] - dot(A[k,0:k], A[0:k,k]) if A[k,k] == 0: print('第{}个主元为0!'.format(k+1)) return
for j in range(k+1,n): A[k,j] = A[k,j] - dot(A[k,0:k], A[0:k,j]) A[j,k] = (A[j,k] - dot(A[j,0:k], A[0:k,k])) / A[k,k]
L = tril(A,-1) + identity((n)) U = triu(A,0) L.dtype = double U.dtype = double
for i in range(0,n): t = Ip[i] if t != i: temp = copy(b[i]) b[i] = b[t] b[t] = temp
y = transpose(array([arange(n)], dtype = double)) y[0] = b[0] for i in range(1,n): sum = 0 for t in range(0,i): sum += L[i,t]*y[t] y[i] = b[i] - sum
x = transpose(array([arange(n)],dtype = double)) x[n-1] = y[n-1]/U[n-1,n-1] for i in range(0,n-1)[::-1]: sum = 0 for t in range(i+1,n): sum += U[i,t]*x[t] x[i] = (y[i]-sum)/U[i,i]
return x
if __name__ == '__main__': A = array([[1,2,3],[2,5,2],[3,1,5]], dtype = double) b = transpose(array([[14,18,20]], dtype = double)) x = LU_column_pivoting(A,b) print(x)
|