矩阵分解方法(广义追赶法)
对于一般形式的线性方程组
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⎦⎤=⎣⎡l11l21l310l22l3200l33⎦⎤⎣⎡100u1210u13u231⎦⎤=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=a22−l21u12,u23=(a23−l21u13)/l22l32=a32−(l31u12),l33=a33−l31u13−l32u23
求解环节
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,j−∑k=1j−1li,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,j−∑k=1j−2li,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=(bi−∑j=1i−1li,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=yi−∑j=i+1nui,jxj,i=n,n−1,...,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