高斯消元法_实验报告
- 格式:docx
- 大小:988.06 KB
- 文档页数:13
实验报告课程名称数学软件实验班级***学号***姓名***实验课题矩阵的高斯消元,三角分解(Doolittle分解和Grout分解)实验目的求出矩阵三角分解的单位l矩阵和u矩阵,计算出y向量和x向量。
实验要求运用Matlab/C/C++/Java/Maple/Mathematica等其中一种语言完成实验内容矩阵的高斯消元,三角分解,包括Doolittle分解和Grout分解,分别算出分解的矩阵L,U和y,x向量。
成绩教师一.高斯消元有矩阵A,将矩阵按照高斯消元的方法将其化简求出线性方程的解,程序如下:function maintestclcclear allnum=input('please input the order n=')A=zeros(num,num);for i=1:numfor j=1:numA(i,j)=input('');endendAif det(A)~=0for i=1:numb(i)=input('');endb=b'for k=1:num-1max(A(:,k))for i=k+1:numif A(k,k)~=0l=A(i,k)/A(k,k);A(i,:)=A(i,:)-A(k,:).*l;b(i)=b(i)-b(k)*l;endendendAbx(num)=b(num)/A(num,num);for i=num-1:-1:1sum=0;for j=i+1:numsum=sum+A(i,j)*x(j);endx(i)=(b(i)-sum)/A(i,i);endxendend先输入系数矩阵的秩,再输入系数矩阵A ,若输入的矩阵为非奇异矩阵,则输入向量b,最后求出线性方程的解向量x 。
二.Doolittle 分解有矩阵A ,将矩阵进行分解为A LU =,其中L 为单位下三角矩阵,U 为上三角矩阵,则称此分解为Doolittle 分解。
解线性方程组的列主元素高斯消去法和LU 分解法一、实验目的:通过数值实验,从中体会解线性方程组选主元的必要性和LU 分解法的优点,以及方程组系数矩阵和右端向量的微小变化对解向量的影响。
二、实验内容:解下列两个线性方程组(1)⎪⎪⎪⎭⎫ ⎝⎛=⎪⎪⎪⎭⎫ ⎝⎛⎪⎪⎪⎭⎫ ⎝⎛--11134.981.4987.023.116.427.199.103.601.3321x x x(2)⎪⎪⎪⎪⎪⎭⎫ ⎝⎛=⎪⎪⎪⎪⎪⎭⎫ ⎝⎛⎪⎪⎪⎪⎪⎭⎫ ⎝⎛----15900001.582012151526099999.23107104321x x x x 三、实验要求:(1) 用你熟悉的算法语言编写程序用列主元高斯消去法和LU 分解求解上述两个方程组,输出Ax=b 中矩阵A 及向量b, A=LU 分解的L 及U ,detA 及解向量x.(2) 将方程组(1)中系数3.01改为3.00,0.987改为0.990,用列主元高斯消去法求解变换后的方程组,输出列主元行交换次序,解向量x 及detA ,并与(1)中结果比较。
(3) 将方程组(2)中的2.099999改为2.1,5.900001改为5.9,用列主元高斯消去法求解变换后的方程组,输出解向量x 及detA ,并与(1)中的结果比较。
(4)用MATLAB的内部函数inv求出系数矩阵的逆矩阵,再输入命令x=inv(A)*b,即可求出上述各个方程组的解,并与列主元高斯消去法和LU分解法求出的解进行比较,体会选主元的方法具有良好的数值稳定性。
用MATLAB的内部函数det求出系数行列式的值,并与(1)、(2)、(3)中输出的系数行列式的值进行比较。
四、实验过程:(1)列主元高斯消去法的主程序为function [RA,RB,n,X]=liezhuY(A,b)B=[A b]; n=length(b); RA=rank(A);RB=rank(B);zhica=RB-RA;D=det(A)if zhica>0,disp('请注意:因为RA~=RB,所以此方程组无解.')returnendif RA==RBif RA==ndisp('请注意:因为RA=RB=n,所以此方程组有唯一解.')X=zeros(n,1); C=zeros(1,n+1);for p= 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;for k=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);for q=n-1:-1:1X(q)=(b(q)-sum(A(q,q+1:n)*X(q+1:n)))/A(q,q);endelsedisp endend解方程组(1)在MATLAB工作窗口输入>>A=[3.01 6.03 1.999;1.27 4.16 -1.23;0.987 -4.819.34];b=[1;1;1];[RA,RB,n,X]=liezhuY(A,b)运行后输出结果为请注意:因为RA=RB=n,所以此方程组有唯一解. D=-0.1225RA =3 RB =3 n =3X = 397.8654-157.6242-123.1120解方程组(2)在MATLAB工作窗口输入>>A=[10 -7 0 1;-3 2.099999 6 2;5 -1 5 -1;2 1 0 2];b=[8;5.900001;5;1];[RA,RB,n,X]=liezhu(A,b)运行后输出结果为请注意:因为RA=RB=n,所以此方程组有唯一解. D=-762.0000RA =4 RB =4 n =4X =0.0000-1.00001.00001.0000LU分解法及MATLAB主程序为function hl=zhjLU(A)[n n] =size(A); RA=rank(A);D=det(A)if RA~=ndisp('请注意:因为A的n阶行列式hl等于零,所以A不能进行LU分解.A的秩RA如下:'), RA,hl=det(A);returnendif RA==nfor p=1:nh(p)=det(A(1:p, 1:p));endhl=h(1:n);for i=1:nif h(1,i)==0disp('请注意:因为A的r阶主子式等于零,所以A不能进行LU分解.A 的秩RA和各阶顺序主子式值hl依次如下:'), hl;RAreturnendendif h(1,i)~=0disp('请注意:因为A的各阶主子式都不等于零,所以A能进行LU分解.A的秩RA和各阶顺序主子式值hl依次如下:')for j=1:nU(1,j)=A(1,j);endfor k=2:nfor i=2:nfor j=2:nL(1,1)=1;L(i,i)=1;if i>jL(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,Lendend解方程组(1)在MATLAB工作窗口输入>>A=[3.01 6.03 1.999;1.27 4.16 -1.23;0.987 -4.819.34];h1=zhjLU(A)运行输出结果为请注意:因为A的各阶主子式都不等于零,所以A能进行LU分解.A的秩RA和各阶顺序主子式值hl依次如下:D=9.8547RA =3U =3.0100 6.0300 1.99900 4.1600 -2.07340 0 5.3016L =1.0000 0 00.4219 1.0000 00.3279 -1.6316 1.0000h1 =3.0100 4.8635 -0.1225解方程组(2)在MATLAB工作窗口输入>>A=[10 -7 0 1;-3 2.099999 6 2;5 -1 5 -1;2 1 02];h1=zhjLU(A)运行后输出结果为请注意:因为A的各阶主子式都不等于零,所以A能进行LU分解.A的秩RA和各阶顺序主子式值hl依次如下:D=-762.0000RA =4U =10.0000 -7.0000 0 1.00000 2.1000 6.0000 2.30000 0 -2.1429 -4.23810 -0.0000 0 12.7333L =1.0000 0 0 0-0.3000 1.0000 0 00.5000 1.1905 1.0000 -0.00000.2000 1.1429 3.2000 1.0000h1 =10.0000 -0.0000 -150.0001 -762.0001(2)在MATLAB工作窗口输入>>A=[3.01 6.03 1.999;1.27 4.16 -1.23;0.987 -4.819.34];b=[1;1;1];A(1,1)=3;A(1,3)=0.990;[RA,RB,n,X]=liezhu(A,b)请注意:因为RA=RB=n,所以此方程组有唯一解.RA =3 RB =3 n =3X = -4.02641.91931.5210hi = 3.0000 4.8219 9.8547在MATLAB工作窗口输入x=[397.8654;-157.6242;-123.1120]';x1=[-4.0264;1.9193;1.5210]';wucha=x1-x运行后输出结果为wucha =-401.8918 159.5435 124.6330(3)在MATLAB工作窗口输入>>A=[10 -7 0 1;-3 2.099999 6 2;5 -1 5 -1;2 1 0 2];A(2,2)=2.1;b(2,1)=5.9;b=[8;5.900001;5;1];[RA,RB,n,X]=lie zhu(A,b)运行后输出结果为请注意:因为RA=RB=n,所以此方程组有唯一解.RA =4 RB =4 n =4X =0.0000-1.00001.00001.0000h1 =10.0000 -0.0000 -150.0000 -762.0000在MATLAB工作窗口输入>>x=[0;-1;1;1]';x1=[0;-1;1;1]';wucha=x1-x运行后输出结果为wucha = 0 0 0 0(4)解方程组(1)在MATLAB工作窗口输入>>A=[3.01 6.03 1.999;1.27 4.16 -1.23;0.987 -4.81 9.34];B=inv(A)运行后结果为B =-268.9293 538.3418 128.4529106.7599 -213.4281 -50.956183.3992 -166.8022 -39.7090在MATLAB工作窗口输入>>b=[1;1;1];x=inv(A)*b运行后结果为x =397.8654-157.6242-123.1120在MATLAB工作窗口输入>>A=[3.01 6.03 1.999;1.27 4.16 -1.23;0.987 -4.81 9.34];A(1,1)=3;A(1,3)=0.990;B=inv(A)运行输出结果为B = 3.3424 -6.1983 -1.1705-1.3269 2.7442 0.5020-1.0365 2.0682 0.4893在MATLAB工作窗口输入>>b=[1;1;1];x=inv(A)*b运行后输出结果为x =-4.02641.91931.5210解方程组(2)在MATLAB工作窗口输入>>A=[10 -7 0 1;-3 2.099999 6 2;5 -1 5 -1;2 1 0 2];B=inv(A) 运行后结果为B =-0.0223 -0.0984 0.1181 0.1686-0.1601 -0.1181 0.1417 0.26900.0108 0.1063 0.0724 -0.07550.1024 0.1575 -0.1890 0.1969在MATLAB工作窗口输入>>b=[8;5.900001;5;1];x=inv(A)*b运行后输出结果为x = 0-1.00001.00001.0000在MATLAB工作窗口输入>>A=[10 -7 0 1;-3 2.099999 6 2;5 -1 5 -1;2 1 0 2];A(2,2)=2.1;B=inv(A)运行后输出结果为B =-0.0223 -0.0984 0.1181 0.1686-0.1601 -0.1181 0.1417 0.26900.0108 0.1063 0.0724 -0.07550.1024 0.1575 -0.1890 0.1969在MATLAB工作窗口输入>>b=[8;5.900001;5;1];b(2,1)=5.9;x=inv(A)*b运行后输出结果为x =-0.0000-1.00001.00001.0000五、实验结果分析:实验的数学原理很容易理解,也容易上手。
计算方法实验报告1课题名称用列主元高斯消去法和列主元三角分解法解线性方程目的和意义高斯消去法是一个古老的求解线性方程组的方法,但由它改进得到的选主元的高斯消去法则是目前计算机上常用的解低阶稠密矩阵方程组的有效方法;用高斯消去法解线性方程组的基本思想时用矩阵行的初等变换将系数矩阵A 约化为具有简单形式的矩阵上三角矩阵、单位矩阵等,而三角形方程组则可以直接回带求解 用高斯消去法解线性方程组b Ax =其中A ∈Rn ×n 的计算量为:乘除法运算步骤为32(1)(1)(21)(1)(1)262233n n n n n n n n n n nMD n ----+=+++=+-,加减运算步骤为(1)(21)(1)(1)(1)(25)6226n n n n n n n n n n AS -----+=++=;相比之下,传统的克莱姆法则则较为繁琐,如求解20阶线性方程组,克莱姆法则大约要19510⨯次乘法,而用高斯消去法只需要3060次乘除法;在高斯消去法运算的过程中,如果出现absAi,i 等于零或过小的情况,则会导致矩阵元素数量级严重增长和舍入误差的扩散,使得最后的计算结果不可靠,所以目前计算机上常用的解低阶稠密矩阵方程的快速有效的方法时列主元高斯消去法,从而使计算结果更加精确; 2、列主元三角分解法高斯消去法的消去过程,实质上是将A 分解为两个三角矩阵的乘积A=LU,并求解Ly=b 的过程;回带过程就是求解上三角方程组Ux=y;所以在实际的运算中,矩阵L 和U 可以直接计算出,而不需要任何中间步骤,从而在计算过程中将高斯消去法的步骤进行了进一步的简略,大大提高了运算速度,这就是三角分解法采用选主元的方式与列主元高斯消去法一样,也是为了避免除数过小,从而保证了计算的精确度计算公式1、 列主元高斯消去法设有线性方程组Ax=b,其中设A 为非奇异矩阵;方程组的增广矩阵为第1步k=1:首先在A 的第一列中选取绝对值最大的元素1l a ,作为第一步的主元素:111211212222112[,]n n n l n nn n a a a a b a a a b a a a b ⎡⎤⎢⎥⎢⎥⎢⎥=⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎣⎦a b然后交换A,b 的第1行与第l 行元素,再进行消元计算;设列主元素消去法已经完成第1步到第k -1步的按列选主元,交换两行,消元计算得到与原方程组等价的方程组 Akx=bk第k 步计算如下:对于k=1,2,…,n -11按列选主元:即确定t 使 2如果t ≠k,则交换A,b 第t 行与第k 行元素; 3消元计算消元乘数mik 满足:4回代求解2、 列主元三角分解法 对方程组的增广矩阵 经过k -1步分解后,可变成如下形式:111max 0l i i n a a ≤≤=≠(1)(1)(1)(1)(1)1112111(2)(2)(2)(2)22222()(()1)()()()()()1,1()(,)()[,][,] k k k k nk k nk n k k k k k kk kn k k k k n k k k n nn a a a a b a a a b a a b a b b a a a +++⎡⎤⎢⎥⎢⎥⎢⎥⎢⎥→=⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎣⎦A b A b ()()max 0k k tk ik k i na a ≤≤=≠,(1,,)ik ik ik kka a m i k n a ←=-=+, (,1,,), (1,,)ij ij ik kji i ik k a a m a i j k n b b m b i k n ←+=+⎧⎨←+=+⎩⎪⎪⎩⎪⎪⎨⎧--=-←←∑+=)1,,2,1(,)(1n n i a x a b x a b x ii n i j j ij i i nnn n [,]A A b =11121,11111222,122221,11,1,1,211,11,2121,112,112,1k k k k k k k j n k k j n k k k i i i k n n kk kj kn k ik ij in i nknjk k k j k n n nnk k n a a a b A a u u u u u u y l l l l l l ll l l l u u u u u y u u u u y a a b a a b l a -------------⎡→⎣⎤⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎦第k 步分解,为了避免用绝对值很小的数kku 作除数,引进量1111 (,1,,;1,2,,) ()/ (1,2,,;1,2,,)k kj kj km mj m k ik ik im mk kkm u a l u j k k n k n l a l u u i k k n k n -=-=⎧=-=+=⎪⎪⎨⎪=-=++=⎪⎩∑∑11(,1,,)k i ik im mk m s a l u i k k n -==-=+∑,于是有kk u =ks ;如果 ,则将矩阵的第t 行与第k 行元素互换,将i,j 位置的新元素仍记为jjl 或jja ,然后再做第k 步分解,这时列主元高斯消去法程序流程图max t ik i n s s ≤≤= ()/ 1,2,,)1 (1,2,,),kk k k t iki k ik u s s s l s s i k k n l i k k n ===++≤=++即交换前的,(且列主元高斯消去法Matlab主程序function x=gauss1A,b,c %列主元法高斯消去法解线性方程Ax=bif lengthA~=lengthb %判断输入的方程组是否有误disp'输入方程有误'return;enddisp'原方程为AX=b:' %显示方程组Abdisp'------------------------'n=lengthA;for k=1:n-1 %找列主元p,q=maxabsAk:n,k; %找出第k列中的最大值,其下标为p,qq=q+k-1; %q在Ak:n,k中的行号转换为在A中的行号if absp<cdisp'列元素太小,detA≈0';break;elseif q>ktemp1=Ak,:; %列主元所在行不是当前行,将当前行与列主Ak,:=Aq,:; 元所在行交换包括bAq,:=temp1;temp2=bk,:;bk,:=bq,:;bq,:=temp2;end%消元for i=k+1:nmi,k=Ai,k/Ak,k; %Ak,k将Ai,k消为0所乘系数Ai,k:n=Ai,k:n-mi,kAk,k:n; %第i行消元处理bi=bi-mi,kbk; %b消元处理endenddisp'消元后所得到的上三角阵是'A %显示消元后的系数矩阵bn=bn/An,n; %回代求解for i=n-1:-1:1bi=bi-sumAi,i+1:nbi+1:n/Ai,i;endclear x;disp'AX=b的解x是' x=b;调用函数解题列主元三角分解法程序流程图列主元三角分解法Matlab主程序①自己编的程序:function x=PLUA,b,eps %定义函数列主元三角分解法函数if lengthA~=lengthb %判断输入的方程组是否有误disp'输入方程有误'return;enddisp'原方程为AX=b:' %显示方程组Abdisp'------------------------'n=lengthA;A=A b; %将A与b合并,得到增广矩阵for r=1:nif r==1for i=1:nc d=maxabsA:,1; %选取最大列向量,并做行交换if c<=eps %最大值小于e,主元太小,程序结束break;elseendd=d+1-1;p=A1,:;A1,:=Ad,:;Ad,:=p;A1,i=A1,i;endA1,2:n=A1,2:n;A2:n,1=A2:n,1/A1,1; %求u1,ielseur,r=Ar,r-Ar,1:r-1A1:r-1,r; %按照方程求取ur,iif absur,r<=eps %如果ur,r小于e,则交换行p=Ar,:;Ar,:=Ar+1,:;Ar+1,:=p;elseendfor i=r:nAr,i=Ar,i-Ar,1:r-1A1:r-1,i; %根据公式求解,并把结果存在矩阵A中endfor i=r+1:nAi,r=Ai,r-Ai,1:r-1A1:r-1,r/Ar,r; %根据公式求解,并把结果存在矩阵A中endendendy1=A1,n+1;for i=2:nh=0;for k=1:i-1h=h+Ai,kyk;endyi=Ai,n+1-h; %根据公式求解yiendxn=yn/An,n;for i=n-1:-1:1h=0;for k=i+1:nh=h+Ai,kxk;endxi=yi-h/Ai,i; %根据公式求解xiendAdisp'AX=b的解x是'x=x'; %输出方程的解②可直接得到P,L,U并解出方程解的的程序查阅资料得子函数PLU1,其作用是将矩阵A分解成L乘以U的形式;PLU2为调用PLU1解题的程序,是自己编的Ⅰ.function l,u,p=PLU1A %定义子函数,其功能为列主元三角分解系数矩阵A m,n=sizeA; %判断系数矩阵是否为方阵if m~=nerror'矩阵不是方阵'returnendif detA==0 %判断系数矩阵能否被三角分解error'矩阵不能被三角分解'endu=A;p=eyem;l=eyem; %将系数矩阵三角分解,分别求出P,L,Ufor i=1:mfor j=i:mtj=uj,i;for k=1:i-1tj=tj-uj,kuk,i;endenda=i;b=absti;for j=i+1:mif b<abstjb=abstj;a=j;endendif a~=ifor j=1:mc=ui,j;ui,j=ua,j;ua,j=c;endfor j=1:mc=pi,j;pi,j=pa,j;pa,j=c;endc=ta;ta=ti;ti=c;endui,i=ti;for j=i+1:muj,i=tj/ti;endfor j=i+1:mfor k=1:i-1ui,j=ui,j-ui,kuk,j;endendendl=trilu,-1+eyem;u=triuu,0Ⅱ.function x=PLU2A,b %定义列主元三角分解法的函数l,u,p=PLU1A %调用PLU分解系数矩阵A m=lengthA; %由于A左乘p,故b也要左乘p v=b;for q=1:mbq=sumpq,1:mv1:m,1;endb1=b1 %求解方程Ly=b for i=2:1:mbi=bi-sumli,1:i-1b1:i-1;endbm=bm/um,m; %求解方程Ux=y for i=m-1:-1:1bi=bi-sumui,i+1:mbi+1:m/ui,i;endclear x;disp'AX=b的解x是' x=b;调用函数解题①②编程疑难这是第一次用matlab编程,对matlab的语句还不是非常熟悉,因此在编程过程中,出现了许多错误提示;并且此次编程的两种方法对矩阵的运算也比较复杂;问题主要集中在循环控制中,循环次数多了一次或者缺少了一次,导致数据错误,一些基本的编程语句在语法上也会由于生疏而产生许多问题,但是语句的错误由于系统会提示,比较容易进行修改,数据计算过程中的一些逻辑错误,比如循环变量的控制,这些系统不会提示错误,需要我们细心去发现错误,不断修正,调试;。
计算方法实验报告实验名称:实验(一)Gauss 消去法班级:学生姓名:学号:班级序号:课内序号:指导老师:2018-2019学年第2学期一、实验名称:Gauss消去法二、实验学时: 2学时三、实验目的和要求1、掌握高斯消去法基础原理2、掌握高斯消去法解方程组的步骤3、能用程序语言对Gauss消去法进行编程实现四、实验过程代码及结果1、代码:using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace ConsoleApplication_Gauss{class Program{//回带求值的过程static void CalcX(double[,] a, double[] x, int n){for (int i = n - 1; i >= 0; i--){double sum = 0;for (int j = i + 1; j < n; j++){sum += a[i, j] * x[j];}x[i] = (a[i, n] - sum) / a[i, i];}}//消元的过程static void CalcA(double[,] a, int n){for (int k = 0; k < n - 1; k++){for (int i = k + 1; i < n; i++){//double Lik = a[i, k] / a[k, k];// for (int j = k ; j <= n; j++)for (int j = n; j >= k; j--){a[i, j] = a[i, j] - a[i, k] / a[k, k] * a[k, j];}//a[i, k] = 0;}//Output}}//输出未知数x的值static void Output(double[] x, int n){for (int i = 0; i < n; i++){Console.WriteLine("x[{0}]={1}", i, x[i]);}}static void Output(double[,] a, int n){for (int i = 0; i < n; i++){//string s="";for (int j = 0; j <= n; j++){//s += string.Format("{0,-4}", a[i, j]);Console.Write("{0,6}", a[i, j]);}Console.WriteLine();}}//输入函数,表示输入一串值作为方程组的系数static void Input(double[,] a, int n){for (int i = 0; i <= n - 1; i++){string s = Console.ReadLine();string[] ss = s.Split(' ');for (int j = 0; j <= n; j++){a[i, j] = Convert.ToDouble(ss[j]);}}}static void Main(string[] args){Console.WriteLine("请输入矩阵的维数:");int n =Convert.ToInt32( Console.ReadLine());double[,] a = new double[n,n+1];Console.WriteLine("请输入矩阵的各个元;");Input(a, n);Console.WriteLine("------A(i,j)----------");Output(a, n);CalcA(a, n);Console.WriteLine("------消元之后A(i,j)----------");Output(a, n);double[] x = new double[n];CalcX(a, x, n);Output(x, n);Console.ReadLine();}}}2、结果:…。
高斯消元法求解线性方程组线性方程组是数学中重要的概念,它描述了一组线性方程的集合。
解决线性方程组的问题在科学和工程领域中具有广泛的应用。
高斯消元法是一种常用的方法,用于求解线性方程组。
本文将介绍高斯消元法的原理和步骤,并通过实例演示其应用。
一、高斯消元法的原理高斯消元法是一种基于矩阵变换的方法,用于将线性方程组转化为简化的行阶梯形式。
其基本思想是通过一系列的行变换,将方程组中的系数矩阵化为上三角矩阵,从而简化求解过程。
具体而言,高斯消元法的步骤如下:1. 将线性方程组的系数矩阵和常数向量写成增广矩阵的形式。
2. 选取一个主元素,通常选择第一列的第一个非零元素作为主元素。
3. 通过行变换,将主元素下方的所有元素化为零。
4. 选取下一个主元素,并重复步骤3,直到将矩阵化为上三角形式。
5. 通过回代法,求解得到线性方程组的解。
二、高斯消元法的步骤为了更好地理解高斯消元法的步骤,我们以一个具体的线性方程组为例进行演示。
假设我们有以下线性方程组:```2x + 3y - z = 14x - y + z = -2x + 2y + 3z = 3```首先,我们将其写成增广矩阵的形式:```[2, 3, -1 | 1][4, -1, 1 | -2][1, 2, 3 | 3]```接下来,我们选取第一列的第一个非零元素2作为主元素,并通过行变换将主元素下方的元素化为零。
具体步骤如下:1. 将第二行乘以2,然后与第一行相减,得到新的第二行:`[0, -7, 3 | -4]`2. 将第三行乘以0.5,然后与第一行相减,得到新的第三行:`[0, 0.5, 2.5 | 1.5]`此时,得到的矩阵为:```[2, 3, -1 | 1][0, -7, 3 | -4][0, 0.5, 2.5 | 1.5]```接下来,我们选取第二列的第二个非零元素-7作为主元素,并通过行变换将主元素下方的元素化为零。
具体步骤如下:1. 将第三行乘以14,然后与第二行相加,得到新的第三行:`[0, 0, 35 | 7]`此时,得到的矩阵为:```[2, 3, -1 | 1][0, -7, 3 | -4][0, 0, 35 | 7]```最后,我们通过回代法求解得到线性方程组的解。
1)用高斯列主元消元法求解下面的方程组#include <iostream>#include <cmath>#include <iomanip>using namespace std;int main(){//double a[4][5]={1,-1,1,-4,2,5,-4,3,12,4,2, 1,1,11,3,2,-1,7,-1,0};//int i,j,k;int Line,Row;double temp[4][5];//中间量Row=4;Line=5;//Inintial//Result//double X[5];cout<<"最初的矩阵为:"<<endl;for(i=0;i<4;i++){for(j=0;j<5;j++){cout<<a[i][j]<<' ';}cout<<endl;}cout<<endl;/////////////////////////////////for(k=0;k<Row-1;k++){//for(i=k+1;i<Row;i++){//temp[i][k]=a[i][k]/a[k][k];for(j=k;j<Line;j++){a[i][j]-=temp[i][k]*a[k][j];}}}//////////////////////////////////cout<<"经过消元后的增广矩阵为:"<<endl;for(i=0;i<4;i++){for(j=0;j<5;j++){cout<<a[i][j]<<' ';}cout<<endl;}cout<<endl;/////////////////////////////////for(i=Row-1;i>=0;i--){//double temp_new;temp_new=0;for(j=i+1;j<=Row-1;j++){a[i][Row]-=a[i][j]*a[j][Row];}a[i][Row]/=a[i][i];}///////////////////////////////////Print;cout<<"最后的解为:"<<endl;for(i=0;i<Row;i++){//cout<<"X"<<i+1<<"="<<a[i][Row]<<endl;}/////////////////////////////////return 0;}1.2列主元方法#include <iostream>#include <cmath>#include <iomanip>using namespace std;void Print(double a[][5]){int i,j;for(i=0;i<4;i++){for(j=0;j<5;j++){cout<<a[i][j]<<' ';}cout<<endl;}cout<<endl;}int main(){//double a[4][5]={1,-1,1,-4,2,5,-4,3,12,4,2, 1,1,11,3,2,-1,7,-1,0};//double b[4][5]={0.3e-15,int i,j,k,n;int Line,Row;double temp[4][5];//中间量Row=4;Line=5;//Inintial//////////////////////////////////////////////cout<<"最初的矩阵为:"<<endl;Print(a);////////////////////////////////////////////////the main process is underint kk;//flagsdouble max;//bool flag=false;double t;//the temp of change;for(k=0;k<Row-1;k++){/////////////////search the max_num//flag=false;max=a[k][k];kk=k;for(i=k;i<Row;i++){if(abs(a[i][k])>max){max=a[i][k];kk=i;//flag=true;}}//////////////////change the linefor(j=0;j<Line;j++){t=a[k][j];a[k][j]=a[kk][j];a[kk][j]=t;}cout<<"第"<<k+1<<"次换行结果:"<<endl;Print(a);cout<<endl;cout<<"第"<<k+1<<"次消元结果:"<<endl;//////////////////消元的过程for(i=k+1;i<Row;i++){//temp[i][k]=a[i][k]/a[k][k];for(j=k;j<Line;j++){a[i][j]-=temp[i][k]*a[k][j];}}///////////////////Print(a);//}//回带的过程n=Row-1;for(i=n;i>=0;i--){//double temp_new;temp_new=0;for(j=i+1;j<=n;j++){a[i][n+1]-=a[i][j]*a[j][n+1];}a[i][n+1]/=a[i][i];}/////////////////////////////////////////////cout<<"经过消元后的增广矩阵为:"<<endl;Print(a);////////////////////////////////////////////////Print;cout<<"最后的解为:"<<endl;for(i=0;i<Row;i++){//cout<<"X"<<i+1<<"="<<a[i][Row]<<endl;}/////////////////////////////////return 0;}2)分别用列主元消元法与不选主元消元法求解,分析对结果的影响#include <iostream>#include <cmath>#include <iomanip>using namespace std;void Print(double b[][5]){int i,j;for(i=0;i<4;i++){for(j=0;j<5;j++){cout<<b[i][j]<<' ';}cout<<endl;}cout<<endl;}int main(){double b[4][5]={0.3e-15,59.14,3,1,59.17,5.291,-6.130,-1,2,46.78,11.2,9,5,2,1,1,2,1,1,2};int i,j,k,n;int Line,Row;double temp[4][5];//中间量Row=4;Line=5;//Inintial//////////////////////////////////////////////cout<<"最初的矩阵为:"<<endl;Print(b);////////////////////////////////////////////////the main process is underint kk;//flagsdouble max;//bool flag=false;double t;//the temp of change;for(k=0;k<Row-1;k++){/////////////////search the max_num//flag=false;max=b[k][k];kk=k;for(i=k;i<Row;i++){if(abs(b[i][k])>max){max=b[i][k];kk=i;//flag=true;}}//////////////////change the linefor(j=0;j<Line;j++){t=b[k][j];b[k][j]=b[kk][j];b[kk][j]=t;}cout<<"第"<<k+1<<"次换行结果:"<<endl;Print(b);cout<<endl;cout<<"第"<<k+1<<"次消元结果:"<<endl;//////////////////消元的过程for(i=k+1;i<Row;i++){//temp[i][k]=b[i][k]/b[k][k];for(j=k;j<Line;j++){b[i][j]-=temp[i][k]*b[k][j];}}///////////////////Print(b);//}//回带的过程n=Row-1;for(i=n;i>=0;i--){//double temp_new;temp_new=0;for(j=i+1;j<=n;j++){b[i][n+1]-=b[i][j]*b[j][n+1];}b[i][n+1]/=b[i][i];}/////////////////////////////////////////////cout<<"经过消元后的增广矩阵为:"<<endl; Print(b);////////////////////////////////////////////////Print;cout<<"最后的解为:"<<endl;for(i=0;i<Row;i++){//cout<<"X"<<i+1<<"="<<b[i][Row]<<endl;}/////////////////////////////////return 0;}Ax (迭代法收敛速度实验)注意修改不同的A、B的数组2、用迭代法求解;b3、//雅可比迭代法/*@auther luozhengxiao*/#include <iostream>#include <cmath>#include <iomanip>using namespace std;//void Print(double x[]){for(int i=0;i<3;i++){cout<<setprecision(8)<<fixed<<x[i]<<endl;}}int main(){//double B1[3]={-3,2,4};double B2[3]={100,-200,345};double A[3][3]={6,2,-1,1,4,-2,-3,1,4};double x[3],x_old[3],temp;int i,j,k;for(i=0;i<3;i++){cout<<"请输入第"<<i+1<<"个数:";cout<<"\t x["<<i<<"]=";cin>>x[i];//x_old[i]=x[i];}int n;cout<<"请输入迭代次数:";cin>>n;/////////////////////////////////for(k=0;k<n;k++){//for(i=0;i<3;i++){//temp=0;j=0;while(j<3){if(j==i) {j++;continue;}temp+=A[i][j]*x[j];j++;}x_old[i]=B1[i]-temp;x_old[i]/=A[i][i];}for(j=0;j<3;j++){x[j]=x_old[j];}}Print(x);return 0;}。
高斯消元法解线性方程组C++实验报告2015年6月一、完成人王婧婷张子承郗滢二、问题描述线性方程组问题是大学阶段经常研究的问题,为了进一步熟悉理解高斯消元法的解题思路并且掌握编程语言在数学方面的应用。
且为解决线性方程组问题提供便利,要求给出线性方程组的矩阵,能够输出线性方程组的解。
三、解决方案设计基本程序流程为:(1)输入矩阵(2)运用初等行变换将其化为阶梯型矩阵(3)调用一个函数:r()求其秩(有解时)及其无解情况实验原理为:(1)系数矩阵及其增广矩阵经过初等行变换所得到的矩阵对应的方程与原方程同解(2)化为阶梯型矩阵过程(输入增广矩阵后,运用初等行变换,使其a[i][i]以下全为零,若a[i][i]为零,运用行变换交换使其不为零)(3)输出阶梯型矩阵(4)判断解情况并输出(解情况)(5)输出解四、模块及代码组织设计其基本模块分为三大部分,7小部分。
第一部分为输入矩阵阶段,用for语句实现。
第二部分是对矩阵进行一系列的处理以求得线性方程组的解,先运用初等行变换化为阶梯型,并输出化简矩阵;然后以线性方程组的秩判断其是否有解(规定无解时秩为零)。
第三部分是输出线性方程组的解情况及其解,如果无解即输出无解。
五、关键代码(1)实现化为阶梯型的代码实现此功能的代码是整个程序的重要内容,其需要进行的初等变换以实现校园的目的,使线性方程组得到简化。
其实现如下: for( i=0; i<=n-1&&i<m; i++ ){if(a[i][i]!=0){m1=a[i][i];for( j=i+1; j<=m-1; j++){m2=a[j][i];for( k=0; k<=n; k++ ){a[j][k]=a[j][k]-a[i][k]*m2/m1;}}}else if(a[i][i]==0){for( j=i+1; j<=m-1; j++){if(a[j][i]!=0){for(k=0; k<=n; k++)//交换i,j两行使a[i][i]!=0{b=a[i][k];a[i][k]=a[j][k];a[j][k]=b;}break;}}m1=a[i][i];for( j=i+1; j<=m-1; j++){m2=a[j][i];for( k=0; k<=n; k++ ){a[j][k]=a[j][k]-a[i][k]*m2/m1;}}}}(2)求出线性方程组系数矩阵秩的代码此代码是实现判断线性方程组解情况,其代码如下:int r(int m,int n,double c[][10000]){int i,j,k,b,e=0,f,x;double temp;double m1,m2;for(i=0; i<m; i++){b=0;for(j=0; j<n; j++){b=b+c[i][j];if (b!=0 ){e++;break;}}}for(i=0; i<m; i++){b=0;f=0;for(j=0; j<n; j++){b=b+c[i][j];if(b!=0 ) f=1;}if(f== 0 && c[i][n]!=0)//若系数全为0,非齐次项不为0; {return 0;x=1;break;}}if(x!=1)return e;}(3)分情况讨论解结构无解直接输出,单一解调用函数求解,无穷多解输出基础解析,代码如下:if(ra==0)cout<<"无解"<<endl;if(ra==n)//有唯一解{cout<<"唯一解"<<endl;danjie(n,a,x);for(i=0; i<n; i++)cout<<'x'<<(i)<<'='<<(x[i])<<endl;}else if(ra<n&&ra!=0){cout<<"无穷多解"<<endl;int ra=r(m,n,a);double b[ra][n-ra+1];double xx[ra][n-ra+1];for(i=0; i<ra; i++){for(k=0; k<n-ra+1; k++){b[i][k]=a[i][k+ra];}}for(i=0; i<ra; i++)a[i][ra]=b[i][n-ra];}danjie(ra,a,x);for(i=0; i<ra; i++){xx[i][0]=x[i];}for(j=1; j<=n-ra; j++){for(i=0; i<ra; i++){a[i][ra]=0;a[i][ra]=a[i][ra]-b[i][j-1];}danjie(ra,a,x);for(i=0; i<ra; i++){xx[i][j]=x[i];}}for(i=0; i<n; i++){if(i<ra){cout<<'x'<<(i+1)<<'=';for(j=0; j<=n-ra; j++){if(j==0){if(xx[i][j])cout<<xx[i][j];}else{if(xx[i][j]>0&&(xx[i][j-1]==0))cout<<xx[i][j]<<'k'<<(j);elseif(xx[i][j]>0&&xx[i][j-1]!=0)cout<<'+'<<xx[i][j]<<'k'<<(j);else if(xx[i][j]<0)cout<<xx[i][j]<<'k'<<(j); }}}else cout<<'x'<<(i+1)<<'='<<'k'<<(i+1-ra);cout<<endl;}cout << ra << endl;}void danjie(int n,double a[][10000],double x[]) {int i,j;for (i=n-1; i>=0; i--){if(i==n-1) x[i]=a[i][n]/a[i][i];elsefor(j=n-1; j>i; j--){a[i][n]=a[i][n]-x[j]*a[i][j];}x[i]=a[i][n]/a[i][i];}}运行实例(1) 2X1-X2+3X3+2X4=63X1-3X2+3X3+2X4=53X1-X2-X3+2X4=33X1-X2+X3-X4=4唯一解X1=1,X2=1,X3=1,X4=1(2)X1+X4=40X2+X5=20X3+X6=10X1+X2+X3=45X4+X5+X6=25无穷多解X1=15+X5+X6,X2=20-X5,X3=10-X6,X4=25+X5+X6,X5=X5,X6=.(3) X1+2X2=5X1+X2=42X1+X2=3无解。
高斯消去算法实验报告1. 实验背景高斯消去算法,也称为高斯消元法,是一种用于求解线性方程组的常用方法。
通过进行一系列的行变换,将方程组化简为阶梯矩阵,从而得到方程组的解。
本实验旨在使用高斯消去算法,解决给定的线性方程组。
2. 实验过程2.1 算法原理高斯消去算法的基本思想是通过进行行变换,将线性方程组化简为阶梯矩阵。
具体流程如下:1. 对于每一列,从对角线开始,选取主元(即该列中绝对值最大的元素),并将该主元所在的行与对角线所在的行交换位置。
这样可以避免除法中的误差积累。
2. 通过进行行变换,将主对角线以下的元素全部清零。
具体方法是,对于每一行i,通过消去第i+1行到最后一行的第i列元素,从而将下三角矩阵的元素清零。
3. 倒序遍历每一行,通过行变换,将主对角线以上的元素清零。
具体方法是,消去第i-1行到第1行的第i列元素,从而将上三角矩阵的元素清零。
4. 将矩阵化简为阶梯矩阵。
2.2 实验步骤1. 取得待解线性方程组的系数矩阵A和常数向量b。
2. 将矩阵A和向量b合并为增广矩阵Ab。
3. 通过高斯消去算法,将增广矩阵化简为阶梯矩阵。
4. 根据化简后的阶梯矩阵,求解线性方程组。
3. 实验结果以一个3阶线性方程组为例进行实验,方程组如下:2x + 3y + z = 93x + 2y + 4z = 124x + 3y + 6z = 18按照操作步骤,我们将系数矩阵A和常数向量b合并为增广矩阵Ab:markdownA = [[2, 3, 1],[3, 2, 4],[4, 3, 6]]b = [9, 12, 18]Ab = [[2, 3, 1, 9],[3, 2, 4, 12],[4, 3, 6, 18]]然后,通过高斯消去算法,将增广矩阵Ab化简为阶梯矩阵:markdownAb = [[2, 3, 1, 9],[0, 1.5, 2.5, 6],[0, 0, 0, 0]]根据化简后的阶梯矩阵,我们可以得到方程组的解:x = 1y = 2z = 0因此,该线性方程组的解为x=1,y=2,z=0。
GAUSS 消元法解线性方程组学院:计算机与信息工程学院班级: 计算机科学与技术师范汉班学号: 20081121107姓名: 黄志强指导老师: 马季驌1.alborithm analysis:本程序采用高斯消元法解线性方程组。
其主要思想是将增广矩阵中的系数矩阵先化为三角矩阵的形式,再通过迭代或者化为对角矩阵求出方程的根。
本程序时先将系数矩阵化为上三角形式,再化成对角矩阵求解。
b5E2RGbCAP2.code:#include<iostream>using namespace std。
float a[20][20]。
int main(>{int n,i,j,p,x,y,f。
float k,t。
cout<<"请输入线性方程组系数矩阵的阶<按0退出):"。
while(cin>>n&&n>0>{int judge=1。
//作为系数矩阵对应行列式是否为0的标识;cout<<"请输入系数行列式的各行各列的元素:"<<endl。
for(i=1。
i<=n。
i++>for(j=1。
j<=n。
j++>{cin>>a[i][j]。
}//输入行列式的各行各列元素cout<<"请输入线性方程组的常数列:"<<endl。
for(i=1。
i<=n。
i++>cin>>a[i][n+1]。
/*********************增广矩阵输入完毕以下进行划上三角矩阵操作*********************************************************** **************************/p1EanqFDPwfor(j=1。
j<=n。