有关线性代数的Matlab代码笔记(6)——LU分解(没有行变换)

今天又有空了

%%%%%%%%%%%%%%%%%%%%%说明 %%%%%%%%%%%%%%%%%%%

LU分解:L是lower,U是upper的意思。将一个方阵分解为很能展现其特点同时也非常

方便的两部分。我们首先从没有涉及到行变换的简单情况开始考虑。因为我们可以将

消元看成是左乘一个矩阵:EA=U;所以A=inverse(E)*U。U比较容易得到。我们考虑

L。L=inverse(E),可以看成是将消元还原的矩阵。所以以下代码是将消元过程中的系数

取出构成了L。

%%%%%%%%%%%%%%%%%%%%%CODE %%%%%%%%%%%%%%%%%%

function [L, U] = slu(A)


% slu  方阵的LU 分解*不使用行变换*.
%
% [L, U] = slu(A) 使用高斯消元计算一个单位 
% 下三角矩阵L 和一个上三角矩阵U 使得 L*U = A.
% 当列主元过小时会停止计算.
%


[n, n] = size(A);


for k = 1:n
   if abs(A(k, k)) < sqrt(eps)%eps= 2.2204e-016
      disp(['列主元过小 ' int2str(k) '.'])
   end
   L(k, k) = 1;%构造下三角矩阵的对角线元素
   for i = k+1:n
      L(i,k) = A(i, k) / A(k, k);
      for j = k+1:n
         A(i, j) = A(i, j) - L(i, k)*A(k, j);%进行高斯消元
      end
   end
   for j = k:n
      U(k, j) = A(k, j);
   end
end

%%%%%%%%%%%%%%%%%%%%%范例 %%%%%%%%%%%%%%%%%%

>> A=[1 2 3;2 3 4;1 1 2]


A =


     1     2     3
     2     3     4
     1     1     2


>>  [L,U]=slu(A)


L =


     1     0     0
     2     1     0
     1     1     1




U =


     1     2     3
     0    -1    -2
     0     0     1

你可能感兴趣的:(自学自玩)