from .Matrix import Matrix from .Vector import Vector from ._globalimport is_zero
classLinearSystem: def__init__(self, A, b): assert A.row_num() == len(b),\ "row number of A must be equal to the length of b" self._m = A.row_num() self._n = A.col_num()
ifisinstance(b, Vector): self.Ab = [Vector(A.row_vector(i).underlying_list() + [b[i]]) for i inrange(self._m)] ifisinstance(b, Matrix): self.Ab = [Vector(A.row_vector(i).underlying_list() + b.row_vector(i).underlying_list()) for i inrange(self._m)] self.pivots = [] def_max_row(self, index_i, index_j, n): best, ret= self.Ab[index_i][index_j], index_i for i inrange(index_i+1, n): ifself.Ab[i][index_j] > best: best, ret = self.Ab[i][index_j], i return ret
def_forward(self): i, k = 0, 0 while i < self._m and k < self._n: # 看Ab[i][k]是否为主元 max_row = self._max_row(i, k, self._m) self.Ab[i], self.Ab[max_row] = self.Ab[max_row], self.Ab[i]
if is_zero(self.Ab[i][k]) : k += 1 else: self.Ab[i] = self.Ab[i]/self.Ab[i][k] for j inrange(i+1, self._m): self.Ab[j] = self.Ab[j] - self.Ab[j][k]*self.Ab[i] self.pivots.append(k) i+=1 def_backward(self): n = len(self.pivots) for i inrange(n-1, -1, -1): k = self.pivots[i] for j inrange(i-1, -1, -1): self.Ab[j] = self.Ab[j] - self.Ab[j][k]*self.Ab[i]
defgauss_jordan_elimination(self):
self._forward() self._backward()
for i inrange(len(self.pivots), self._m): ifnot is_zero(self.Ab[i][-1]): returnFalse returnTrue
deffancy_print(self): for i inrange(self._m): print(" ".join(str(self.Ab[i][j])for j inrange(self._n)),end=" ") print("|", self.Ab[i][-1])
definv(A):
if A.row_num()!=A.col_num(): returnNone
n = A.row_num() ls = LinearSystem(A, Matrix.identity(n)) ls.gauss_jordan_elimination()
ifnot ls.gauss_jordan_elimination: returnNone invA = [[row[i] for i inrange(n, 2*n)] for row in ls.Ab]
return Matrix(invA)
测试代码:
1 2 3 4 5 6 7 8 9
from LA.LinearSystem import LinearSystem, inv from LA.Matrix import Matrix from LA.Vector import Vector
if __name__ == "__main__": A = Matrix([[1,2],[3,4]]) invA = inv(A) print(invA)
from .Matrix import Matrix from .Vector import Vector from ._globalimport is_zero
deflu(matrix):
assert matrix.row_num() == matrix.col_num(),\ "matrix must be a square matrix"
n = matrix.row_num() A = [matrix.row_vector(i) for i inrange(n)] L = [[1.0if i==j else0.0for i inrange(n)]for j inrange(n)]
for i inrange(n): if is_zero(A[i][i]): returnNone, None else: for j inrange(i+1, n): p = A[j][i]/A[i][i] A[j] = A[j] - p*A[i] L[j][i] = p return Matrix(L), Matrix([A[i].underlying_list() for i inrange(n)])
测试代码,测试案例就是上面的例子:
1 2 3 4 5 6 7 8
from LA.LU import lu from LA.Matrix import Matrix
if __name__=="__main__": m1 = Matrix([[1,2,3],[4,5,6],[3,-3,5]]) L, U = lu(m1) print(L) print(U)