计算方法实验报告_列主元高斯消去法

合集下载

高斯列主元消去法实验报告

高斯列主元消去法实验报告

《数值计算方法》实验报告专业:年级:学号:姓名:成绩:1.实验名称实验2高斯列主元消去法2. :用Gauss列主消去法求解线性方程组0.001*X1+2.000*X2+3.000*X3=1.000-1.000*X1+3.217*X2+4.623*X3=2.000-2.000*X1+1.072*X2+5.643*X3=3.0003.实验目的a.熟悉运用已学的数值运算方法求解线性方程—Gauss列主消去法;b.加深对计算方法技巧的认识,正确使用计算方法来求解方程;c.培养用计算机来实现科学计算和解决问题的能力。

4.基础理论列主元消去法:a.构造增广矩阵b.找到每列绝对值的最大数;c.行变换;d.消去;e.回代5.实验环境Visual C++语言6.实验过程实现算法的流程图:7.结果分析a.实验结果与理论一致;b.由于数值设置成双精度浮点型,所以初值对计算结果影响不大;c.运用程序能更好的实现计算机与科学计算的统一和协调。

8. 附录程序清单#include<stdio.h>#include<math.h>int main(){int n=3,i,j,k,p;double a[4][4];double b[4];double x[4];double m[4][4];double temp;a[1][1]=0.001; a[1][2]=2.000; a[1][3]=3.000; b[1]=1.000;a[2][1]=-1.000; a[2][2]=3.1712; a[2][3]=2.000; b[2]=2.000;a[3][1]=-2.000; a[3][2]=1.072; a[3][3]=5.643; b[3]=3.000;for(i=1;i<=n-1;i++){temp=a[i][i];p=i;for(j=i+1;j<=n;j++)if(fabs(a[j][i])>temp){temp=a[j][i];p=j;}if(temp==0)return 0;if(p!=i) //换行{for(j=1;j<=n;j++)a[0][j]=a[i][j];for(j=1;j<=n;j++)a[i][j]=a[p][j];for(j=1;j<=n;j++)a[p][j]=a[0][j];b[0]=b[i];b[i]=b[p];b[p]=b[0];}for(j=i+1;j<=n;j++){m[j][i]=a[j][i]/a[i][i];for(k=i;k<=n;k++)a[j][k]=a[j][k]-m[j][i]*a[i][k];}}if(a[n][n]==0)return 0;x[n]=b[n]/a[n][n];for(i=n-1;i>=1;i--)//回代{temp=0;for(j=i+1;j<=n;j++)temp=temp+a[i][j]*x[j];temp=b[i]-temp;x[i]=temp/a[i][i];}for(i=1;i<=n;i++)//输出结果{printf("输出结果为:x[%d]=%lf ",i,x[i]);}printf("\n");return 0;}。

数值分析计算方法实验报告

数值分析计算方法实验报告
break;
end;
end;
X=x;
disp('迭代结果:');
X
format short;
输出结果:
因为不收敛,故出现上述情况。
4.超松弛迭代法:
%SOR法求解实验1
%w=1.45
%方程组系数矩阵
clc;
A=[2,10,0,-3;-3,-4,-12,13;1,2,3,-4;4,14,9,-13]
b=[10,5,-2,7]'
b=[10,5,-2,7]'
[m,n]=size(A);
if m~=n
error('矩阵A的行数和列数必须相同');
return;
end
if m~=size(b)
error('b的大小必须和A的行数或A的列数相同');
return;
end
if rank(A)~=rank([A,b])
error('A矩阵的秩和增广矩阵的秩不相同,方程不存在唯一解');
3.实验环境及实验文件存档名
写出实验环境及实验文件存档名
4.实验结果及分析
输出计算结果,结果分析和小结等。
解:1.高斯列主元消去法:
%用高斯列主元消去法解实验1
%高斯列主元消元法求解线性方程组Ax=b
%A为输入矩阵系数,b为方程组右端系数
%方程组的解保存在x变量中
format long;
A=[2,10,0,-3;-3,-4,-12,13;1,2,3,-4;4,14,9,-13]
return;
end
c=n+1;
A(:,c)=b;
for k=1:n-1

计算方法-实验三列主元高斯消去法

计算方法-实验三列主元高斯消去法

计算方法课程设计报告实验三高斯列主元消去法姓名:黄仁化学号:031010151551017班级:计算机科学与技术2004班日期:二○○六年六月十日一、实验目的:1、掌握高斯消去法的基本思路和迭代步骤。

2、 培养编程与上机调试能力。

二、高斯列主元消去法的基本思路与计算步骤:列主元高斯消去法计算步骤:将方程组用增广矩阵[]()(1)ij n n B A b a ⨯+==表示。

步骤1:消元过程,对1,2,,1k n =-(1) 选主元,找{},1,,k i k k n ∈+使得,max k i k ikk i n a 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/ni i n ij j ii j i x a a x a +=+⎛⎫=-⎪⎝⎭∑三:程序流程图四:程序清单:function X=uptrbk(A,b)% A 是一个n 阶矩阵。

% b 是一个n 维向量。

% X 是线性方程组AX=b 的解。

