人和计算机用都高效且简洁的LU分解

矩阵的LU三角分解

算法

  1. 初始化矩阵 L = [ 1 0 0 0 1 0 0 0 1 ] L=\left[\begin{array}{lll} 1&0&0 \\ 0&1&0 \\ 0&0&1 \end{array} \right] L=100010001, U = [ 0 0 0 0 0 0 0 0 0 ] U = \left[\begin{array}{lll} 0&0&0 \\ 0&0&0 \\ 0&0&0 \end{array} \right] U=000000000, R = [ 0 0 0 0 0 0 0 0 0 ] R = \left[\begin{array}{lll} 0&0&0 \\ 0&0&0 \\ 0&0&0 \end{array} \right] R=000000000
  2. 更新 U U U, 其中 U [ i ] = A [ i ] − L [ i ] ⋅ U U[i] = A[i]-L[i] \cdot U U[i]=A[i]L[i]U
  3. 更新 R R R, 其中 R [ i ] = U [ i ] , R [ i ] [ i ] = 0 R[i]=U[i], R[i][i]=0 R[i]=U[i],R[i][i]=0
  4. 更新 L L L, 其中 L [ : , i ] = A [ : , i ] − L ⋅ R [ : , i ] U [ i ] [ i ] L[:,i]=\frac{A[:,i]-L \cdot R[:,i]}{U[i][i]} L[:,i]=U[i][i]A[:,i]LR[:,i]
  5. 重复步骤2到步骤4
def LU(A):
    n = A.shape[0]
    L = np.diag(np.ones(n))
    U = np.zeros(A.shape)
    # 引入R来简化更新L的逻辑, A = LU = L(D+R)
    R = np.zeros(A.shape)
    for i in range(n):
        # 更新第i行U
        dU = np.dot(L[i], U)
        U[i] = A[i] - dU
        R[i] = U[i]
        R[i][i] = 0
        # 更新第i列L
        dL = np.dot(L, R[:, i]).reshape(-1, 1)
        L[:, [i]] = (A[:, [i]] - dL) / U[i][i]
    return L, U
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值