线性方程组矩阵分解Doolittle

 

矩阵分解

import numpy as np
def LU_decomposition(A):
    n=len(A[0])
    L = np.zeros([n,n])
    U = np.zeros([n, n])
    for i in range(n):
        L[i][i]=1
        if i==0:
            for j in range(0,n):
                U[0][j]=A[0][j]
                L[j][0]=A[j][0]/U[0][0]
        else:
                for j in range(i, n):#U
                    temp=0
                    for k in range(0, i):
                        temp = temp+L[i][k] * U[k][j]
                    U[i][j]=A[i][j]-temp
                for j in range(i+1, n):#L
                    temp = 0
                    for k in range(0, i ):
                        temp = temp + L[j][k] * U[k][i]
                    L[j][i] = (A[j][i] - temp)/U[i][i]
    return L,U
 
if __name__ == '__main__': 
    #A=np.random.randint(1,10,size=[3,3])  #注意A的顺序主子式大于零
    n = int(input('输入矩阵长度:'))
    list = [[]for i in range(n)]
    for i in range(n):
        line = input().split(' ')
        for j in range(len(line)):
            list[i].append(int(line[j]))
    A=np.array(list)
    L,U=LU_decomposition(A)
    print(L,'\n',U)

 解题

import numpy as np
def LU_decomposition(A):
    n=len(A[0])
    L = np.zeros([n,n])
    U = np.zeros([n, n])
    for i in range(n):
        L[i][i]=1
        if i==0:
            for j in range(0,n):
                U[0][j]=A[0][j]
                L[j][0]=A[j][0]/U[0][0]
        else:
                for j in range(i, n):#U
                    temp=0
                    for k in range(0, i):
                        temp = temp+L[i][k] * U[k][j]
                    U[i][j]=A[i][j]-temp
                for j in range(i+1, n):#L
                    temp = 0
                    for k in range(0, i ):
                        temp = temp + L[j][k] * U[k][i]
                    L[j][i] = (A[j][i] - temp)/U[i][i]
    return L,U
def cauculate(L,U,b):
    Y=np.matmul(np.linalg.inv(L),b)
    X=np.matmul(np.linalg.inv(U),Y)
    return X

if __name__ == '__main__': 
    #A=np.random.randint(1,10,size=[3,3])  #注意A的顺序主子式大于零
    n = int(input('输入矩阵长度:'))
    list = [[]for i in range(n)]
    for i in range(n):
        line = input().split(' ')
        for j in range(len(line)):
            list[i].append(int(line[j]))
    A=np.array(list)
    print("输入矩阵b")
    blist = input().split(' ')
    b=np.array(blist,dtype=np.double)
    L,U=LU_decomposition(A)
    X=cauculate(L,U,b)
    print(L,'\n',U)
    print(X)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值