矩阵的Doolittle分解(LU分解)

基本三角分解法

设矩阵   A = ( a i j ) n × n \ A=(a_{ij})_{n \times n}  A=(aij)n×n的各阶顺序主子式不为零,A有分解式
  [ a 11 a 12 ⋯ a 1 n a 21 a 22 ⋯ a 2 n ⋮ ⋮ ⋮ a n 1 a n 2 ⋯ a n n ] = [ 1 l 21 1 ⋮ ⋮ ⋱ l n 1 l n 2 ⋯ 1 ] [ u 11 u 12 ⋯ u 1 n u 22 ⋯ u 2 n ⋱ ⋮ u n n ] ≡ L U \ \begin{bmatrix} a_{11} \quad a_{12} \quad \cdots \quad a_{1n} \\ a_{21} \quad a_{22} \quad \cdots \quad a_{2n} \\ \vdots \qquad \vdots \qquad \qquad \vdots \\ a_{n1} \quad a_{n2} \quad \cdots \quad a_{nn} \\ \end{bmatrix} = \begin{bmatrix} 1 \qquad \qquad \qquad \\ l_{21} \quad 1 \qquad \qquad \\ \vdots \quad \vdots \quad \ddots \quad \\ l_{n1} \quad l_{n2} \quad \cdots \quad 1 \\ \end{bmatrix} \begin{bmatrix} u_{11} \quad u_{12} \quad \cdots \quad u_{1n} \\ \qquad u_{22} \quad \cdots \quad u_{2n} \\ \qquad \qquad \ddots \qquad \vdots \\ \qquad \qquad \qquad u_{nn} \end{bmatrix} \equiv LU  a11a12a1na21a22a2nan1an2ann=1l211ln1ln21u11u12u1nu22u2nunnLU
可得出关系
  a r i = ∑ k = 1 r l r k u k i ( i = r , ⋯   , n ; r = 1 , 2 , ⋯   , n ) \ a_{ri}= \sum_{k=1}^r l_{rk}u_{ki} (i=r,\cdots,n;r=1,2,\cdots,n)  ari=k=1rlrkuki(i=r,,n;r=1,2,,n)
  a i r = ∑ k = 1 r l i k u k r ( i = r + 1 , ⋯   , n ; r = 1 , ⋯   , n − 1 ) \ a_{ir} = \sum_{k=1}^r l_{ik}u_{kr} (i=r+1,\cdots,n;r=1,\cdots,n-1)  air=k=1rlikukr(i=r+1,,n;r=1,,n1)
由这两个关系可以解出L和U:
当r=1时,
  u 1 i = a 1 i ( i = 1 , 2 , ⋯   , n ) \ u_{1i}=a_{1i} \quad (i=1,2,\cdots,n)  u1i=a1i(i=1,2,,n)
  l i 1 = a i 1 u 11 ( i = 2 , 3 , ⋯   , n ) \ l_{i1}=\frac{a_{i1}}{u_{11}} \quad (i=2,3,\cdots,n)  li1=u11ai1(i=2,3,,n)
假设求出了U的第1至r-1行,L的1至r-1列,由上面两式得出U,L的第r行,列的计算公式
  u r i = a r i − ∑ k = 1 r − 1 l i k u k r ( i = r , ⋯   , n ; r = 1 , 2 , ⋯   , n ) \ u_{ri}=a_{ri}-\sum_{k=1}^{r-1}l_{ik}u_{kr} \quad (i=r,\cdots,n;r=1,2,\cdots,n)  uri=arik=1r1likukr(i=r,,n;r=1,2,,n)
  l i r = a i r − ∑ k = 1 r − 1 l i k u k r u r r ( i = r + 1 , ⋯   , n ; r = 1 , 2 , ⋯   , n − 1 ) \ l_{ir}=\frac{a_{ir}-\sum_{k=1}^{r-1}l_{ik}u_{kr}}{u_{rr}} \quad (i=r+1,\cdots,n;r=1,2,\cdots,n-1)  lir=urrairk=1r1likukr(i=r+1,,n;r=1,2,,n1)
  规 定 ∑ k = 1 0 l i k u k r = 0 \ 规定\sum_{k=1}^0 l_{ik}u_{kr}=0  k=10likukr=0
称上面所表示的矩阵分解为Doolittle分解,也称LU分解

部分选主元的Doolittle分解

在Doolittle的第r步分解,首先在数组A的第r列主对角元以下(含主对角元)选主元,具体步骤为:
(1)   在 r = 1 , 2 , ⋯   , n − 1 \ 在r=1,2,\cdots,n-1  r=1,2,,n1
  A ( i , r ) = A ( i , r ) − ∑ k = 1 r − 1 A ( i , k ) ⋅ A ( k , r ) ( i = r , ⋯   , n ) \ A(i,r)=A(i,r)-\sum_{k=1}^{r-1}A(i,k) \cdot A(k,r) \quad (i=r,\cdots,n)  A(i,r)=A(i,r)k=1r1A(i,k)A(k,r)(i=r,,n)
