[英]How to implement LU decomposition with partial pivoting in Python?
我想实现自己的LU分解P,L,U = my_lu(A),以便在给定矩阵A的情况下,通过部分旋转计算LU分解。 但是我只知道如何做而不必进行任何操作。 有人可以帮忙做部分透视吗?
def lu(A):
import numpy as np
# Return an error if matrix is not square
if not A.shape[0]==A.shape[1]:
raise ValueError("Input matrix must be square")
n = A.shape[0]
L = np.zeros((n,n),dtype='float64')
U = np.zeros((n,n),dtype='float64')
U[:] = A
np.fill_diagonal(L,1) # fill the diagonal of L with 1
for i in range(n-1):
for j in range(i+1,n):
L[j,i] = U[j,i]/U[i,i]
U[j,i:] = U[j,i:]-L[j,i]*U[i,i:]
U[j,i] = 0
return (L,U)
def naive_lu_factor(A):
"""
No pivoting.
Overwrite A with:
U (upper triangular) and (unit Lower triangular) L
Returns LU (Even though A is also overwritten)
"""
n = A.shape[0]
for k in range(n-1):
for i in range(k+1,n):
A[i,k] = A[i,k]/A[k,k] # " L[i,k] = A[i,k]/A[k,k] "
for j in range(k+1,n):
A[i,j] -= A[i,k]*A[k,j] # " U[i,j] -= L[i,k]*A[k,j] "
return A # (if you want)
def lu_factor(A):
"""
LU factorization with partial pivorting
Overwrite A with:
U (upper triangular) and (unit Lower triangular) L
Return [LU,piv]
Where piv is 1d numpy array with row swap indices
"""
n = A.shape[0]
piv = np.arange(0,n)
for k in range(n-1):
# piv
max_row_index = np.argmax(abs(A[k:n,k])) + k
piv[[k,max_row_index]] = piv[[max_row_index,k]]
A[[k,max_row_index]] = A[[max_row_index,k]]
# LU
for i in range(k+1,n):
A[i,k] = A[i,k]/A[k,k]
for j in range(k+1,n):
A[i,j] -= A[i,k]*A[k,j]
return [A,piv]
def ufsub(L,b):
""" Unit row oriented forward substitution """
for i in range(L.shape[0]):
for j in range(i):
b[i] -= L[i,j]*b[j]
return b
def bsub(U,y):
""" Row oriented backward substitution """
for i in range(U.shape[0]-1,-1,-1):
for j in range(i+1, U.shape[1]):
y[i] -= U[i,j]*y[j]
y[i] = y[i]/U[i,i]
return y
使用单位前向和后向替换求解x(带有和不带有部分旋转):
# No partial pivoting
LU = naive_lu_factor(A)
y = ufsub( LU, b )
x = bsub( LU, y )
# Partial pivoting
LU, piv = lu_factor(A)
b = b[piv]
y = ufsub( LU, b )
x = bsub( LU, y )
您可以为此使用Scipy的scipy.linalg.lu。
http://docs.scipy.org/doc/scipy-0.13.0/reference/generated/scipy.linalg.lu.html
请同时检查此链接:
http://www.quantstart.com/articles/LU-Decomposition-in-Python-and-NumPy
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.