[N N]=size(A);X=zeros(1,N+1);Aug=[A b];for p=1:N-1[Y,j]=max(abs(Aug(p:N,p)));C=Aug(p,:);Aug(p,:)=Aug(j+p-1,:);Aug(j+p-1,:)=C;if Aug(p,p)==0'A是奇异阵,方程无惟一解'breakendfor k=p+1:Nm=Aug(k,p)/Aug(p,p);Aug(k,p:N+1)=Aug(k,p:N+1)-m*Aug(p,p:N+1);endend% 这里用到程序函数backsub来进行回代。

列主元高斯消去法和列主元三角分解法解线性方程

列主元高斯消去法和列主元三角分解法解线性方程

计算方法实验报告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)用高斯列主元消元法求解下面的方程组#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;}。

高斯消去算法实验报告

高斯消去算法实验报告

高斯消去算法实验报告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。

数值分析实验报告高斯消元法和列主消元法

数值分析实验报告高斯消元法和列主消元法

《计算方法》实验指导书 实验三、高斯消元法和列主消元法一、实验目的:1. 通过matlab 编程解决高斯消元发和列主消元发来解方程组的问题, 加强编程能力和编程技巧,要熟练应用matlab 程序来解题,练习从数值分析的角度看问题进而来解决问题。

更深一步体会这门课的重要性,练习动手能力,同时要加深对数值问题的理解,要熟悉matlab 编程环境。

二、实验要求:用matlab 编写代码并运行高斯消元法和列主消元发来解下面的方程组的问题,并算出结果。

三、实验内容:用高斯消元法和列主消元法来解题。

1.实验题目:用高斯消元法和列主消元法来解下列线性方程组。

⎪⎪⎩⎪⎪⎨⎧−=+−−−=+−−=+−−=−+−.142,16422,0,13143214321432432x x x x x x x x x x x x x x x 2.实验原理高斯消元法:就是把方程组变成上三角型或下三角形的解法。

上三角形是从下往上求解,下三角形是从上向下求解,进而求得结果。

而列主消元法是和高斯消元法相类似,只不过是在开始的时候找出x1的系数的最大值放在方程组的第一行,再化三角形再求解。

3.设计思想高斯消元法:先把方程组的第一行保留,再利用第一行的方程将其余几行的含有x1的项都消去,再保留第二行,同理利用第二行的方程把第二行以下的几行的含有x2项的都消去,以此类推。

直到最后一行只含有一个未知数,化为上三角形,求得最后一行的这个未知数的值,再回带到倒数第二个方程求出另一个解,再依次往上回带即可求出这个方程组的值。

而列主消元法与高斯消元法类似,只不过在最开始时找出x1项系数的最大值与第一行交换再进行与高斯算法相似的运算来求出方程组的解。

4.源代码高斯消元法的程序:f unction [RA,RB,n,X]=gaus(A,b)B=[A b]; n=length(b); RA=rank(A);RB=rank(B);zhica=RB-RA;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-1for 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('请注意:因为RA=RB<n,所以此方程组有无穷多解.')endend在工作窗口输入程序:A=[1 -1 1 -3; 0 -1 -1 1;2 -2 -4 6;1 -2 -4 1];b=[1;0; -1;-1]; [RA,RB,n,X] =gaus (A,b)请注意:因为RA=RB=n,所以此方程组有唯一解.运行结果为:RA =4RB =4n =4X =-0.50000.5000.列主消元发的程序:function [RA,RB,n,X]=liezhu(A,b)B=[A b]; n=length(b); RA=rank(A);RB=rank(B);zhica=RB-RA;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('请注意:因为RA=RB<n,所以此方程组有无穷多解.')endend在工作窗口输入程序:A=[1 -1 1 -3; 0 -1 -1 1;2 -2 -4 6;1 -2 -4 1];b=[1;0; -1;-1]; [RA,RB,n,X]=liezhu(A,b)请注意:因为RA=RB=n,所以此方程组有唯一解.运行结果为:RA =4RB =4n =4X =-0.50000.5000实验体会:通过这次实验我了解了高斯消元法和列主消元方法的基本思想,虽然这两个程序的编写是有点困难的,但运行起来还是比较容易的,解决了不少实际问题的计算。

数值分析实验报告(包括高斯消去、二分法、牛顿迭代法)

数值分析实验报告(包括高斯消去、二分法、牛顿迭代法)
N=input('please enter the largest number of iterations:N=');
for k=1:N
x=(a+b)/2;
fx=feval(f,x);fa=feval(f,a);
if abs((b-a)/2)<e || abs(fx)<e
disp('the number of iterations is');k
f=input('please enter a function:f(x)=');
x0=input('please enter the initial value:x0=');
e=input('please enter error:e=');
N=input('please enter the largest number of iterations:N=');
disp('the approximate solution is');x
disp('f(x) is');fx
disp('the number of iterations is');k
return
else
x0=x;
end
end
end
disp('The maximum number of iterations is reached, stop calculation');
开课学院、实验室:实验时间:2014年1月1日
课程
名称
数值分析基础性实验
实验项目
名称
数值计算算法及实现

高斯消元实验报告

高斯消元实验报告

