LU分解Matlab算法分析

article/2025/8/23 19:52:38

        最近矩阵分析老师出了一道题目作为作业,是一道程序题,题目是对A矩阵做LU分解,要求能对A实现PA=LU的分解,并最终输出L,U,P矩阵。

        先来解读下题目,寥寥几句话,里面囊括的信息量却不少,然后这些都得自己去琢磨。首先对A矩阵能做LU分解,即能把A分解成这种形式A=L*U(U是上三角矩阵,是由A矩阵经过高斯消元后得到的,L是下三角矩阵,其对角线全为1,其他非零元素为在消去(i,j)位置元素过程中主元所乘的系数),条件有3,一是矩阵A必须为方阵,A如果不是方阵,就不要想着对它做LU分解啦,这是基本条件,牢记啊!二是矩阵A必须可逆,换种说法就是A必须为非奇异矩阵,这两种说法是等价的,而这又等价于A是满秩的,A是满秩又等价于A的行列式值非0,好绕,矩阵就是这样,很多定理其实是等价的,但是你得记住,不然在推导一些定理或公式的时候会犯一些基本的常识性错误。三是矩阵A在高斯消元过程中必须没有出现0主元,也就是说只有在对A进行高斯消元过程中没有出现进行交换这种情况下,A才能分解成L*U这种形式,如果对A进行高斯消元,中间某一步出现0主元,需要进行行交换了,这种情况下就不要想对A进行LU分解啦,因为不满足条件3啊!那么问题来了,假如出现了有0主元这种情况,我又想对A进行LU分解,那应该怎么办?

        这就引出了带行变换的LU分解,也就是本文的主题。根据书上的定理,对任意一个非奇异矩阵(等价于可逆矩阵)都存在一个置换矩阵P使得P*A可以分解成L*U这种形式,即PA=LU。想想其实这定理也是不言自明的,刚才A不是要进行行变换才能继续高斯消元吗?而LU分解前提又是高斯消元过程中不能出现行交换,那好,我事先对A矩阵在高斯消元过程中需要交换的行给交换掉,形成一个新的矩阵B,那我对B高斯消元那肯定就不会出现需要行交换的情况,这就满足了LU分解第三个条件了,这样B不就可以进行LU分解了吗?是的,PA=LU这种形式的LU分解采用的就是这种思想。那么现在的问题是,怎么在代码中实现对A矩阵的LU分解,并输出P,L,U矩阵呢?我在网上搜了一下,发现结果大都不尽如人意,大多数程序吧只能说做A=LU这种形式的分解,一旦说A不满足条件3,那就死翘翘了,这种程序先不论其能否运行成功,结果是否正确,其鲁棒性也太差了!用个时髦点的词来说就是太low了!通用性太差了!不光如此,代码也没什么注释,可读性很差,让人怀疑是不是写给别人看的,尤其像我这种编程渣渣,看个代码费老半天劲都看不懂说什么。于是,我决定按自己的想法来走。

首先从最简单的情况考虑,这也是我们做研究、做学术、做工程必须要时刻牢记心中的一点,很多人喜欢一上来就把所有问题、把最复杂的情况、把方方面面都给考虑到,然后再开始实现他的想法,我自己也有这个习惯,但是,这并不是一个好习惯,一上来就好高骛远、就想着高大上这本质上是一种急功近利的表现,那样的话你会陷入到各种各样的技术细节当中,你会想半天却仍然写不出半点实质性的东西出来,所以最好的办法是,先考虑最简单、最核心的情况,这样不仅大大降低问题的复杂度,同时也为将来进一步扩展程序、解决更复杂的情况打下了一个坚实的基础。

        在这个例子中,最简单的情况就是矩阵A在高斯消元过程中不需要进行行交换,也就是说A可以分解成A=L*U这种形式。这种情况下,代码如下:

function LUDecomposition(A,n)%A is the square matrix,n is the order of A
L=eye(n);%Let the L matrix be an identity matrix at first
for i=1:n-1for j=i+1:n            L(j,i)=A(j,i)/A(i,i);A(j,:)=A(j,:)-(A(j,i)/A(i,i))*A(i,:);end
end
U=A %A becomes U matrix after Gauss elimination
L
可以试着令A=[2 2 2;4 7 7;6 18 22],调用函数获得L矩阵为[1 0 0;2 1 0;3 4 1],U矩阵为[2 2 2;0 3 3;0 4 4],函数执行结果如图:

用笔验算下,这个结果是正确的。这部分代码的主要思想是这样的,矩阵A的阶次为n的话,A在高斯消元后有n个非零主元。在消元过程中,A共需要消掉n-1个主元下面所有的元素,注意,第n个主元已经是矩阵的最后一个元素了,它的下面和右边都没有其他元素了,所以不存在说对第n个主元下面所有元素消去的情况。这就获得了我们代码的第一个for循环,从第1行主元开始消元,一直到第n-1行主元。而在获得每一行主元过程中,需要对该行主元下面所有元素都消去,假如现在要获得第i行主元的话,就是说要对该主元所在列的第i+1行到第n行元素都消掉,那么这就获得了我们代码的第二个for循环,从消去第i+1个元素开始一直到第n个元素。前文说过,消掉第(j,i)个位置元素过程中,主元所乘系数就是L矩阵第(j,i)位置的元素,所以有L(j,i)=A(j,i)/A(i,i);。然后的话,就是把A矩阵第j行减去第j行乘以L(j,i),这样就可以消掉第(j,i)个元素了,就是这行代码A(j,:)=A(j,:)-(A(j,i)/A(i,i))*A(i,:);。最后,执行完两层for循环后,A矩阵就成为了U矩阵,L矩阵也从最初的单位阵成了L矩阵。

         好了,我们已经实现了最简单的情况了,下面考虑复杂点的情况,就是说对A进行PA=LU这种形式的分解。假如A在消元过程中出现0主元了,那么怎么办?很简单,只需要从该0主元下面所有元素中找到一个非0元素,然后将其所在的行与该0主元所在的行进行交换就行了,不要忘了,对A矩阵两行进行了交换,对应到P矩阵中的操作是相应的两行也要进行交换,因为我们是通过P矩阵两行交换后然后左乘A矩阵使得A矩阵两行进行交换的。A矩阵交换第i行和第k行元素对应到L矩阵中相应两行的消元系数也应该交换位置,就是说L矩阵的第i行和第k行元素也要交换位置,当然,主对角线上的1是不需要交换的,因为他们并不是消元系数。交换完成后,继续执行消元操作,其步骤和上面考虑的最简单的情况就是一样的了。就这样,我们就实现了PA=LU这种形式的分解。这部分代码如下:

function AdvanceLUDecomposition(A,n)%A is the square matrix,n is the order of A,A must be invertible
D=A; %Store matrix A in D,for later use
L=zeros(n);%Let the L matrix be an zero matrix at first
P=eye(n);%Let the permutation matrix be a identity matrix at first
for i=1:n-1for j=i+1:n    if A(i,i)==0 %A zero pivot appears on (i,i) position,we need to find a nonzero entry below it to be the new pivot,with row exchangefor k=n:-1:i+1 %find a nonzero entry below the (i,i) entry in the i column,start from the last row if A(k,i)~=0 %We have found a nonzero entry,to choose it as the new pivot,we need row exchange k<-->iL([i k],:)=L([k i],:); %Permute i and k row in L matrixA([i k],:)=A([k i],:); %Permute i and k row in A matrixP([i k],:)=P([k i],:); %Permute i and k row in P matrixbreak;end  end  endL(j,i)=A(j,i)/A(i,i);A(j,:)=A(j,:)-(A(j,i)/A(i,i))*A(i,:);end
end
U=A %A becomes U matrix after Gauss elimination
L=L+eye(n) %All entries on the diagonal of L matrix must be 1 
P %output the permutation matrix
B=L*U %verify if the product of L and U equals to P*A
C=P*D %D is the original A matrix,check it out in row 2 %If B equals C,then it means the algorithm works correctly%some key points and theroms about LU factorization%Theorem 1 A nonsigular matrix Anxn possesses an LU factorization if and
%only if a nonzero pivot does not emerge during row reduction to upper
%triangular form with type III operations.%Theorem 2 For each nonsigular matrix A,there exist a permutation matrix P
%such that PA possesses an LU factorization PA=LU%Remember,the concept of nonsingular matrix is for square matrix,it means
%that the determinant is nonzero,and this is equivalent that the matrix has
%full-rank%Based on these conditions,the first thing about the matrix A on which we
%conduct LU factorization is that A must be a square matrix.The second
%thing is A must be invertible,which is equal to the statement that A is
%non-singular
令A=[1 2 -3 4;4 8 12 -8;2 3 2 1;-3 -1 1 -4],代入函数运算得L矩阵为[1 0 0 0;-3 1 0 0;2 -0.2 1 0;2 -0.2 1 0;4 0 3.75 1],U矩阵为[1 2 -3 4;0 5 -8 8 ;0 0 6.4 -5.4;0 0 0 -3.75],P矩阵为[1 0 0 0;0 0 0 1;0 0 1 0;0 1 0 0],用笔验算下,结果与函数运行结果是一致的,当然了,这个函数我只是代了3,4个不同的A矩阵进去而已,可能样本数量不够多,但目前来说我觉得应该没什么问题了,如果有问题欢迎反馈给我。代码运行结果如图所示:


        最后补充一点,为什么要进行LU分解呢?这个问题很关键,很多人也许并不关注这个问题,我们学习很多时候都是只关注实现方法,却并不关心它存在的意义,这种学习是永远无法深入的,只能是停留在表面上,学习就应该多问为什么,多质疑这个东西存在的价值,存在的意义有多大,这样才能促使你去深入了解这个方法的优点和缺点,从而改进、完善它。简单点来说就是LU分解大大降低了算法复杂度,我们求解一个方程组Ax=b的时候,一般来说无非就两种方法,要么是高斯消元法,要么是先求A的逆矩阵,然后再乘以b获得x,而第二种方法比第一种方法要复杂并且限制更多,所以一般是用高斯消元法。高斯消元法解一个方程组算法复杂度是(n^3)/3,并且每获得一个新的b,要接x,都得执行复杂度为(n^3)/3的操作。而LU分解有什么好处呢?在第一次LU分解的时候,也就是说获得L和U的时候,其算法复杂度其实也是n^3,但是,一旦我们获得了L和U矩阵后,每次我们获得一个新的b要求对应的解x,算法复杂度就会大大降低,粗略来说就是n^2,把复杂度降低了一个级别,对于大型系统来说,这是非常了不起的一个改进,运算性能会大大提升。而实际应用中,这样的方法也是非常有意义的,实际系统中,A矩阵相当于系统里的各种滤波和变换操作,x相当于系统的输入,b相当与系统的输出,我们一般是获得了输出b,然后想求得输入x,只要系统不变,那么知道b,又知道了L和U矩阵,我们只需要对每一个新的b执行n^2次乘法/除法和n^2-n次加法/减法就可以获得b对应的输入x了,这是多么了不起的一个性能改进!正因为这样,LU分解在实际应用中用的也是非常广泛。

         写完这篇文章,不知道矩阵分析老师会不会看到呢?不知道他以后还会不会出这道题呢?假如还出这道题的话,希望我这篇文章能对还在苦苦寻找源代码的各位师弟师妹们能起到一点小小帮助,当然了,这也只是一个抛砖引玉的方法,希望各位看官能有更好的答案,请不吝赐教!

 


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

相关文章

LU分解,LDLT分解,Cholesky分解

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

矩阵的直接LU分解法

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

LU分解、LDLT分解和Cholesky分解

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

A的LU分解

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

LU分解(matlab实现)

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

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

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

LU分解(图解)

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

矩阵系列:LU分解

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

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

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

矩阵分解入门——LU分解

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

C语言,折半查找法

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

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

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

查找算法之折半查找

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

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

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

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

折半查找法 折半搜索&#xff08;英语&#xff1a;half-interval search&#xff09;&#xff0c;也称二分搜索&#xff08;英语&#xff1a;binary search&#xff09;、对数搜索&#xff08;英语&#xff1a;logarithmic search&#xff09;&#xff0c;是一种在有序数组中查…

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

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

经典算法之折半查找法

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

查找——1、折半查找法

1、折半查找又称为二分查找&#xff0c;是一种效率较高的查找方法。 2、折半查找的前提条件&#xff1a; 查找表中的所有记录是按关键字有序(升序或降序) 。 查找过程中&#xff0c;先确定待查找记录在表中的范围&#xff0c;然后逐步缩小范围(每次将待查记录所在区间缩小一半…

折半查找

一、定义&#xff1a; 折半查找也称二分法查找&#xff0c;是一种在有序数组中查找某一特定元素的搜索算法。这种方法要求待查找的表顺序存储而且必须是有序的。 二、查找过程 首先计算表中间的位置&#xff0c;将表中间位置处的关键字与查找的关键字进行比较&#xff0c;如果相…

折半查找法(二分搜索法)

学习C语言的时候&#xff0c;折半查找法应该是很多人绕不开的一个简单算法。作为一名C语言的初学者&#xff0c;第一次看这个算法的时候着实是有些头疼。不过仔细读读发现其实并没有想象中那么难。 折半搜索&#xff0c;也称二分搜索是一种在有序数组中查找某一特定元素的搜索算…