Doolittle分解法(LU分解)详细分析以及matlab的实现

article/2025/8/23 1:34:55

一、基本介绍

    前面介绍的Gauss消去法实际上做的事情是将系数矩阵A做了一个三角分解,即:

A=LU      式(1)

    其中,L为单位下三角阵,U为上三角阵,该分解唯一。若A为非奇异,则U也非奇异。

    实际消元过程如下所示:

    第1步对应将系数矩阵和右端项左乘一个初等变换阵,即

   式(1.1)

    其中,有

式(1.2)

        式(1.3)

    消元的第2步对应为

  式(1.4)

    其中,有

  式(1.5)

     式(1.6)

    以此类推,第n-1步消元后,有:

  式(1.7)

    则消去过程对应的矩阵变换为

    式(1.8)

    由式(1.8)可导出LU分解式(1),此处L=L1L2...Ln-1仍然是单位下三角阵,U为上三角阵,具体形式为:

, 式(1.9)

    在实际编程计算的时候,只需要最终的两个矩阵LU,此时,原方程Ax=b的求解就转化为了两个三角形方程组的求解

式(1.10)

    采用回代的方式即可求出中间y和结果x。

     式(1.11)

  式(1.12)

   

    Doolittle分解可直接通过矩阵乘法导出计算过程。设A=LU,即

   式(1.13)

    由矩阵乘法及两矩阵相等,可得

    第一步,应l11=1,故u1j = a1j(j=1,2,...,n),且ai1 = li1u11,则li1 = ai1/u11(i=2,3,...,n),由此计算出U的第1行及L的第1列元素。

    一般地,若U的前i-1行及L的前i-1列元素已计算出来,则

    第i步,由

   式(1.14)

    得

    式(1.15)

    又由

   式(1.16)

    得

   式(1.17)

    综上可得,ALU分解公式如下

    对i = 1,2,...,n

  式(1.18)

二、算法分析

    在编程实现的时候,真正需要主要的公式并不多,很多看似复杂的推到,实际上只是举例几步,使得我们能够举一反三,更加清楚地理解推导式的由来。那么在这个代码中,我们需要使用到的公式包括:(1.11)、(1.12)和(1.18)。而其他公式如果无法理解其实并不影响代码的实现,只是为了更好地理解该知识点,还是建议大家自己动手推导一两步,可能会花一些时间,但肯定都是值得的。

    代码实现具体步骤:

    第一步:

    初始化u1i,其中i = 1,2,...,n。这里初始化上三角阵的第一行的原因是在式(1.18)的累加求和中使用到i-1,当i=1时,对于uk0我们并不能找到这样的一个值。同理也需要对下三角阵的第一列进行初始化。(如果哪位小伙伴有更好的方法,欢迎留言讨论)

    第二步:

    采用式(1.18)递推得到整个上三角阵和下三角阵。

    第三步:

    采用式(1.11)回代求解中间矩阵y

    第四步:

    采用式(1.12)回代求解最终结果x


注:或许有些小伙伴对于中间复杂公式怎么求解,其实这只是一个迭代过程,只不过在迭代地过程中需要理解什么时候需要使用循环,所使用的循环初始值是多少,结束是多少,是否需要中间变量。如果理解清楚这几点,相信对于同类型的问题应该是没有任何难度问题了。如果还是没有理解清楚,欢迎私信我。

    本文只给出了matlab语言的实现,不同语言实现的有一定的区别,欢迎大家使用更多不同语言来编写程序。

三、代码实现

    matlab代码实现如下:

function [L_matrix,U_matrix,y_matrix,x_matrix] = LU_separetion(A_matrix, B_matirx) 
% LU系数矩阵分解
% 2017-11-09  xh_scu
% inputs:
%        A_matrix:输入的系数矩阵,尺寸为[n,n]
%        B_matrix:输入的乘积矩阵,尺寸为[n,1]
% outputs:
%        L_matrix:下三角阵,尺寸为[n,n]
%        U_matrix:上三角阵,尺寸为[n,n]
%        y_matrix:中间矩阵,尺寸为[n,1]
%        x_matrix:结果矩阵,尺寸为[n,1]%% 第一步:初始化
% 获取n值
[row_a, col_a] = size(A_matrix);
% 初始化上三角阵的第一行
for j = 1:col_a % for-1U_matrix(1,j) = A_matrix(1,j);
end % for-1
% 初始化下三角阵的第一列
L_matrix(1,1) = 1;
for i = 2:row_a % for-2-sL_matrix(i,1) = A_matrix(i,1)/A_matrix(1,1); % 对应式(1.3)
end % for-2-e%% 第二步:前向分解计算
for i = 2:row_a  % for-3-sfor j = i:col_a % for-4-stemp_sum = 0;for k = 1:i-1 % for-5-stemp_sum = temp_sum + L_matrix(i,k)*U_matrix(k,j); %对应式(1.18)-上部分的求和部分end % for-5-eU_matrix(i,j) = A_matrix(i,j) - temp_sum; % 对应式(1.18)-上部分的求差部分temp_sum_1 = 0;for p = 1:i-1 % for-6-stemp_sum_1 = temp_sum_1 + L_matrix(j,p)*U_matrix(p,i); % 对应式(1.18)-下部分的求和部分end %for-6-eL_matrix(j,i) = (A_matrix(j,i) - temp_sum_1)/U_matrix(i,i); % 对应式(1.18)-下部分的求差再求商部分end % for-4-e
end % for-3-e%% 第三步:回代计算y
x_matrix = zeros(row_a,1);
% 后向回代
% 下三角回代----计算中间矩阵Y
y_matrix(1,1) = B_matirx(1,1);
for i = 2:row_a % for-7-stemp_sum_2 = 0;for j = 1:i-1 % for-8-stemp_sum_2 = temp_sum_2 + L_matrix(i,j)*y_matrix(j,1);end % for-8-ey_matrix(i,1) = B_matirx(i) - temp_sum_2;
end % for-7-e%% 第四步:回代计算x
% 上三角回代----计算结果矩阵X
x_matrix(row_a,1) = y_matrix(row_a,1)/U_matrix(row_a,col_a);
for i=row_a-1:-1:1 % for-9-stemp_sum_3 = 0;for j = i+1:row_a % for-10-stemp_sum_3 = temp_sum_3 + U_matrix(i,j)*x_matrix(j,1);end % for-10-ex_matrix(i,1) = (y_matrix(i,1) - temp_sum_3)/U_matrix(i,i);
end % for-9-e
end


