高斯消元法_实验报告
消元法实验报告11
实验报告课程名称数学软件实验班级***学号***姓名***实验课题矩阵的高斯消元,三角分解(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 分解法一、实验目的:通过数值实验,从中体会解线性方程组选主元的必要性和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五、实验结果分析:实验的数学原理很容易理解,也容易上手。
guess消元法
{
for(j=1;j<=n+1;j++)
{
cin>>a[i][j];
}
}
for(k=1;k<=n-1;k++)
{
for(i=k+1;i<=n;i++)
{
for(j=k+1;j<=n+1;j++)
{
a[i][j]=a[i][j]-(a[i][k]/a[k][k])*a[k][j];
《数值分析》实验报告
实验序号:实验一题目名称:Gauss消元法解方程组
学号:XXXXXXX姓名:XXX
任课教师:XXXX专业班级:算机科学与技术(师范)
1、实验目的:
编写用Gauss消元法解线形方程组的程序
2、实验分析:
计算方法分析:
Gauss消元法的基本做法就是把方程组转化成为一个如下图的等价的三角方程组,这个过程叫做消元。得到三角方程组后,就可以逐个求出Xn,Xn-1,…,X1,这个过程叫回代。
程序代码分析:
建立两个数组a和b,通过循环语句将n阶增广矩阵输入进去,通过对列的循环对每一列进行消去未知数,通过n小步n大步把矩阵化简成上三角形矩阵,最后通过迭代法解得方程组得解。
3、函数分析:
程序中只用到一个主函数,求解线形方程组得算法都放在主函数中,
利用以下函数进行求解:
a[i][j]=a[i][j]-a[i][k]/a[k][k]*a[k][j];
b[i]=b[i]-a[i][k]/a[k][k]*b[k];
迭代:
for(i=n-1;i>0;i--)
列主元高斯消去法和列主元三角分解法解线性方程
计算方法实验报告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的语句还不是非常熟悉,因此在编程过程中,出现了许多错误提示;并且此次编程的两种方法对矩阵的运算也比较复杂;问题主要集中在循环控制中,循环次数多了一次或者缺少了一次,导致数据错误,一些基本的编程语句在语法上也会由于生疏而产生许多问题,但是语句的错误由于系统会提示,比较容易进行修改,数据计算过程中的一些逻辑错误,比如循环变量的控制,这些系统不会提示错误,需要我们细心去发现错误,不断修正,调试;。
计算方法实验报告(1)----Gauss消去法
计算方法实验报告实验名称:实验(一)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。
列主元高斯消去法实验报告
}
}
printf("高斯消去:\n");
for(i=0;i<n;i++)
{
for(j=0;j<n+1;j++)
printf("%f",a[i][j]);
printf("\n");
}
if(fabs(a[n-1][n-1])<DETLA)
{
printf("A奇异,break \n");
int i,j,n,k,m;
printf("确定一个初元数:n=");
scanf("%d",&n);
printf("输入数组:a[%d][%d]\n",n,n+1);
for(i=0;i<n;i++)
{
for(j=0;j<n+1;j++)
scanf("%f",&a[i][j]);
}
printf("得到数组:\n");
若m≠k,交换第k行与第m行对应的元素(换行):
消元:
对i=k+1,…,n-1,计算l=lik=aik/akk;
对j=k+1,…,n-1,n,计算aij=aij-lik*akj=aij-l*akj
回代:
若|ann|<DELTA,则A奇异,结束程序,否则继续
xn-1=an-1,n/ an-1, n-1
对i=n-2 ,…, 1, 0,计算:
编程要求:
1)方程组的矩阵系数用二维数组表示,不用指针,且其值要求用输入语句输入。(数组形式的完成,经检查后,有能力的可以改用指针方式)
解线性方程组的列主元素高斯消去法和LU分解法实验报告
解线性方程组的列主元素高斯消去法和LU分解法实验报告解线性方程组的列主元素高斯消去法和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.81 9.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.0000 RA =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;RA returnendendif 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]=liezhu(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五、实验结果分析:实验的数学原理很容易理解,也容易上手。
高斯消元法_实验报告
- - 华中科技大学数值分析实验报告系、年级研究生院2012级****类别硕士2013年5月6日实验6.1实验要求:根据教材实验6.1做出相应改编:分别使用Gauss 消元、列选主元。
全选主元的方法求解线性方程组,分别比拟三种消元方法的结果和算法的区别,并说明主元的选取在Gauss 消元的中的作用。
问题提出:Gauss 消去法是我们在线性代数中已经熟悉的。
但由于计算机的数值运算是在一个有限的浮点数集合上进展的,如何才能确保Gauss 消去法作为数值算法的稳定性呢?Gauss 消去法从理论算法到数值算法,其关键是主元的选择。
主元的选择从数学理论上看起来平凡,它却是数值分析中十分典型的问题。
一般来说书本上采用的列选主元的方法对其线性方程组进展求解的,则我们是否可以选择一种行列都选取主元消去的方法来减小相应的误差呢?全主元消元法和列主元消元法一样都是由高斯消元法演变而来。
只不过选取主元的*围有所加大。
全选主元相对于列选主元的更加复杂化了,因为在运算的过程中导致了元的位置发生了变化,这样我们就不得不追踪每个元的位置。
本次实验就几个问题进展了matlab 实验分析,比拟几种计算方法的优劣性。
实验内容:考虑线性方程组编制一个程序:分别能进展Gauss 消去、列选主元Gauss 消去、全选主元Gauss 消去法进展解线性方程组。
对三种算法所得到的结果进展比拟,分析三种计算方法的准确性。
具体内容:〔1〕取矩阵⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎣⎡=⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎣⎡=1415157,6816816816 b A ,则方程有解T x )1,,1,1(* =。
取n=10、n=20计算矩阵的条件数。
分别编写利用matlab 编写运算程序,实现Gauss消去、列选主元消去以及全选主元消去的方法。
比拟三种计算方法的运算结果。
在列选主元的过程中分别采用每步消去过程总选取按模最小或按模尽可能小的元素作为主元或每步消去过程总选取按模最大的元素作为主元,结果又如何?分析实验的结果。
计算方法上机实验报告高斯消元法
三、计算结果
四、结果分析说明
因为采用的高斯消元法是直接法计算,而非迭代计算,故不存在收敛性问题,结果中误 差只是由计算机运算过程的舍入误差造成。同时后面有用追赶法求解的这一题目,其结果相 同。
五、源程序 #include<stdio.h> #include<math.h> int main(void) {
for(k=0;k<71;k++) { for(i=k;i<71;i++) { if(b[k][k]!=0) { for(j=k+1;j<73;j++) b[i+1][j]=b[i+1][j]-b[k][j]*(b[i+1][k]/b[k][k]); b[i+1][k]=0; } else { for(m=k;b[m][k]==0;m++) ; for(j=k;j<73;j++) { z=b[m][j]; b[m][j]=b[k][j]; b[k][j]=z; } for(j=k+1;j<73;j++) b[i+1][j]=b[i+1][j]-b[k][j]*(b[i+1][k]/b[k][k]); b[i+1][k]=0; } } }
sum=0; for(i=71;i>k;i--) sum=sum+a[i]*b[k][i]; a[k]=(b[k][72]-sum)/b[k][k]; }
求解得到各样条函数的系数后,在进行指定函数值求解,相应的程序段为 for(i=0;i<12;i++)
{ for(j=0;j<18;j++) { if((X[i]>x[j])&&(X[i]<x[j+1])) S[i]=a[4*j]+a[4*j+1]*pow(X[i],1)+a[4*j+2]*pow(X[i],2)+a[4*j+3]*pow(X[i],3); else ; }
matlab高斯消元法实验原理
matlab高斯消元法实验原理高斯消元法是一种常用的线性方程组求解方法,在数值计算和科学工程领域中广泛应用。
它通过将线性方程组转化为三角形式,从而简化求解过程。
本文将介绍高斯消元法的实验原理。
高斯消元法的实验原理主要分为三个步骤:正向消元、回代和唯一解判断。
首先,我们将线性方程组的系数矩阵化为上三角形式,这个过程称为正向消元。
然后,通过回代的过程求解出方程组的解向量。
最后,利用唯一解判断的方法确定线性方程组是否有唯一解。
在正向消元过程中,我们选择一个主元,通常选择系数矩阵的主对角线上的非零元素作为主元。
然后,通过行初等变换,将主元所在列下方的元素化为零,使系数矩阵变为上三角形式。
这个过程可用矩阵乘法和矩阵加法来表示。
接下来,在回代过程中,我们从最下方的方程开始,求解出最后一个未知数的值。
然后,将得到的解代入前面的方程中,依次求解出其他未知数的值。
这个过程与正向消元类似,但是方向相反,所以称为回代。
在唯一解判断中,我们需要判断线性方程组是否有唯一解。
如果系数矩阵的主对角线上存在零元素,或者方程组中的某个方程是其他方程的线性组合,则该方程组无解或有无穷多解。
否则,方程组有唯一解。
实际应用中,高斯消元法在数值计算、信号处理、图像处理、机器学习等领域都有广泛的应用。
它的优点是简单易行,求解速度较快,但是对于某些特殊的线性方程组,可能会出现数值稳定性较差的情况。
总结而言,高斯消元法是一种常用的线性方程组求解方法,通过正向消元、回代和唯一解判断三个步骤,可以求解出线性方程组的解向量。
该方法在科学计算和工程应用中被广泛使用,具有简单、快速的优点。
数值试验报告
数值分析实验报告实验1 高斯列主元素消去法1.1 实验目的掌握高斯消去法的基本思路和迭代步骤;培养编程与上机调试能力。
1.2 算法描述1.2.1 高斯消去法基本思路设有方程组Ax b =,设A 是可逆矩阵。
高斯消去法的基本思想就是将矩阵的初等行变换作用于方程组的增广矩阵[]B A b = ,将其中的A 变换成一个上三角矩阵,然后求解这个三角形方程组。
1.2.2 列主元高斯消去法计算步骤将方程组用增广矩阵[]()(1)ijn n B A b a ⨯+== 表示。
1. 消元过程对1,2,,1k n =-(1) 选主元,找{},1,,k i k k n ∈+ 使得 ,max k i k ik k i na a ≤≤= (2) 如果,0k i k a =,则矩阵A 奇异,程序结束;否则执行(3)。
(3) 如果k i k ≠,则交换第k 行与第k i 行对应元素位置,k kj i j a a ↔,,,1j k n =+ 。
(4) 消元,对,,i k n = ,计算/,ik ik kk l a a =对1,,1j k n =++ ,计算.ij ij ik kj a a l a =-2. 回代过程(1) 若0,nn a =则矩阵奇异,程序结束;否则执行(2)。
(2) ,1/;n n n nn x a a +=对1,,2,1i n =- ,计算,11/n i i n ij j ii j i x a a x a +=+⎛⎫=- ⎪⎝⎭∑1.3 实验内容解方程组1231231230.101 2.304 3.555 1.1831.347 3.712 4.623 2.1372.835 1.072 5.643 3.035x x x x x x x x x ++=⎧⎪-++=⎨⎪-++=⎩1.4 实验步骤(1)根据高斯列主元素消去法的算法描述,编写出可行的高斯列主元消去法的程序Guassc.m ;(2)调制程序,改正程序运行中的错误。
高斯消元法_实验报告(两篇)
引言概述:本实验报告是关于高斯消元法的实验,主要研究了高斯消元法在解决线性方程组中的应用。
高斯消元法是一种用于求解线性方程组的重要方法,通过矩阵运算将线性方程组转化为简化的上三角矩阵,从而得到方程组的解。
本实验从理论和实际实验两个方面进行了探讨,并针对高斯消元法的优缺点进行了总结。
正文内容:一、高斯消元法的基本原理1.将线性方程组化为增广矩阵形式;2.通过行变换将增广矩阵转化为上三角矩阵;3.从最后一行开始,逐行回代求解未知数;4.得到方程组的解。
二、高斯消元法的详细步骤1.初始化:将线性方程组转化为增广矩阵形式;2.主元选取:选取当前列中绝对值最大的元素作为主元,通过行交换将主元移到当前行的对角线位置;3.消元过程:利用主元将当前列下方的元素消为零;4.上三角矩阵:重复执行主元选取和消元过程,直到将增广矩阵转化为上三角矩阵;5.回代求解:从最后一行开始,逐行回代求解未知数。
三、高斯消元法的优点1.算法简单:高斯消元法的步骤清晰明确,易于实现;2.稳定性好:高斯消元法可以稳定地求解非奇异矩阵的线性方程组;3.适用范围广:高斯消元法可以用于求解任意大小的线性方程组。
四、高斯消元法的缺点1.数值稳定性问题:当矩阵的主元非常小的时候,高斯消元法可能造成数值不稳定性,导致计算误差增大;2.增加计算时间和空间:高斯消元法的计算复杂度较高,当矩阵规模较大时,计算时间和内存消耗也会相应增加;3.对特殊矩阵的适应性不强:高斯消元法在处理具有稀疏矩阵或者特殊结构矩阵时,效率不高。
五、实验结果及分析1.通过实验验证了高斯消元法的正确性和有效性;2.分析了在一些特殊情况下,高斯消元法可能会遇到的问题;3.对使用高斯消元法解决线性方程组的实际应用进行了探讨;4.对高斯消元法与其他求解线性方程组的方法进行了比较分析;5.提出了可能的改进方向,以提升高斯消元法的效率和稳定性。
总结:本实验报告基于高斯消元法的原理和步骤,详细阐述了高斯消元法在解决线性方程组中的应用。
C++实验报告高斯消元法
高斯肖元法C++上机实验报告学生姓名: 学 号: 专业班级: 实验类型: 综合一 实验项目名称全选主元高斯消去法解线性方程组 二 实验原理设有n 元线性方程组(考虑便于C++程序数组表示,方程的下标从0开始),0000110,1100000110,111101,111,111n n n n n n n n n n a x a x a x b a x a x a x b a x a x a x b ---------+++=⎧⎪+++=⎪⎨⎪⎪+++=⎩写为矩阵形式为Ax=b,其中A 为线性方程组的系数矩阵,x 为列向量,是方程组的解,b 也是列向量.一般来讲,可以假定矩阵A 是非奇异阵。
(n 阶矩阵A 的行列式不为零,即 |A|≠0,则称A 为非奇异矩阵)00010,10111,1,01,11,1n n n n n n a a a a a a A a a a ----⎡⎤⎢⎥⎢⎥=⎢⎥⎢⎥⎣⎦,011n x x x x -⎡⎤⎢⎥⎢⎥=⎢⎥⎢⎥⎣⎦ ,011n b b b b -⎡⎤⎢⎥⎢⎥=⎢⎥⎢⎥⎣⎦将系数矩阵A 和向量b 放在一起,形成增广矩阵B :00010,010111,11,01,11,11(,)n n n n n n n a a a b a a a b b A b a a a b -----⎡⎤⎢⎥⎢⎥==⎢⎥⎢⎥⎣⎦全选主元消去就在矩阵B 上进行,整个过程分为如下两个步骤: 第一步:消去过程。
对于k 从0开始到n-2结束,进行以下三步。
1. 首先,从系数矩阵A 的k 行k 列开始的子矩阵中选取绝对值最大的元素作为主元素。
例如:11,max 0i j ij k i n k j na a ≤<≤<=≠然后交换B的第k行与第1i行,第k列与第1k列,这样,这个子矩阵中具有最大绝对值的元素被交换到k行k列的位置上.2.其次,进行归一化计算。
计算方法为:/,1,,1/kj kj kkk k kka a a j k nb b a==+-⎧⎪⎨=⎪⎩3.最后进行消去计算:,,1,,1,1,,1 ij ij ik kji i ik ka a a a j i k nb b a b i k n=-=+-⎧⎪⎨=-=+-⎪⎩第二步,回带过程:111,111/,2,,1,0 n n n nni i ij jj ix b ax b a x i n-----=+=⎧⎪⎨=-=-⎪⎩∑三代码的实现整个程序分为5个独立文件,Matrix.h文件中包括矩阵类Matrix的定义,Matrix.cpp文件中包括该类成员函数的实现,LinearEqu.h文件中包括线性方程组类LinearEqu的定义,LinearEqu.cpp文件中包括该类的成员函数实现文件;7-9.cpp文件包括程序的主函数,主函数中定义了一个类LinearEqu的对象,通过这个对象求解一个四元线性方程组。