(2)挑选绝对值最大的主元,得出对应的行号idx,将第r行的元素与第idx行的元素进行交换
(3)分解计算
  A ( i , r ) = A ( i , r ) A ( r , r ) ( i = r + 1 , ⋯   , n ; r = 1 , 2 , ⋯   , n − 1 ) \ A(i,r)=\frac{A(i,r)}{A(r,r)} \quad (i=r+1,\cdots,n;r=1,2,\cdots,n-1)  A(i,r)=A(r,r)A(i,r)(i=r+1,,n;r=1,2,,n1)
  r ≠ n \ r \neq n  r=n
  A ( r , i ) = A ( r , i ) − ∑ k = 1 r − 1 A ( r , k ) ⋅ A ( k , i ) ( i = r + 1 , ⋯   , n ; r = 1 , 2 , ⋯   , n ) \ A(r,i)=A(r,i)-\sum_{k=1}^{r-1}A(r,k) \cdot A(k,i) \quad (i=r+1,\cdots,n;r=1,2,\cdots,n)  A(r,i)=A(r,i)k=1r1A(r,k)A(k,i)(i=r+1,,n;r=1,2,,n)
  ( ∑ k = 1 0 A ( r , k ) ⋅ A ( k , i ) = 0 ) \ (\sum_{k=1}^0 A(r,k)\cdot A(k,i)=0)  (k=10A(r,k)A(k,i)=0)
  r = n \ r=n  r=n
  A ( r , r ) = A ( r , r ) − ∑ k = 1 r − 1 A ( r , k ) ⋅ A ( k , r ) \ A(r,r)=A(r,r)-\sum_{k=1}^{r-1}A(r,k)\cdot A(k,r)  A(r,r)=A(r,r)k=1r1A(r,k)A(k,r)
按上述方法完成n步分解,便实现了系数矩阵分解   P A = L U \ PA=LU  PA=LU,其中,   P \ P  P是排列矩阵
  P = I i n − 1 n − 1 I i n − 2 n − 2 ⋯ I i 1 1 \ P=I_{i_{n-1}n-1}I_{i_{n-2}n-2} \cdots I_{i_11}  P=Iin1n1Iin2n2Ii11
其中,   I i k k \ I_{i_kk}  Iikk是单位矩阵在第k步分解中交换了第k行和第   i k \ i_k  ik行(主元中最大绝对值的行数)后的矩阵

Matlab 实现一个矩阵的Doolittle分解

function [L, U, P] = Doolittle(A, pri)
%DOOLITTLE 对矩阵A进行doolittle分解
%   inputs:要分解的矩阵A, pri:是否选主元
%   outputs:单位下三角矩阵L和上三角矩阵U,若选主元,同时输出置换矩阵P

P = eye(size(A));

[row, col] = size(A);

if pri
    for r = 1:row
        % 计算中间量Si,存入A(i,r)
        if r ~= row
            A(r:end, r) = A(r:end, r) - A(r:end, 1:r-1) * A(1:r-1, r);
        end
        % 确定绝对值最大的行号
        [m, idx] = max(abs(A(r:end, r)));
        idx = idx + r - 1;
        % 换行,同时更新排列矩阵P
        I = eye(row, col);
        temp = I(r, :);
        I(r, :) = I(idx, :);
        I(idx, :) = temp;
        A = I * A;
        P = I * P;
        % 分解计算
        if r ~= row
            A(r+1:end, r) = A(r+1:end, r) / A(r, r);
        end
        if r ~= 1
            if r ~= row
                A(r, r+1:end) = A(r, r+1:end) - A(r, 1:r-1) * A(1:r-1, r+1:end);
            else
                A(r, r:end) = A(r, r:end) - A(r, 1:r-1) * A(1:r-1, r:end);
            end
        end
    end
    L = tril(A, -1) + eye(size(A));
    U = triu(A, 0);
else
    U = zeros(size(A));
    L = eye(size(A));
    for r = 1:row
        if r == 1
            U(1, :) = A(1, :);
            L(2:end, 1) = A(2:end, 1) ./ U(1, 1);
        else
            U(r, r:end) = A(r, r:end) - L(r, 1:r-1) * U(1:r-1, r:end);
            L(r+1:end, r) = (A(r+1:end, r) - L(r+1:end, 1:r-1) * U(1:r-1, r)) / U(r, r);
        end
    end
end

end
  • 0
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值