四、测试分析

    1)算法的准确性测试

    设输入矩阵A = [2,2,3;4,7,7;-2,4,5], B = [3,1,-7]

    测试代码为:

A = [2,2,3;4,7,7;-2,4,5];
B = [3;1;-7];
[L,U,Y,X] = LU_separetion(A,B);

    计算结果为:

    L = [1,0,0;2,1,0;-1,2,1]

    U = [2,2,3;0,3,1;0,0,6]

    Y = [3;-5;6]

    X = [2;-2;1]

    与参考结果完全相等。

    2)Gauss消去法、列主元素消去法以及LU分解法性能对比

    设参数矩阵A为的元素为随机数,取值范围为[1,100],在相同输入下测试各算法的时间代价。

    测试函数如下:

function [result] = test_function()
% 初始化结果矩阵[3,10]
result = zeros(3,10);
for i = 100:100:1000% 产生随机矩阵A = randint(i,i,[1 100]);B = randint(i,1,[1,100]);% 分别调用三个函数[~,time_1] = GaussElimination(A,B);[~,time_2] = MainElementElimination(A,B);[~,~,~,~,time_3] = LU_separetion(A,B);% 将得到的计算时间结果送入结果矩阵j = i/100;result(1,j) = time_1;result(2,j) = time_2;result(3,j) = time_3;
end
end

    注:测试函数只是进行示例说明,可能中间还存在不严谨的地方,如果有相关的意见或想法,可以留言一起探讨。

    测试结果(取四位小数(四舍五入))如下表所示:

计算时间统计结果
维数100200300400500600
7008009001000
Gauss消去法0.02500.19100.68201.56803.20105.41008.468014.507021.494029.5890
列主元素消去法0.02700.19700.67301.58603.20004.49708.717013.661021.068030.0600
LU分解法0.02000.14800.50001.17502.53204.21607.038010.844014.141022.4300
  

    测试结果图例:

                

五、总结

     1、本文分析了LU分解法的详细实现,并对编程实现进行了主要步骤的说明,给出了matlab语言的实现代码。

     2、测试了Gauss消去法、列主元素消去法以及LU分解法的计算效率,从测试结果可以得出:在相同的输入情况下,LU分解法比前两者效率更高。



http://chatgpt.dhexx.cn/article/GTTceqS4.shtml

相关文章

线性代数笔记10——矩阵的LU分解

在线性代数中, LU分解(LU Decomposition)是矩阵分解的一种,可以将一个矩阵分解为一个单位下三角矩阵和一个上三角矩阵的乘积(有时是它们和一个置换矩阵的乘积)。LU分解主要应用在数值分析中,用来解线性方程、求反矩阵或…

线性代数——LU(LR)分解

文章目录 定义为什么要LU分解为什么能做到LU分解 利用LU分解求行列式值利用LU分解求解线性方程组利用LU分解求逆矩阵对角线上元素有0的情况 定义 定义:给定矩阵A,将A表示成下三角矩阵L和上三角矩阵U的乘积,称为LU分解。再进一步,…

LU分解Matlab算法分析

最近矩阵分析老师出了一道题目作为作业,是一道程序题,题目是对A矩阵做LU分解,要求能对A实现PALU的分解,并最终输出L,U,P矩阵。 先来解读下题目,寥寥几句话,里面囊括的信息量却不少&a…

LU分解,LDLT分解,Cholesky分解

LU分解 如果方阵是非奇异的,即的行列式不为0,LU分解总是存在的。 ALU,将系数矩阵A转变成等价的两个矩阵L和U的乘积,其中L和U分别是下三角和上三角矩阵,而且要求L的对角元素都是1,形式如下: 本…

矩阵的直接LU分解法

