Matlab广义追赶法(Thomas法)

矩阵分解方法(广义追赶法)

对于一般形式的线性方程组

A x = b A x=b Ax=b

将系数矩阵A分解成下三角阵L和上三角阵U

A = L U 1 A=LU_1 A=LU1

化归为两个三角方程组

L y = b Ly=b Ly=b U x = y Ux=y Ux=y

对于3阶矩阵:

A = [ a 11 a 12 a 13 a 11 a 12 a 13 a 11 a 12 a 13 ] = [ l 11 0 0 l 21 l 22 0 l 31 l 32 l 33 ] [ 1 u 12 u 13 0 1 u 23 0 0 1 ] = L U 1 A= \begin{bmatrix} a_{11}& a_{12} & a_{13} \\ a_{11} & a_{12} & a_{13} \\ a_{11} & a_{12} & a_{13} \end{bmatrix}\\= \begin{bmatrix} l_{11} &0 & 0 \\ l_{21} & l_{22} & 0 \\ l_{31} & l_{32} & l_{33} \end{bmatrix}\begin{bmatrix} 1 &u_{12} & u_{13} \\ 0 & 1 & u_{23} \\ 0 & 0 & 1 \end{bmatrix}=LU_1 A=a11a11a11a12a12a12a13a13a13=l11l21l310l22l3200l33100u1210u13u231=LU1

展开

l 11 = a 11 , u 12 = a 12 / l 11 , u 13 = a 13 / l 11 l 21 = a 21 , l 22 = a 22 − l 21 u 12 , u 23 = ( a 23 − l 21 u 13 ) / l 22 l 31 = a 31 , l 32 = a 32 − ( l 31 u 12 ) , l 33 = a 33 − l 31 u 13 − l 32 u 23 \begin{aligned} l_{11}=a_{11}, &\quad u_{12}=a_{12}/l_{11},\qquad\qquad u_{13}=a_{13}/l_{11}\\ l_{21}=a_{21}, &\quad l_{22}=a_{22}-l_{21}u_{12},\qquad u_{23}=(a_{23}-l_{21}u_{13})/l_{22}\\ l_{31}=a_{31},& \quad l_{32}=a_{32}-(l_{31}u_{12}),\quad l_{33}=a_{33}-l_{31}u_{13}-l_{32}u_{23} \end{aligned} l11=a11,l21=a21,l31=a31,u12=a12/l11,u13=a13/l11l22=a22l21u12,u23=(a23l21u13)/l22l32=a32(l31u12),l33=a33l31u13l32u23

求解环节

1.预处理

实现矩阵分解 A = L U 1 A=LU_1 A=LU1:对 i = 1 , 2 , . . . , n i=1,2,...,n i=1,2,...,n计算

l i , j = a i , j − ∑ k = 1 j − 1 l i , k u k , j , j = 1 , 2 , . . . , i l_{i,j}=a_{i,j}-\sum_{k=1}^{j-1}l_{i,k}u_{k,j},\qquad j=1,2,...,i li,j=ai,jk=1j1li,kuk,j,j=1,2,...,i

u i , j = ( a i , j − ∑ k = 1 j − 2 l i , k u k , j ) / l i , i , j = i + 1 , i + 2 , . . . , n u_{i,j}=(a_{i,j}-\sum_{k=1}^{j-2}l_{i,k}u^{k,j})/l_{i,i},\qquad j=i+1,i+2,...,n ui,j=(ai,jk=1j2li,kuk,j)/li,i,j=i+1,i+2,...,n

2.追的过程

解下三角方程组 L y = b Ly=b Ly=b

∑ j = 1 i l i , j y j = b i , i = 1 , 2 , . . . , n \sum_{j=1}^il_{i,j}y_{j}=b_{i},\qquad i=1,2,...,n j=1ili,jyj=bi,i=1,2,...,n

回代公式

y i = ( b i − ∑ j = 1 i − 1 l i , j y j ) / l i , i , i = 1 , 2 , . . . , n y_i=(b_{i}-\sum_{j=1}^{i-1}l_{i,j}y_{j})/l_{i,i},\qquad i=1,2,...,n yi=bij=1i1li,jyj/li,i,i=1,2,...,n

3.赶的过程

解单位上三角方程 U 1 x = y U_{1}x=y U1x=y

x i + ∑ j = i + 1 n u i , j x j = y j , i = 1 , 2 , . . . , n x_{i}+\sum_{j=i+1}^{n}u_{i,j}x_{j}=y_{j},\qquad i=1,2,...,n xi+j=i+1nui,jxj=yj,i=1,2,...,n

回代公式为

x i = y i − ∑ j = i + 1 n u i , j x j , i = n , n − 1 , . . . , 1 x_{i}=y_{i}-\sum_{j=i+1}^{n}u_{i,j}x_{j},\qquad i=n,n-1,...,1 xi=yij=i+1nui,jxj,i=n,n1,...,1

Matlab实现:

%% 追赶法(Thomas法)
A=[1  1  1;
   2 -1 -2;
   3  1 -4];
b=[17;1;3];
m=length(A);%矩阵大小
L=zeros(m);%下三角方程
U=zeros(m)+eye(m);%上三角方程
y=zeros(m,1);%下三角方程解初始化
x=zeros(m,1);%解向量初始化
%% 1.预处理
for i=1:m
    for j=1:i
        %计算矩阵L的各个元素,其中列坐标j=1,2,..,i
        K=0;
        if j<=1
            L(i,j)=A(i,j)-K;
        else
            for k=1:j-1
                K=L(i,k)*U(k,j)+K;
            end
            L(i,j)=A(i,j)-K;
        end
        %计算矩阵U的各元素,其中列坐标jj=i+1,i+2,...,n
        KK=0;
        if i<m;
            for jj=i+1:m
                if i==1;
                    U(i,jj)=(A(i,jj)-KK)./L(i,i);
                else
                    for k=1:i-2
                        KK=L(i,k)*U(k,i+1)+KK;
                    end
                    U(i,jj)=(A(i,i+1)-KK)./L(i,i);
                end
            end
        else
            
        end
        
    end
end
%% 追的过程 解Ly=b
for i=1:m
    u=0;
    j=1;
    if j>i-1
        y(i,1)=(b(i,1)-u)./L(i,i);
    else
        for j=1:i
            u=L(i,j)*y(j,1)+u;
        end
        y(i,1)=(b(i,1)-u)./L(i,i);
    end
end
%% 赶的过程 解Ux=y
for k=1:m
    i=m-k+1;
    jj=i+1;
    u=0;
    if jj>m
        x(i,1)=y(i,1)-u;
    else
        for j=1:m
            u=U(i,j)*x(j,1)+u;
        end
        x(i,1)=y(i,1)-u;
    end
end
%% 显示结果
disp('解向量为')
x
disp('下三角阵为')
L
disp('上三角阵为')
U

结果:
解向量为

x =

4.4706
7.9412
4.5882

下三角阵为

L =

1.0000         0         0
2.0000   -3.0000         0
3.0000   -2.0000   -5.6667

上三角阵为

U =

1.0000    1.0000    1.0000
     0    1.0000    0.6667
     0         0    1.0000

可以写成函数形式:function ( x x x, L L L, U 1 U_{1} U1)=Thomas_Mathod( A A A, b b b)

输入为 A A A, b b b

输出 x x x, L L L, U 1 U_{1} U1

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值