实验报告一Gauss消去法求解线性方程组实验一、实验内容分别用顺序Gauss消去法和列选主元gauss消去法求解方程组=二.算法原理对一般的形如的线性方程组,记增广矩阵.Guass消去法包括消元过程和回代过程,消去过程实际上是把通过有限步的初等变换(即把的某行的一个倍数加到另一行或变换的某两行),最终化成上三角阵,图示如下:而回带过程是自下而上求解上三角方程组在消元过程中将扔放在的位置上,具体算法过程(不做行交换的消元):三、变量说明:n 方程组的阶数.A[3][3] 系数矩阵A.B[3] 常数项Bm[3][3] 经过Guass消元法后的系数矩阵i,j,k 随机变动量x[3] 3个变量X1,X2,X3四.程序设计#include<stdio.h>#include<math.h>main(){int n=3,i,j,k=0;doubleA[3][3]={{0.2641,0.1735,0.8642},{0.9411,-0.0175,0.1463},{-0.8641,-0.4243,0.0711}};double B[3]={-0.7521,0.6310,0.2501};double m[3][3];double X[3]={0,0,0};double s;for(k=0;k<=n-1;k++){for(i=k+1;i<n;i++){m[i][k]=A[i][k]/A[k][k];for(j=k+1;j<n;j++)A[i][j]=A[i][j]-m[i][k]*A[k][j];B[i]=B[i]-m[i][k]*B[k];}}for(i=n-1;i>=0;i--){s=0;for(j=i;j<n;j++)s+=A[i][j]*X[j];X[i]=(B[i]-s)/A[i][i];}for(i=0;i<3;i++)printf("%f\n",X[i]);}五.上机结果六.上机体会。

高斯消元法与列主元消去法实验报告

高斯消元法与列主元消去法实验报告

实验报告:Gauss消元法小组成员:李岚岚、邱粉珊、缪晓浓、杨水清学号:0917020040、0917010078、0917010073、0917010112一、实验问题编写两个程序,分别利用Gauss消元法和列主元消去法求解方程组二、分析及其计算过程Gauss顺序消元法:源程序:function [x]=gaussl(A,b)[n1,n2]=size(A);n3=size(b);if n1~=n2|n2~=n3|n1~=n3disp('A的行和列的维数不同!');return;endif det(A)==0disp('系数矩阵A奇异');return;end%消元过程L=eye(n1);for j=2:n1for i=j:n1L(i,j-1)=A(i,j-1)/A(j-1,j-1);A(i,:)=A(i,:)-L(i,j-1)*A(j-1,:);b(i)=b(i)-L(i,j-1)*b(j-1);endend%回代过程x(n1)=b(n1)/A(n1,n1);for t=n1-1:-1:1for k=n1:-1:t+1b(t)=b(t)-A(t,k)*x(k);endx(t)=b(t)/A(t,t);end程序的运行以及结果:>>A=[1 2/3 1/3;9/20 1 11/20;2/3 1/3 1];>>b=[2 2 2];>> [x]=gaussl(A,b)x =1 1 1Gauss列主元消去法:源程序:function [x]=gaussll(A,b) [n1,n2]=size(A);n3=size(b);if n1~=n2|n1~=n3|n2~=n3disp('输入的方程错误!');return;endif det(A)==0disp('系数矩阵A奇异');return;endmax=zeros(n1);for m=1:n1%找主元for i=m:n1if abs(A(i,m))>maxmax=A(i,:);A(i,:)=A(m,:);A(m,:)=max;maxb=b(i);b(i)=b(m);b(m)=maxb;endend%消元过程L=eye(n1);for j=2:n1for i=j:n1L(i,j-1)=A(i,j-1)/A(j-1,j-1);A(i,:)=A(i,:)-L(i,j-1)*A(j-1,:);b(i)=b(i)-L(i,j-1)*b(j-1);endendend%回代过程x(n1)=b(n1)/A(n1,n1);for t=n1-1:-1:1for k=n1:-1:t+1b(t)=b(t)-A(t,k)*x(k);endx(t)=b(t)/A(t,t);end程序的运行以及结果:>>A=[-0.002 2 2;1 0.78125 0;3.996 5.5625 4]; >>b=[0.4 1.3816 7.4178];>>[x]= gaussll(A,b)x =1.9273 -0.6985 0.9004。

高斯消去实验报告分析

高斯消去实验报告分析

一、实验背景高斯消去法(Gaussian Elimination)是线性代数中解决线性方程组的重要方法之一。

它通过初等行变换将系数矩阵化为行阶梯形矩阵,从而求解线性方程组。

本实验旨在通过编写程序实现顺序高斯消去法和列主元高斯消去法,并对比分析两种方法的计算效率和精度。

二、实验目的1. 理解高斯消去法的原理和步骤。

2. 编写程序实现顺序高斯消去法和列主元高斯消去法。

3. 比较两种方法的计算效率和精度。

4. 分析高斯消去法的适用范围和局限性。

三、实验内容1. 顺序高斯消去法- 实现顺序高斯消去法,将系数矩阵化为行阶梯形矩阵。

- 求解线性方程组,得到未知数的解。

2. 列主元高斯消去法- 实现列主元高斯消去法,将系数矩阵化为行阶梯形矩阵。

- 求解线性方程组,得到未知数的解。

3. 比较两种方法- 对比两种方法的计算效率和精度。

- 分析两种方法的优缺点。

