|
楼主 |
发表于 2018-1-23 13:28:31
|
显示全部楼层
- from numpy import dot,array,eye,where,zeros
- def exc_row(B,Q,j):
- n = B.shape[0]
- A = B.copy()
- P = Q.copy()
- for i in range(j,n):
- if A[i,j] >= A[j,j]:
- maxIndex = i
- tempA = A[maxIndex,:].copy()
- A[maxIndex,:] = A[j,:]
- A[j,:] = tempA
- tempP = P[maxIndex,:].copy()
- P[maxIndex,:] = P[j,:]
- P[j,:] = tempP
- return A,P
-
- def palu(A):
- n = A.shape[0]
- U = A.copy()
- L = eye(n)
- P = eye(n)
- for j in range(n-1):
- [U,P] = exc_row(U,P,j)
- for i in range(j+1,n):
- mult = U[i,j]/U[j,j]
- U[i,j] = mult
- print(mult)
- print(U[i,j])
- for k in range(j+1,n):
- U[i,k] = U[i,k] - mult*U[j,k]
- return P,L,U #这里的L还没有写,还在测试刚刚提出的问题
-
- def backsolve(U,b):
- n = U.shape[0]
- x = zeros((n,1))
- for i in range(n-1,-1,-1):
- if i != n-1:
- for k in range(i+1,n-1):
- b[i] = b[i] - x[i]*U[i,k]
- x[i] = b[i]/U[i,i]
-
- def l2u(L):
- n = L.shape[0]
- Lu = eye(n)
- for j in range(n):
- for i in range(j,n):
- Lu[n-1-i,n-1-j] = L[i,j]
- return Lu
- def one_reverse(b):
- n = b.shape[0]
- b_rev = zeros((n,1))
- for i in range(n):
- b_rev[i,0] = b[n-1-i,0]
- return b_rev
- def palusolve(A,b):
- [P,L,U] = palu(A)
- Lu = l2u(L)
- c = backsolve(Lu,one_reverse(dot(P,b)))
- x = backsolve(U,one_reverse(c))
- return x
复制代码
测试的矩阵是:A = array([[2,1,5],[4,4,-4],[1,3,1]]),测试的函数是[P,L,U] = palu(A)
输出的U是:array([[ 4, 4, -4],[ 0, 2, 2],[ 0, 0, 8]]);
就是那几个0的地方,我是进行了U[i,j] = mult操作的,而mult是不等零的。不知道是哪里的问题,所以向各位请教了 |
|