lu分解是数值分析课程的内容,叫做三角分解法
其基本的思想就是说:将系数矩阵A分解为两个三角矩阵L与U的乘积A=LU,这样就把方程组AX=b的求解问题归结为两个三角形方程组
LY=b 与 UX=Y 的求解问题。你就可以先有第一个方程求Y,再有第二个方程求X。分成这两部求会变得简单,因为分别含有三角形矩阵L和U,计算机在求解的时候可以减少很多次运算,从而提高了求解速度,小矩阵求解用不到LU分解,只是当矩阵很庞大时才能体现出LU分解的优点
这种方法又根据LU的形式分为杜利特尔分解和克劳特分解
有两个主要元件的方法的主要元件的方法,一个完整的初级元件方法,在一般情况中,主元件的方法将能够以确保了该算法的稳定性,所谓的稳定的过程中,该算法的计算错误(消除法这种直接的方法主要是指舍入误差带来的是由于计算机的字长有限)可以控制的,完整的主要成分是更稳定的算法主要元素的方法,但计算量的方法比主元大多主元法只在每次消除同一列的比较的元素,做的比较与线性方程组的顺序数,n是相同的顺序,每做一次全主元素法消除系数矩阵所有元素的比较,计算量是比多列主元大的计算量,在一般情况下,不使用的完整的初级元件方法,而主元素的使用方法可以n ^ 2的相同的顺序。
你的代码我帮你解释了,果然是个复杂的活,如下function hl=zhjLU(A) %函数名为zhiLU,输入矩阵A,来进行LU分解,返回值hl为A的各阶主子式的行列式[n n] =size(A);%返回矩阵A的维数
RA=rank(A); %返回矩阵A的秩if RA~=n %判断矩阵A的秩RA是否不等于A的维数n,当不等于n时,即小于n时执行if中的语句disp('请注意:因为A的n阶行列式hl等于零,所以A不能进行LU分解A的秩RA如下:'), RA,hl=det(A);%输出disp中的字符串,RA的值,hl的值(此时它的值为矩阵A的行列式)return %并且退出程序end % if end 语句块,end标志if语句结束if RA==n %判别A的秩是否等于n,当等于n时,即满秩时执行下面的语句for p=1:n%从1到n循环,主要是想获得1至n阶主子式的行列式h(p)=det(A(1:p, 1:p));%A(1:p, 1:p)为A的前p行前p列,即A的p阶主子式,从而h(p)为A的p阶主子式的值end %for语句结束标志hl=h(1:n);%把A的各阶主子式的行列式值赋给hl存储for i=1:n %从1到n循环,主要是判断各阶主子式是否为0if h(1,i)==0 %判段第i阶主子式的行列式是否为0,若为0输出下面的语句disp('请注意:因为A的r阶主子式等于零,所以A不能进行LU分解A的秩RA和各阶顺序主子式值hl依次如下:'), hl;RA%输出disp中的字符串,各阶主子式的行列式的值,以及矩阵A的秩return %当有一个为0时退出程序end %if语句结束标志end %for语句结束标志if h(1,i)~=0 %如果执行到这一句,说明上边的for循环都执行了且没有return出去,则此时i的值为n,判断第n阶行列式是否为0,即还是判断A的行列式是否不为0,若不为0则输出下面语句disp('请注意:因为A的各阶主子式都不等于零,所以A能进行LU分解A的秩RA和各阶顺序主子式值hl依次如下:')%输出disp中的字符串for j=1:n%对1到n循环U(1,j)=A(1,j);%把A的第一行中的各个值赋给U中第一行的各个变量end%for循环结束标志for k=2:n%从第2列到第n列进行循环,即依次给LU的第k列赋值for i=2:n%从2到n循环 ,与j的循环是相互联系的,即当i>j时对下三角矩阵L赋值,当j>=i时对上三角U赋值for j=2:n%从2到n循环 ,与i的循环是相互联系的,即当i>j时对下三角矩阵L赋值,当j>=i时对上三角U赋值L(1,1)=1;L(i,i)=1; %始终保持L对角线上的元素为1if i>j %当i>j时,此时就是要对L进行赋值了,因为当i<j时,L(i,j)=0,不用管L(1,1)=1;L(2,1)=A(2,1)/U(1,1); L(i,1)=A(i,1)/U(1,1);%根据LU分解的关系知,L(i,1)处的值=A(i,1)/U(1,1),从而对L(i,1)进行赋值,即对L的第一列赋值L(i,k)=(A(i,k)- L(i,1:k-1)U(1:k-1,k))/U(k,k);%还是根据LU分解的关系L(i,k)处的值等于(A(i,k)- L(i,1:k-1)U(1:k-1,k))/U(k,k),对L(i,k)赋值,即对L的第k列赋值else %否则,即i<j时,此时就是要对U进行赋值了,因为当i>j时,U(i,j)=0,不用管U(k,j)=A(k,j)-L(k,1:k-1)U(1:k-1,j);%根据LU分解的关系知U(k,j)的值等于A(k,j)-L(k,1:k-1)U(1:k-1,j)进而对U的第k列赋值end %if结束标志end %for j=2:n结束标志end %for i=2:n结束标志end %for k=2:n结束标志hl;RA,U,L %输出矩阵的秩RA,上三角函数U,下三角函数Lend %if h(1,i)~=0结束标志end %RA==n结束标志 %%%%%%%%%%%%%%%%%%%%%%%%以上代码中有很多多余的,当判断A的秩为n之后其他的主子式的行列式都不为0了,判断是多余的,故我进行了改进,如下%%%%%%%%%%%%%%%%%%%%%%% function hl=LUfenJie(A) %函数名为zhiLU,输入矩阵A,来进行LU分解,返回值hl为A的各阶主子式的行列式[n n] =size(A);%返回矩阵A的维数
RA=rank(A); %返回矩阵A的秩if RA~=n %判断矩阵A的秩RA是否不等于A的维数n,当不等于n时,即小于n时执行if中的语句disp('请注意:因为A的n阶行列式hl等于零,所以A不能进行LU分解A的秩RA如下:'), RA,hl=det(A);%输出disp中的字符串,RA的值,hl的值(此时它的值为矩阵A的行列式)return %并且退出程序elsefor p=1:n%从1到n循环,主要是想获得1至n阶主子式的行列式h(p)=det(A(1:p, 1:p));%A(1:p, 1:p)为A的前p行前p列,即A的p阶主子式,从而h(p)为A的p阶主子式的值end %for语句结束标志hl=h(1:n);%把A的各阶主子式的行列式值赋给hl存储
disp('请注意:因为A的各阶主子式都不等于零,所以A能进行LU分解A的秩RA和各阶顺序主子式值hl依次如下:')%输出disp中的字符串for j=1:n%对1到n循环U(1,j)=A(1,j);%把A的第一行中的各个值赋给U中第一行的各个变量end%for循环结束标志for k=2:n%从第2列到第n列进行循环,即依次给LU的第k列赋值for i=2:n%从2到n循环 ,与j的循环是相互联系的,即当i>j时对下三角矩阵L赋值,当j>=i时对上三角U赋值for j=2:n%从2到n循环 ,与i的循环是相互联系的,即当i>j时对下三角矩阵L赋值,当j>=i时对上三角U赋值L(1,1)=1;L(i,i)=1; %始终保持L对角线上的元素为1if i>j %当i>j时,此时就是要对L进行赋值了,因为当i<j时,L(i,j)=0,不用管L(1,1)=1;L(2,1)=A(2,1)/U(1,1); L(i,1)=A(i,1)/U(1,1);%根据LU分解的关系知,L(i,1)处的值=A(i,1)/U(1,1),从而对L(i,1)进行赋值,即对L的第一列赋值L(i,k)=(A(i,k)- L(i,1:k-1)U(1:k-1,k))/U(k,k);%还是根据LU分解的关系L(i,k)处的值等于(A(i,k)- L(i,1:k-1)U(1:k-1,k))/U(k,k),对L(i,k)赋值,即对L的第k列赋值else %否则,即i<j时,此时就是要对U进行赋值了,因为当i>j时,U(i,j)=0,不用管U(k,j)=A(k,j)-L(k,1:k-1)U(1:k-1,j);%根据LU分解的关系知U(k,j)的值等于A(k,j)-L(k,1:k-1)U(1:k-1,j)进而对U的第k列赋值end %if结束标志end %for j=2:n结束标志end %for i=2:n结束标志end %for k=2:n结束标志hl;RA,U,L %输出矩阵的秩RA,上三角函数U,下三角函数Lend %RA~=n结束标志
lu分解牵涉到选主元,符号本身不带大小,所以lu就不行了,除非你自己知道某些未知量的性质然后自己写一个。
qr分解的计算当中倒是没有比较,不过我估计直接调qr还是不行的,如果不能直接用的话就自己写一段代码,反正块运算对符号也没用。
我不知道你为什么有这些需求,我估计你本身的问题可能有别的办法来解决,符号计算大多数时候是没用的。
可以先分成两个矩阵,再将第二个矩阵取逆
LU分解:将矩阵表示为一个下三角矩阵与一个上三角矩阵的乘积。[L,U]=lu(X): 产生L和U ,使得X=LU。>> A=[2,1,-1,1;1,-5,0,7;0,2,1,-1;1,6,-1,-4];>> b=[13,-9,6,0]';>> [L,U]=lu(A);>> x=U\(L\b) QR分解:是将矩阵分解为一个正交矩阵和一个上三角矩阵的乘积 :[Q,R]=qr(X): 产生Q和R,使得X=QR。
求逆:inv(A)
a=[5,10,15,20,25;7,21,42,63,84;6,16,32,56,66;6,17,37,76,96;7,19,39,73,93];
b=[15;49;24;27;33];
x=inv(a)b
以上就是关于matlab 中 lu 二角分解 是什么意识全部的内容,包括:matlab 中 lu 二角分解 是什么意识、随机产生10阶系数矩阵的线性方程组,分别用高斯消去法,列主元高斯消去法,LU分解法求解的matlab程序是怎样的、求直接三角分解法的matlab程序,每一步都需要解释,谢谢!等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)