四、实验步骤1. 编写程序- 使用C/C++、Python等编程语言编写顺序高斯消去法和列主元高斯消去法程序。

- 程序应包含以下功能:- 输入线性方程组的系数矩阵和常数项。

- 实现顺序高斯消去法和列主元高斯消去法。

- 输出求解结果。

2. 测试程序- 使用一组已知线性方程组测试程序的正确性。

- 验证求解结果与精确解是否一致。

3. 比较分析- 使用不同的线性方程组测试两种方法的计算效率和精度。

- 比较两种方法的运行时间、解的精度和误差。

五、实验结果与分析1. 顺序高斯消去法- 计算效率:顺序高斯消去法的时间复杂度为O(n^3),其中n为方程组中未知数的个数。

- 精度:顺序高斯消去法可能会受到舍入误差的影响,导致求解结果与精确解存在一定的误差。

2. 列主元高斯消去法- 计算效率:列主元高斯消去法的时间复杂度同样为O(n^3),但通过选择主元,可以减少舍入误差,提高求解精度。

- 精度:列主元高斯消去法具有更高的精度,求解结果与精确解更接近。

3. 比较分析- 顺序高斯消去法和列主元高斯消去法在计算效率上基本相同,但列主元高斯消去法具有更高的精度。

数值分析实验报告--列主元高斯消去

数值分析实验报告--列主元高斯消去

2、用列主元高斯消去法解线性方程组b =Ax .⑴ ⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡--34.981.4987.023.116.427.199.103.601.3⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡321x x x =⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡111 ⑵ ⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡--34.981.4990.023.116.427.199.103.600.3⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡321x x x =⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡111 分别输出A b A det ,,,解向量x ,(1)中A 的条件数。

分析比较(1)(2)的计算结果。

程序1(列主元高斯消去解线性方程组):#include<stdio.h>#include<math.h>#define n 3void LZYGSXQ(double a[n][n],double b[n]){double x[3],L,max,det=1;int r,t,i,j,k;for(k=0;k<n-1;k++) //选组员{{max=fabs(a[k][k]);r=k;}for(i=k+1;i<n;i++){if(fabs(a[i][k])>max)r=i;for(t=k;t<n;t++){L=a[k][t];a[k][t]=a[r][t];a[r][t]=L;}L=b[k];b[k]=b[r];b[r]=L;det=-det;}for(i=k+1;i<n;i++) //高斯消去{L=a[i][k]/a[k][k];for(j=k;j<n;j++){a[i][j]=a[i][j]-L*a[k][j];}b[i]=b[i]-L*b[k];}det=a[k][k]*det;}det=a[k][k]*det;printf("高斯消去后的方程系数\n"); //输出高斯消去后的系数矩阵for(i=0;i<n;i++){for(j=0;j<n;j++){printf("%f ",a[i][j]);}printf("%f ",b[i]);printf("\n");}printf("\n");printf("行列式的值det=%f\n",det);x[n-1]=b[n-1]/a[n-1][n-1];for(i=n-2;i>=0;i--){ //回代求解xfor(j=i+1;j<n;j++)b[i]=b[i]-a[i][j]*x[j];x[i]=b[i]/a[i][i];}printf("方程的解向量=(");for(i=0;i<=n-1;i++)printf("%f ",x[i]);printf(")\n");}void main(){double a1[3][3]={{3.01,6.03,1.99},{1.27,4.16,-1.23},{0.987,-4.81,9.34}},b1[3]={1,1,1};double a2[3][3]={{3.00,6.03,1.99},{1.27,4.16,-1.23},{0.987,-4.81,9.34}},b2[3]={1,1,1};LZYGSXQ(a1,b1);printf("\n\n\n");LZYGSXQ(a2,b2);}计算结果:方程组(1)的解向量为),,493.617725-631.911376-51592.59962(1=x ,方程组(2)的解向量为)644123.41-336653.53163940.135(2,,=x 。

列主元高斯消去法实验报告

列主元高斯消去法实验报告
a[i][j]=a[i][j]-l*a[k][j];
}
}
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)方程组的矩阵系数用二维数组表示,不用指针,且其值要求用输入语句输入。(数组形式的完成,经检查后,有能力的可以改用指针方式)

选列主元的高斯消去法实验报告2

选列主元的高斯消去法实验报告2

选列主元的高斯消去法实验报告令狐烈一,实验目的:(1)掌握gauss消去法的基本算法思想和学会编写其MATLAB代码。

(2)掌握选列主元的gauss消去法的基本算法思想和学会编写其MATLAB代码。

(3)分析选列主元的gauss消去法相比于gauss消去法的优点。

(4)对选列主元的gauss消去法和gauss消去法进行误差分析二,实验原理对于非奇异矩阵A,求解线性方程组Ax=b可以使用gauss消去法进行。

但是,gauss消去法要求系数矩阵A的顺序主子式非奇异。

为此做出改进:每次消元之前,首先选出第i列(i<=k)中最大的作为列主元,这样,就能保证消元乘数不仅不被系数矩阵A的顺序主子式非奇异的限制,还这样就能有效的防止误差的传播与放大。

