def lu(A): """ A -> P, L, U LU factorisation of a square matrix A. L is the lower, U the upper part. P is the permutation matrix indicating the row swaps. P*A = L*U If you need efficiency, use the low-level method LU_decomp instead, it's much more memory efficient. """ # get factorization A, p = LU_decomp(A.copy()) n = A.rows L = matrix(n) U = matrix(n) for i in xrange(n): for j in xrange(n): if i > j: L[i, j] = A[i, j] elif i == j: L[i, j] = 1 U[i, j] = A[i, j] else: U[i, j] = A[i, j] # calculate permutation matrix P = eye(n) for k in xrange(len(p)): swap_row(P, k, p[k]) return P, L, U
def lu(A): """ A -> P, L, U LU factorisation of a square matrix A. L is the lower, U the upper part. P is the permutation matrix indicating the row swaps. P*A = L*U If you need efficiency, use the low-level method LU_decomp instead, it's much more memory efficient. """ # get factorization A, p = LU_decomp(A) n = A.rows L = matrix(n) U = matrix(n) for i in xrange(n): for j in xrange(n): if i > j: L[i,j] = A[i,j] elif i == j: L[i,j] = 1 U[i,j] = A[i,j] else: U[i,j] = A[i,j] # calculate permutation matrix P = eye(n) for k in xrange(len(p)): swap_row(P, k, p[k]) return P, L, U
def exp_pade(a): """Exponential of a matrix using Pade approximants. See G. H. Golub, C. F. van Loan 'Matrix Computations', third Ed., page 572 TODO: - find a good estimate for q - reduce the number of matrix multiplications to improve performance """ def eps_pade(p): return mpf(2)**(3-2*p) * factorial(p)**2/(factorial(2*p)**2 * (2*p + 1)) q = 4 extraq = 8 while 1: if eps_pade(q) < eps: break q += 1 q += extraq j = max(1, int(log(mnorm(a,'inf'),2))) extra = q mp.dps += extra try: a = a/2**j na = a.rows den = eye(na) num = eye(na) x = eye(na) c = mpf(1) for k in range(1, q+1): c *= mpf(q - k + 1)/((2*q - k + 1) * k) x = a*x cx = c*x num += cx den += (-1)**k * cx f = lu_solve_mat(den, num) for k in range(j): f = f*f finally: mp.dps -= extra return f