高斯消元法与LU分解

1.高斯消去法

        有一般方程:Ax=b;

      

高斯消元法与LU分解_第1张图片 图1
​​

正常思路消元到最后,可以求出 x_{4} ,回带之前的方程,可以解出 x_{3},x_{2},x_{1}.

              

高斯消元法与LU分解_第2张图片 图2

                                                                          

但是一旦数据规模大了,那么便很麻烦,很难求解。

Gauss消元法的本质是将 矩阵A分解为 L* U .L是一下三角矩阵,U是一上三角矩阵.

A为未知数的初始L^{-1}*A*X=L^{-1}*b矩阵,消元的过程可以用矩阵L来替代,L_{n} *L_{n-1}*L_{n-1}*......*L_{1}*A=A_{n}  

消到最后有 A_{n}*X=b_{n}

最后的A_{n}就是图2.

令  L=(L_{n} *L_{n-1}*L_{n-1}*......*L_{1})^{-1}.  则 L^{-1}*A*X=L^{-1}*b

由于最后得到的矩阵 A_{n} 是上三角矩阵,把  A_{n} 记为  U , 可得 U*X=L^{-1}*b, 所以我们只需要求解L矩阵,U矩阵就可以了。

 

2.LU分解

      将系数矩阵A转变成等价两个矩阵L和U的乘积 ,其中L和U分别是单位下三角矩阵和上三角矩阵。当A的所有顺序主子式都不为0时,矩阵A可以分解为A=LU(所有顺序主子式不为0,矩阵不一定不可以进行LU分解)。其中L是下三角矩阵,U是上三角矩阵。

   Doolittle直接分解法

高斯消元法与LU分解_第3张图片

例题:

高斯消元法与LU分解_第4张图片

求得的L矩阵,U矩阵

高斯消元法与LU分解_第5张图片

LU分解的代码如下:

% 输入矩阵x=[A,b]; Ax=b;
A=[1 2 3;2 2 8;-3 -10 -2];b=[0;-4;-11];
%x=[A,b];
n=length(A);%A的行数
%LU分解
U=zeros(n);L=eye(n,n);
% 共n次循环,每一次循环先求出U的这一行的全部数据,求出L的这一列的全部数据
for i=1:n
    %求出U的这一行的数据
	row=i;
    for col=row:n
	    sum=0;
        %U第row行第col列
		for k=1:row-1
		    sum=sum+L(row,k)*U(k,col);
		end	
		U(row,col)=A(row,col)-sum;
    end
	%求出L的这一列的全部数据
	col=i;
    %第col列第row行
    for row=col+1:n
        sum=0;
        for k=1:col-1
            sum=sum+L(row,k)*U(k,col);
        end
        L(row,col)=(A(row,col)-sum)/U(col,col);
    end
end
L
U

 

3.高斯消元法的回带

           L矩阵,U矩阵已经求解完毕,

令  UX=y

      Ly=b,求解X。

 

  •        解 Ly=b.   对 i=1来说,y_{1}=b_{1} . 当i>=2,    y_{i}=b_{i}-\prod ^{j=i-1} _{j=1}L_{i,j}*y_{i-1}
  •        解 Ux=y   U的求解不再赘述

 

解Ly=b,Ux=y的代码如下: 

for t=2:n   %解Lx=b
    b(t)=b(t)-L(t,1:t-1)*b(1:t-1);
end
b(n)=b(n)/U(n,n);   %解Ux=b
for t=1:n-1;
    k=n-t;b(k)=(b(k)-U(k,k+1:n)*b(k+1:n))/U(k,k);
end
x=b;  %方程Ax=b的解即为x

 

总的代码如下:

clc;clear all;
% 输入矩阵x=[A,b]; Ax=b;
A=[1 2 3;2 2 8;-3 -10 -2];b=[0;-4;-11];
%x=[A,b];
n=length(A);%A的行数
%LU分解
U=zeros(n);L=eye(n,n);
% 共n次循环,每一次循环先求出U的这一行的全部数据,求出L的这一列的全部数据
for i=1:n
    %求出U的这一行的数据
	row=i;
    for col=row:n
	    sum=0;
        %U第row行第col列
		for k=1:row-1
		    sum=sum+L(row,k)*U(k,col);
		end	
		U(row,col)=A(row,col)-sum;
    end
	%求出L的这一列的全部数据
	col=i;
    %第col列第row行
    for row=col+1:n
        sum=0;
        for k=1:col-1
            sum=sum+L(row,k)*U(k,col);
        end
        L(row,col)=(A(row,col)-sum)/U(col,col);
    end
end
L
U
%LU分解完成
%求U*x=(L^-1)*b
y=zeros(n,1);
y(1)=b(1);
for i=2:n   %解Lx=b
    y(i)=b(i)-L(i,1:i-1)*y(1:i-1);
end

x=zeros(n,1);
x(n)=y(n)/U(n,n);
%b(n)=b(n)/U(n,n);   %解Ux=b
for i=1:n-1;
    k=n-i;
	x(k)=(y(k)-U(k,k+1:n)*x(k+1:n))/U(k,k);
end
x  %方程Ax=b的解即为x

 

你可能感兴趣的:(数值分析,matlab)