算法:(1)对增广矩阵[a b]进行第i次消元,首先选取列主元a(i,k)=Max|a(I,i:n),交换第i行与第k行;(2)以列主元进行消元,计算公式为a(k,i)= a(k,i)/a(i,i); (k=i+1:n)a(k,j)=a(k,j)-a(k,i)*a(i,j); (j=i:n)(3)回代法计算结果,计算公式为:x(n)=b(n)/a(n,n);x(p)=[b(p)-∑a(p,j)x(j)]/a(p,p) (j=p+1:n)注:gauss(a,b)为选取列主元gauss消去法,gauss2(a,b)为gauss消去法。

三,实验MATLAB程序代码实验的MATLAB程序代码如下四,实验结果与分析1,两种算法对系数矩阵的顺序主子式奇异线性方程的效果分析实验结果(如图一)对于顺序主子式奇异的系数矩阵,使用gauss消去法(gauss2(a,b))不能解出,而使用选列主元的gauss消去法(gauss(a,b))能够解出。

主要是选列主元的gauss消去法每次都选出最大的列主元,从而保证了每次用作除数的a(I,i)≠0.图一:两种算法对系数矩阵的顺序主子式奇异线性方程的效果2,两种算法对舍入误差的放大效应分析用随机生成函数random('Normal',1,7,10,10)生成10*10矩阵,分别gauss消去法和选列主元的高斯消去法解出,并用公式er(x)=||x−x∗||||x||≤cond(a)∗||r||||b||估计其误差,结果如下图。

计算方法实验报告_列主元高斯消去法

