用LU分解法来解矩阵方程

运用的是克劳特(Crout)分解,也就是U是单位上三角形矩阵

import numpy as np
#np.set_printoptions(threshold=np.inf)

def LU(A, n):
    L = [[0 for x in range(n)] for y in range(n)]
    U = [[0 for x in range(n)] for y in range(n)]  
    for i in range(n, 0, -1):
	    for tmp1 in range(n - i, n):
		    sum = 0
		    for tmp2 in range(n - i):
			    sum += L[tmp1][tmp2] * U[tmp2][n - i]
		    L[tmp1][n - i] = A[tmp1][n - i] - sum
	    for tmp1 in range(n - i + 1, n):
	    	sum = 0
	    	for tmp2 in range(n - i):
	    		sum += L[n - i][tmp2] * U[tmp2][tmp1]
	    	U[n - i][tmp1] = (A[n - i][tmp1] - sum) / float(L[n - i][n - i])
    for i in range(n):
    	U[i][i] = 1
    #print("L:")
    #printMat(L, 3)	
    #print("U")
    #printMat(U, 3)
    return L, U
    
def LUSolve(A, b, n):
	L = [[0 for x in range(n)] for y in range(n)]
	U = [[0 for x in range(n)] for y in range(n)]
	L, U = LU(A, n)
	Y = [0 for x in range(n)]
	X = [0 for x in range(n)]
	Y[0] = b[0][0] / L[0][0]
	for i in range(1, n):
		sum = 0
		for tmp in range(0, i):
			sum += L[i][tmp] * Y[tmp]
		Y[i] = (b[0][i] - sum) / float(L[i][i])
	X[n - 1] = Y[n - 1]
	for i in range(n - 2, -1, -1):
		sum = 0
		for tmp in range(i + 1, n):
			sum += U[i][tmp] * X[tmp]
		X[i] = Y[i] - sum
	return X

if __name__ == "__main__":
    M = np.random.random(size = (100, 100))
    #print("M:")
    #print(M)
    A = M
    for i in range(0, 100):
        A[i][i] += 1  # A = M + I
    #print("A:")
    #print(A)
    X = np.random.random(size = (100, 1))
    for i in range(0, 100):
        X[i][0] = i + 1
    #print("X:")
    #print(X)
    B = np.dot(A, X)
    b = np.transpose(B)
    #(b)
    result = LUSolve(A, b, 100)
    print(result)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值