上篇博文由高斯消去法的矩阵形式推出了矩阵的LU分解:矩阵的三角分解法; 实际上,可以直接处理矩阵,得到矩阵的LU分解,这就是矩阵的直接LU分解;直接通过矩阵的元素得到计算LU元素的递推公式,不需…

LU分解、LDLT分解和Cholesky分解

LU分解 概念:假定我们能把矩阵A写成下列两个矩阵相乘的形式:ALU,其中L为下三角矩阵,U为上三角矩阵。这样我们可以把线性方程组Ax b写成 Ax (LU)x L(Ux) b。令Ux y,则原线性方程组Ax b可首先求解向量y 使Ly b&am…

A的LU分解

前面我们曾经通过高斯消元将矩阵A最终转化成了上三角阵U,那么今天我们就继续深入探索A和U之间到底有什么样的联系。在开始之前,先交代一些需用到的基础理论。假设A是可逆阵,则有AA-1I,两边同时转置,根据乘积的转置等于…

LU分解(matlab实现)

LU分解(LU Decomposition)是矩阵分解的一种,可以将一个矩阵分解为一个下三角矩阵和一个上三角矩阵的乘积。 主要的算法思路是从下至上地对矩阵A做初等行变换,将对角线左下方的元素变成零,这些行变换的效果等同于左乘一系列单位下三角矩阵&…

矩阵的LU分解,LU分解的推广,LU分解有什么意义,为什么要用LU分解。

一点点数学!开干! 参考书籍:《矩阵分析与计算》李继根 张新发编著 矩阵的LU分解: LU分解定理:如果n阶方阵A的各阶顺序主子式≠0(K1、2、3,…,n),即A的各阶…

LU分解(图解)

三角分解(LU分解) 在线性代数中, LU分解(LU Decomposition)是矩阵分解的一种,可以将一个矩阵分解为一个单位下三角矩阵和一个上三角矩阵的乘积(有时是它们和一个置换矩阵的乘积)。LU分解主要应用在数值分析中,用来解线…

矩阵系列:LU分解

1矩阵LU分解模块 1.1 LU分解数学表达 首先要明确的是,矩阵的LU分解是有局限性的,即LU分解只针对非奇异矩阵。那么什么是非奇异矩阵呢?即各阶顺序主子式不为零。 (1)高斯消去法 LU分解的思想来源于高斯消去法&#xff…

LU分解(图解与应用举例)

三角分解(LU分解) 在线性代数中, LU分解(LU Decomposition)是矩阵分解的一种,可以将一个矩阵分解为一个单位下三角矩阵和一个上三角矩阵的乘积(有时是它们和一个置换矩阵的乘积)。LU分解主要应用在数值分析中,用来解线…

矩阵分解入门——LU分解

文章目录 LU分解LU分解简介LU分解与高斯分解的对比LU的主要用途使用LU矩阵的注意事项初等矩阵与消元LU分解与配方法实际效果对比(matlab)使用LU分解中的一些特例 A A A矩阵中主元(位于第一行第一列的元素)为0LU分解后 U U U为非满秩 LU分解的推广1——LD…

C语言,折半查找法

折半查找,也称二分查找,在某些情况下相比于顺序查找,使用折半查找算法的效率更高。但是该算法的使用的前提是静态查找表中的数据必须是有序的。 问题分析: 二分查找法(也叫折半查找)其本质是分治算法的一…

利用数组进行数据查找---折半查找法(二分法)

二分法查找: 1.适用情况:在一批有序数据中查找某数。 2.基本思想:选定这批数据中居中间位置的一个数与查找数比较,看是否为所找之数,若不是,利用数据的有序性,可以决定所找的数是在选定数之前还…

查找算法之折半查找

查找算法之折半查找 折半查找算法的思路 首先查找的关键字在有序的查找表内, 这是折半查找的前提.(我们假设查找表内元素升序排列)确定查找表中的范围,一般用两个下标来表示范围: left 0,right length -1利用给定的关键字和查找表中的中间位置(mid (leftright)/2)的元素比较…

数据结构-折半查找法的ASL计算

(1)通常用查找过程中对关键字的比较次数 作为衡量算法效率优劣的标准。 (2)平均查找长度—ASL,相当于时间复杂度分析时的f(n)函数。 (3)考研的一个考点。 (4)ASL求解的关…

用折半查找法(二分查找),实现查询数组中的元素

折半查找法 折半搜索(英语:half-interval search),也称二分搜索(英语:binary search)、对数搜索(英语:logarithmic search),是一种在有序数组中查…

算法篇——二分查找法(折半查找法)

二分查找法(折半查找法):查找数组中是否包含指定元素。如果包含指定元素,则返回指定元素的index(从0开始);如果不包含指定元素,则返回-1; 前提:数组中的元素必须是有序的。 原理&…

经典算法之折半查找法

活动地址:21天学习挑战赛 目录 一、 算法 概述 算法过程 二、代码实践 三、复杂度分析 时间复杂度 空间复杂度 四、优缺点分析 优点 缺点 一、 算法 概述 折半查找( Binary Search )也称二分查找,它是一种效率较高的查找方法。但是&#xff…