第二章解线性方程组的直接方法的MATLAB程序24.在这章中我们要学习线性方程组的直接法,特别是适合用数学软件在计算机上求解的方法.2.1方程组的逆矩阵解法及其MATLAB程序2.1.3线性方程组有解的判定条件及其MATLAB程序判定线性方程组AnmbX是否有解的MATLAB程序function[RA,RB,n]=jiepb(A,b)B=[Ab];n=length(b);RA=rank(A);RB=rank(B);zhica=RB-RA;ifzhica0,disp('请注意:因为RA~=RB,所以此方程组无解.')returnendifRA==RBifRA==ndisp('请注意:因为RA=RB=n,所以此方程组有唯一解.')elsedisp('请注意:因为RA=RBn,所以此方程组有无穷多解.')endend例2.1.4判断下列线性方程组解的情况.如果有唯一解,则用表3-2方法求解.(1);0742,0634,0723,05324321432143214321xxxxxxxxxxxxxxxx(2)第二章解线性方程组的直接方法第二章解线性方程组的直接方法的MATLAB程序25.;0327,01613114,02332,075434321432143214321xxxxxxxxxxxxxxxx(3);8311,1023,22421321321xxxxxxxx(4).12,2224,12wzyxwzyxwzyx解在MATLAB工作窗口输入程序A=[23-15;312-7;41-36;1-24-7];b=[0;0;0;0];[RA,RB,n]=jiepb(A,b)运行后输出结果为请注意:因为RA=RB=n,所以此方程组有唯一解.RA=4,RB=4,n=4在MATLAB工作窗口输入X=A\b,运行后输出结果为X=(0000)’.(2)在MATLAB工作窗口输入程序A=[34-57;2-33-2;411-1316;7-213];b=[0;0;0;0];[RA,RB,n]=jiepb(A,b)运行后输出结果请注意:因为RA=RBn,所以此方程组有无穷多解.RA=2,RB=2,n=4(3)在MATLAB工作窗口输入程序A=[42-1;3-12;1130];b=[2;10;8];[RA,RB,n]=jiepb(A,B)运行后输出结果请注意:因为RA~=RB,所以此方程组无解.RA=2,RB=3,n=3第二章解线性方程组的直接方法的MATLAB程序26.(4)在MATLAB工作窗口输入程序A=[21-11;42-21;21-1-1];b=[1;2;1];[RA,RB,n]=jiepb(A,b)运行后输出结果请注意:因为RA=RBn,所以此方程组有无穷多解.RA=2,RB=2,n=32.2三角形方程组的解法及其MATLAB程序2.2.2解三角形方程组的MATLAB程序解上三角形线性方程组bAX的MATLAB程序function[RA,RB,n,X]=shangsan(A,b)B=[Ab];n=length(b);RA=rank(A);RB=rank(B);zhica=RB-RA;ifzhica0,disp('请注意:因为RA~=RB,所以此方程组无解.')returnendifRA==RBifRA==ndisp('请注意:因为RA=RB=n,所以此方程组有唯一解.')X=zeros(n,1);X(n)=b(n)/A(n,n);fork=n-1:-1:1X(k)=(b(k)-sum(A(k,k+1:n)*X(k+1:n)))/A(k,k);endelsedisp('请注意:因为RA=RBn,所以此方程组有无穷多解.')endend第二章解线性方程组的直接方法的MATLAB程序27.例2.2.2用解上三角形线性方程组的MATLAB程序解方程组.63,456,7472,203254434324321xxxxxxxxxx.解在MATLAB工作窗口输入程序A=[5-123;0-27-4;0065;0003];b=[20;-7;4;6];[RA,RB,n,X]=shangsan(A,b)运行后输出结果请注意:因为RA=RB=n,所以此方程组有唯一解.RA=RB=4,4,n=4,X=[2.4-4.0-1.02.0]’2.3高斯(Gauss)消元法和列主元消元法及其MATLAB程序2.3.1高斯消元法及其MATLAB程序用高斯消元法解线性方程组bAX的MATLAB程序function[RA,RB,n,X]=gaus(A,b)B=[Ab];n=length(b);RA=rank(A);RB=rank(B);zhica=RB-RA;ifzhica0,disp('请注意:因为RA~=RB,所以此方程组无解.')returnendifRA==RBifRA==ndisp('请注意:因为RA=RB=n,所以此方程组有唯一解.')X=zeros(n,1);C=zeros(1,n+1);forp=1:n-1fork=p+1:nm=B(k,p)/B(p,p);B(k,p:n+1)=B(k,p:n+1)-m*B(p,p:n+1);endendb=B(1:n,n+1);A=B(1:n,1:n);X(n)=b(n)/A(n,n);forq=n-1:-1:1X(q)=(b(q)-sum(A(q,q+1:n)*X(q+1:n)))/A(q,q);endelse第二章解线性方程组的直接方法的MATLAB程序28.disp('请注意:因为RA=RBn,所以此方程组有无穷多解.')endend例2.3.2用高斯消元法和MATLAB程序求解下面的非齐次线性方程组,并且用逆矩阵解方程组的方法验证..142,16422,0,13432143214324321xxxxxxxxxxxxxxx解在MATLAB工作窗口输入程序A=[1-11-3;0-1-11;2-2-46;1-2-41];b=[1;0;-1;-1];[RA,RB,n,X]=gaus(A,b)运行后输出结果请注意:因为RA=RB=n,所以此方程组有唯一解.RA=4RB=4n=42.3.2列主元消元法及其MATLAB程序用列主元消元法解线性方程组bAX的MATLAB程序function[RA,RB,n,X]=liezhu(A,b)B=[Ab];n=length(b);RA=rank(A);RB=rank(B);zhica=RB-RA;ifzhica0,disp('请注意:因为RA~=RB,所以此方程组无解.')returnendifRA==RBifRA==ndisp('请注意:因为RA=RB=n,所以此方程组有唯一解.')X=zeros(n,1);C=zeros(1,n+1);forp=1:n-1[Y,j]=max(abs(B(p:n,p)));C=B(p,:);B(p,:)=B(j+p-1,:);B(j+p-1,:)=C;fork=p+1:nm=B(k,p)/B(p,p);B(k,p:n+1)=B(k,p:n+1)-m*B(p,p:n+1);endendb=B(1:n,n+1);A=B(1:n,1:n);X(n)=b(n)/A(n,n);forq=n-1:-1:1X(q)=(b(q)-sum(A(q,q+1:n)*X(q+1:n)))/A(q,q);endelsedisp('请注意:因为RA=RBn,所以此方程组有无穷多解.')endend例2.3.3用列主元消元法解线性方程组的MATLAB程序解方程组X=0-0.50000.50000第二章解线性方程组的直接方法的MATLAB程序29..142,16422,13,0432143214321432xxxxxxxxxxxxxxx.解在MATLAB工作窗口输入程序A=[0-1-11;1-11-3;2-2-46;1-2-41];b=[0;1;-1;-1];[RA,RB,n,X]=liezhu(A,b)运行后输出结果请注意:因为RA=RB=n,所以此方程组有唯一解.RA=4,RB=4,n=4,X=[0-0.50.50]’2.4LU分解法及其MATLAB程序2.4.1判断矩阵LU分解的充要条件及其MATLAB程序判断矩阵A能否进行LU分解的MATLAB程序functionhl=pdLUfj(A)[nn]=size(A);RA=rank(A);ifRA~=ndisp('请注意:因为A的n阶行列式hl等于零,所以A不能进行LU分解.A的秩RA如下:'),RA,hl=det(A);returnendifRA==nforp=1:n,h(p)=det(A(1:p,1:p));,endhl=h(1:n);fori=1:nifh(1,i)==0disp('请注意:因为A的r阶主子式等于零,所以A不能进行LU分解.A的秩RA和各阶顺序主子式值hl依次如下:'),hl;RA,returnendendifh(1,i)~=0disp('请注意:因为A的各阶主子式都不等于零,所以A能进行LU分解.A的秩RA和各阶顺序主子式值hl依次如下:')hl;RAendend例2.4.1判断下列矩阵能否进行LU分解,并求矩阵的秩.(1)6547121321;(2)654721321;(3)654321321.解(1)在MATLAB工作窗口输入程序A=[123;1127;456];hl=pdLUfj(A)运行后输出结果为请注意:因为A的各阶主子式都不等于零,所以A能进行LU分解.A的秩RA和各阶顺序主子式值hl依次如下:RA=3,hl=110-48(2)在MATLAB工作窗口输入程序A=[123;127;456];hl=pdLUfj(A)运行后输出结果为请注意:因为A的r阶主子式等于零,所以A不能进行LU分解.A的秩RA和各阶顺序主子式值hl依次如下:第二章解线性方程组的直接方法的MATLAB程序30.RA=3,hl=1012(3)在MATLAB工作窗口输入程序A=[123;123;456];hl=pdLUfj(A)运行后输出结果为请注意:因为A的n阶行列式hl等于零,所以A不能进行LU分解.A的秩RA如下RA=2,hl=02.4.2直接LU分解法及其MATLAB程序将矩阵A进行直接LU分解的MATLAB程序functionhl=zhjLU(A)[nn]=size(A);RA=rank(A);ifRA~=ndisp('请注意:因为A的n阶行列式hl等于零,所以A不能进行LU分解.A的秩RA如下:'),RA,hl=det(A);returnendifRA==nforp=1:nh(p)=det(A(1:p,1:p));endhl=h(1:n);fori=1:nifh(1,i)==0disp('请注意:因为A的r阶主子式等于零,所以A不能进行LU分解.A的秩RA和各阶顺序主子式值hl依次如下:'),hl;RAreturnendendifh(1,i)~=0disp('请注意:因为A的各阶主子式都不等于零,所以A能进行LU分解.A的秩RA和各阶顺序主子式值hl依次如下:')forj=1:nU(1,j)=A(1,j);endfork=2:nfori=2:nforj=2:nL(1,1)=1;L(i,i)=1;ifijL(1,1)=1;L(2,1)=A(2,1)/U(1,1);L(i,1)=A(i,1)/U(1,1);L(i,k)=(A(i,k)-L(i,1:k-1)*U(1:k-1,k))/U(k,k);elseU(k,j)=A(k,j)-L(k,1:k-1)*U(1:k-1,j);endendendendhl;RA,U