计算方法实验报告_列主元高斯消去法
double row_first; //行首元素 //主对角元素单位化 for(int i=0;i<n;i++) {
row_first=A[i][i]; for(int j=0;j<n+1;j++)
计算方法实验报告
{ A[i][j]=A[i][j]/row_first;
} }
for(int k=n-1;k>0;k--) {
for(int i=0;i<N;i++) {
for(int j=0;j<N;j++) {
A_B[i][j]=A[i][j]; } A_B[i][N]=B[i][0]; } return A_B; }
3
//输出矩阵 A 的 row x col 个元素 void Show_Matrix(double **A,int row,int col) {
for(int i=0;i<N;i++)
{
int row=Choose_Colum_Main_Element(N,A_B,i);
if(Main_Element<=e) goto A_0;
Exchange(A_B,N+1,row,i);
Elimination(N,A_B,i);
cout<<"选取列主元后第"<<i+1<<"次消元:"<<endl;
double factor; for(int i=start+1;i<n;i++) {
factor=A[i][start]/A[start][start]; for(int j=start;j<n+1;j++) {

数值计算方法上机实验报告

数值计算方法上机实验报告

数值计算方法上机实验报告实验目的:复习和巩固数值计算方法的基本数学模型,全面掌握运用计算机进行数值计算的具体过程及相关问题。

利用计算机语言独立编写、调试数值计算方法程序,培养学生利用计算机和所学理论知识分析解决实际问题的能力。

上机练习任务:利用计算机基本C 语言编写并调试一系列数值方法计算通用程序,并能正确计算给定题目,掌握调试技能。

掌握文件使用编程技能,如文件的各类操作,数据格式设计、通用程序运行过程中文件输入输出运行方式设计等。

一、各算法的算法原理及计算机程序框图1. 列主元高斯消去法算法原理:高斯消去法是利用现行方程组初等变换中的一种变换,即用一个不为零的数乘一个方程后加只另一个方程,使方程组变成同解的上三角方程组,然后再自下而上对上三角方程组求解。

列选住院是当高斯消元到第k 步时,从k 列的kk a 以下(包括kk a )的各元素中选出绝对值最大的,然后通过行交换将其交换到kk a 的位置上。

交换系数矩阵中的两行(包括常数项),只相当于两个方程的位置交换了,因此,列选主元不影响求解的结果。

●源程序:#define N 200#include "stdio.h"#include "math.h"FILE *fp1,*fp2;void LZ(){int n,i,j,k=0,l;double d,t,t1;static double x[N],a[N][N];fp1=fopen("a1.txt","r");fp2=fopen("b1.txt","w");fscanf(fp1,"%d",&n);for(i=0;i<n;++i)for(j=0;j<=n;++j){fscanf(fp1,"%lf",&a[i][j]);}{d=a[k][k];l=k;i=k+1;do{if(fabs(a[i][k])>fabs(d)) /*选主元*/{d=a[i][k];l=i;}i++;}while(i<n);if(d==0){printf("\n输入矩阵有误!\n");}else{ /*换行*/if(l!=k){for(j=k;j<=n;j++){t=a[l][j];a[l][j]=a[k][j];a[k][j]=t;}}}for(j=k+1;j<=n;j++) /*正消*/ a[k][j]/=a[k][k];for(i=k+1;i<n;i++)for(j=k+1;j<=n;j++)a[i][j]-=a[i][k]*a[k][j];k++;}while(k<n);if(k!=0){for(i=n-1;i>=0;i--) /*回代*/ {t1=0;for(j=i+1;j<n;j++)t1+=a[i][j]*x[j];x[i]=a[i][n]-t1;}for(i=0;i<n;i++)fprintf(fp2,"\n 方程组的根为x[%d]=%lf",i+1,x[i]); fclose(fp1); fclose(fp2); }main() { LZ(); }● 具体算例及求解结果:用列选主元法求解下列线性方程组⎪⎩⎪⎨⎧=++=++=-+28x x 23x 2232832321321321x x x x x x 输入3 输出结果:方程组的根为x[1]=6.0000001 2 -3 8 方程组的根为x[2]=4.000000 2 1 3 22 方程组的根为x[3]=2.000000 3 2 1 28● 输入变量、输出变量说明:输入变量:ij a 系数矩阵元素,i b 常向量元素 输出变量:12,,n b b b 解向量元素2. 杜里特尔分解法解线性方程● 算法原理:求解线性方程组Ax b =时,当对A 进行杜里特尔分解,则等价于求解LUx b =,这时可归结为利用递推计算相继求解两个三角形(系数矩阵为三角矩阵)方程组,用顺代,由Ly b =求出y ,再利用回带,由Ux y =求出x 。

计算方法实验报告(2)----Gauss列主元法

计算方法实验报告(2)----Gauss列主元法

计算方法实验报告实验名称:班级:学生姓名:学号:班级序号:课内序号:指导老师:2018-2019学年第2学期一、实验名称:Gauss消去法二、实验学时: 2学时三、实验目的和要求1、掌握高斯列主元法基础原理2、掌握高斯列主元法解方程组的步骤3、能用程序语言对Gauss列主元法进行编程实现四、实验过程代码及结果1、代码:using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace ConsoleApplication_Gauss{public class GaussBase{private double[,] a;public double[,] A{get { return a; }set { a = value; }}private double[] x;public double[] X{get { return x; }set { x = value; }}public int n;public void CalcuX(){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];}}public virtual void CalcuA(){}public void Output(){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();}}public void Output(bool isX){Console.WriteLine("------最终的解为:----------");for (int i = 0; i < n; i++){Console.WriteLine("x[{0}]={1}", i, x[i]);}}public void Input(){Console.WriteLine("请输入方程阶数N:");n = int.Parse(Console.ReadLine());a = new double[n, n + 1];x = new double[n];Console.WriteLine("请输入方程系数A(i,j):");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]);}}}public void Calcu(){//Input();Console.WriteLine("------原始的矩阵为:----------");Output();CalcuA();Console.WriteLine("------应用高斯列主元法消元之后的矩阵A(i,j)为:----------");Output();CalcuX();Output(true);}public class GaussCol : GaussBase{public int FindMaxCol(int k){int ik = k;for (int i = k; i < n; i++){if (Math.Abs(A[i, k]) > Math.Abs(A[ik, k])){ik = i;}}if (A[ik, k] == 0) return -1;if (ik != k){for (int j = k; j <= n; j++){double t = A[ik, j];A[ik, j] = A[k, j];A[k, j] = t;}}return ik;}public override void CalcuA(){for (int k = 0; k < n - 1; k++){//-----------------------------------------int ik = FindMaxCol(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}}}class Program{static void Main(string[] args){GaussBase obj = new GaussCol();obj.Input();obj.Calcu();Console.ReadLine();}}}}2、结果:。

计算方法数值实验报告

计算方法数值实验报告

计算方法数值实验报告(一)班级:0902 学生:苗卓芳 倪慧强 岳婧实验名称: 解线性方程组的列主元素高斯消去法和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 及解向量。

①先求解第一个线性方程组⎪⎪⎪⎭⎫ ⎝⎛=⎪⎪⎪⎭⎫ ⎝⎛⎪⎪⎪⎭⎫ ⎝⎛--11134.981.4987.023.116.427.199.103.601.3321x x x在命令窗口中运行A=[3.01,6.03,1.99;1.27,4.16,-1.23;0.987,-4.81,9.34] 可得A =3.0100 6.0300 1.99001.2700 4.1600 -1.23000.9870 -4.8100 9.3400b=[1,1,1]可得b =1 1 1H =det(A)可得 H =-0.0305列主元高斯消去法:在命令窗口中运行function x=Gauss_pivot(A,b)、A=[3.01,6.03,1.99;1.27,4.16,-1.23;0.987,-4.81,9.34];b=[1,1,1];n=length(b);x=zeros(n,1);c=zeros(1,n);dl=0;for i=1:n-1max=abs(A(i,i));m=i;for j=i+1:nif max<abs(A(j,i))max=abs(A(j,i));m=j;endendif(m~=i)for k=i:nc(k)=A(i,k);A(i,k)=A(m,k);A(m,k)=c(k);enddl=b(i);b(i)=b(m);b(m)=dl;endfor k=i+1:nfor j=i+1:nA(k,j)=A(k,j)-A(i,j)*A(k,i)/A(i,i);endb(k)=b(k)-b(i)*A(k,i)/A(i,i);A(k,i)=0;endendx(n)=b(n)/A(n,n);for i=n-1:-1:1sum=0;for j=i+1:nsum =sum+A(i,j)*x(j);endx(i)=(b(i)-sum)/A(i,i);end经程序可得实验结果ans =1.0e+003 *1.5926-0.6319-0.4936LU分解法:在命令窗口中运行function x=lu_decompose(A,b)A=[3.01,6.03,1.99;1.27,4.16,-1.23;0.987,-4.81,9.34];b=[1,1,1];L=eye(n);U=zeros(n,n);x=zeros(n,1);c=zeros(1,n);for i=1:nU(1,i)=A(1,i);if i==1;L(i,1)=1;elseL(i,1)=A(i,1)/U(1,1);endendfor i=2:nfor j=i:nsum=0;for k=1:i-1sum =sum+L(i,k)*U(k,j);endU(i,j)=A(i,j)-sum;Ifj~=nsum=0;for k=1:i-1sum=sum+L(j+1,k)*U(k,i);endL(j+1,i)=(A(j+1,i)-sum)/U(I,i);endendendy(1)=b(1);for k=2:nsum=0;forj=1:k-1sum=sum+L(k,j)*y (j);endy(k)=b(k)-sum;endx(n)=y(n)/U(n,n);260页最后一行c(k)=A(i,k);A(i,k)=A(m,k);A(m,k)=c(k);enddl=b(i);b(i)=b(m);b(m)=dl;endfor k=i+1:nfor j=i+1:nA(k,j)=A(k,j)-A(i,j)*A(k,i)/A(i,i);endb(k)=b(k)-b(i)*A(k,i)/A(i,i);A(k,i)=0;endendx(n)=b(n)/A(n,n);for i=n-1:-1:1sum=0;for j=i+1:nsum =sum+A(i,j)*x(j);endx(i)=(b(i)-sum)/A(i,i);end经程序可得结果ans =1.0e+003 *1.5926-0.6319-0.4936②再求解第二个线性方程组⎪⎪⎪⎪⎪⎭⎫ ⎝⎛=⎪⎪⎪⎪⎪⎭⎫ ⎝⎛⎪⎪⎪⎪⎪⎭⎫ ⎝⎛----15900001.582012151526099999.23107104321x x x x 即A=[10,-7,0,1;-3,2.099999,6,2;5,-1,5,-1;2,1,0,2];b=[8,5.900001,5,1];重复上述步骤可的结果为ans =0.0000-1.00001.00001.0000(2)将方程组(1)中系数3.01改为3.00,0.987改为0.990,用列主元高斯消去法求解变换后的方程组,输出列主元行交换次序,解向量x 及detA ,并与(1)中结果比较。

高斯列主消元数值分析实验报告

高斯列主消元数值分析实验报告

数值分析实验报告之高斯列主消元法一、实验目的:清楚高斯列主元消去法与高斯主元素消去法的区别,以及它提出的必要性;掌握高斯列主元消去法的原理及推导过程,会用其解简单的线性方程组。

二、实验内容:用高斯列主元消去法解方程组⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡--643.5072.1000.2623.4712.3000.1000.3000.2001.0⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡321x x x =⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡000.3000.2000.1 三、实验原理:在采用高斯消去法解方程组时,小主元可能产生麻烦,即用其做除数,会导致其他元素数量级的严重增长和舍入误差的扩散,最终使得计算的解不可靠。

故应避免采用绝对值小的主元素。

在消元之前,选择一个绝对值最大的元素作为主元,用其做除数来进行消元,这样就具有较好的数值稳定性。

这就是选主元消去法。

下面详细说明列主元素消去法。

第一步:在Ax=b 即)1()1(b x A =的系数矩阵)1(A 的第一列元素中选择一个绝对值最大的元素,不妨设为)1(1l a 。

对调)1(1j a 和)1(lj a 及)1(1b 和)1(l b (j=1,2,……,n ,1≤l ≤n)。

以)1(1l a 作为新的)1(11a 进行消元(消去对调后的第2~n 个方程中的1x )。

第k 步:(1≤k ≤n-1)设第k-1步消元过程完成,得到)()(k k b x A =,检查)(k A 中第k 列的后n-k+1个元素)(k kk a ,)(1k k k a +,…,)(k nk a ,从中选出绝对值最大者,不妨设是)(k pk a ,称它为第k 列主元素。

若p=k ,则取)(k kk a 做除数直接进行消元。

若p ≠k,则将第p 个方程与第k 个方程对调,使)(k pk a 成为新的)(k kk a ,然后以其作为除数进行消元,继续这一过程,直至得到等价的三角形方程组)()(n n b x A =,下一阶段的回代过程不变。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
cin>>willgo; }while(willgo);
return 0; }
//以下部分是对前面声明的函数的具体实现,相应的功能参看前面声明部分
//初始化数据 void Init_Data() {
cout<<"请输入方程的阶数:"<<endl; cin>>N; while(N<=0) {
cout<<"请输入有效的方程阶数"<<endl; cin>>N; }
方程的阶数,需要更改程序。故而此处采用二维指针的方式实现,这样程序很灵活,可以实现动态指定求 解方程的阶数,但是同时也在一定程度上增加了程序的复杂程度。 (2) 关于“单位化”增广矩阵:其实这里 A_B=[A B],并非 NxN 的矩阵,本没有单位化一说,这里为了便于 表述特将 A_B 经过转换所得形如[E B’]的过程,成为矩阵[A B]的单位化,其他的类推。 (3) 本程序最后的求解并不是采用书上面回带的方式求的最后的根的,而是采用“单位化”增广矩阵的方式来 实现的,其本质和回带是一样的,只是为了便于程序最后结果的输出。 (4) 另外,本程序版权归本人所有。
其算法的设计思路如下:
1
对应的 C++程序源代码如下:
/* 编译环境 windows7 系统下 使用 visual studio 2010 使用 VC++6.0 可能会用少许不兼容,修改一下即可 Copyright of 唐禹 Edited in 2010/11/01 Builed in 2010/11/01 Version 1.1 */
计算方法实验报告
for(int j=0;j<N;j++) {
cin>>A[i][j]; } } cout<<"请输入矩阵 B:"<<endl; for(int i=0;i<N;i++) { cin>>B[i][0]; }
AUB(N,A,B,A_B);
}
//销毁数据 void Destroy_Data() {
for(int i=0;i<N;i++)
{
int row=Choose_Colum_Main_Element(N,A_B,i);
if(Main_Element<=e) goto A_0;
Exchange(A_B,N+1,row,i);
Elimination(N,A_B,i);
cout<<"选取列主元后第"<<i+1<<"次消元:"<<endl;
//增广矩阵中|B|~0,即方程解为任意解的情况 return -1;
}
//选取主元素,并返回主元所在的行 int Choose_Colum_Main_Element(int n,double**A,int start) {
int row=start; double max=abs(A[start][start]); for(int i=start;i<n;i++) {
/* 用于横向显示向量,N x 1 型 */
void Show_Result(int x/*表征解的个数/,int N);
int Gauss_Colum_Main_Element( int n, double **A, double **B, double e);
//方程阶数 //系数矩阵 // //精度控制
for(int i=0;i<N;i++) {
delete A[i]; delete B[i]; delete A_B[i]; delete X[i]; } delete A; delete B; delete A_B; delete X; }
//求增广矩阵 double** AUB(int N,double **A,double **B,double **A_B) {
{ if(x==0)
// Gauss_Colum_Main_Element 返回 0,无解
{ cout<<"由于消元过程中出现主元小于所设定的精度,且此时增广矩阵中 B!~0\n" <<"所以:方程无解"<<endl;
return ;
}
if(x==-1)
// Gauss_Colum_Main_Element 返回-1,为任意解
A=new double*[sizeof(double*)*N]; B=new double*[sizeof(double*)*1]; A_B=new double*[sizeof(double*)*(N+1)]; X=new double*[sizeof(double*)*1];
for(int i=0;i<N;i++) {
A[i]=new double[N]; B[i]=new double[1]; A_B[i]=new double[N+1]; X[i]=new double[1]; } cout<<"您选择了"<<N<<"阶方程组计算.\n 请输入系数矩阵 A(按行输入):"<<endl; for(int i=0;i<N;i++) {
if(max<abs(A[i][start]))
4
{ row=i; max=A[i][start];
} } Main_Element=max;
return row; }
//交换 L1,L2 行 void Exchange(double **A,int num_of_colum,int L1,int L2) {
2
/*主函数*/ int main() {
bool willgo; do {
Init_Data(); Show_Result(Gauss_Colum_Main_Element(N,A,B,0),N); cout<<"退出(0)还是继续求解其他方程组(1)?"<<endl; Destroy_Data();
double temp; for(int i=0;i<num_of_colum;i++) {
temp=A[L1][i]; A[L1][i]=A[L2][i]; A[L2][i]=temp; } }
//消元过程函数(消元其实点为 start,start) void Elimination(int n,double**A,int start) {
/* 确定列主元素所在行,并返回行号
*/
int Choose_Colum_Main_Element( int n, double**A,
//方程阶数 //系数矩阵
int start);
/* 交换矩阵 L1,L2 两行
*/
void Exchange(double **A,int num_of_colum,int L1,int L2);
double row_first; //行首元素 //主+) {
row_first=A[i][i]; for(int j=0;j<n+1;j++)
计算方法实验报告
{ A[i][j]=A[i][j]/row_first;
} }
for(int k=n-1;k>0;k--) {
double factor; for(int i=start+1;i<n;i++) {
factor=A[i][start]/A[start][start]; for(int j=start;j<n+1;j++) {
A[i][j]=A[i][j]-factor*A[start][j]; } } }
//回带求解,即“单位化”增广矩阵 double **Unitization(int n,double**A) {
double **X;
/*用于试验的方程组 {3,1,6};
A= {2,1,3}; {1,1,1};
B= {2,7,4}; 求的根为:X={19,-7,-8}; */
/* 为变量分配存储空间,初始化系数矩阵 */ void Init_Data();
/* 销毁变量空间 */ void Destroy_Data();
for(int i=0;i<k;i++) {
double factor=A[i][k]; for(int j=0;j<n+1;j++) {
A[i][j]=A[i][j]-factor*A[k][j]; }
} } return A; }
关于本段程序的说明: (1) 本程序对于方程组想系数矩阵不是采用默认的数组实现的,因为若采用数组实现则不能由使用者决定求解
int N, double **A, double**B,
//方程阶数 //系数矩阵 //
计算方法实验报告
double e)
//精度控制
{ cout<<endl<<"Ax=B 的增广矩阵为:"<<endl;
Show_Matrix(A_B,N,N+1); cout<<"解方程 Ax=B 的过程如下:"<<endl;
计 算 方 法 实 验 报 告
动力与机械学院 08 级自动化 3 班
唐禹 2008301470078
2010.11.08
相关文档
最新文档