1/8《数值分析》实验报告实验序号:实验二题目名称:列主元Gauss消元法解n阶线性代数方程组学号:姓名:任课教师:马季骕专业班级:计算机科学与技术(非师范)1、实验目的:用列主元Gauss消元法解n阶线性代数方程组编写一个程序实现用列主元消元法实现解方程组的问题。2、算法分析:其基本做法是把上述方程组通过列主元Gauss消元转化为一个等价的三角形方程组,然后再进行回代就可以求出方程组的解。列主元消元的基本做法是选取系数矩阵的每一列中绝对值最大的作为主元,然后采取和顺序Gauss消元法相同的步骤进行,求得方程组的解。1.列主元Gauss消元法的算法思想:1.输入系数矩阵A,右端项b,阶n。2.对k=1,2,…,n,循环:(a)按列选主元保存主元所在行的指标。(b)若a=0,则系数矩阵奇异,计算停止;否则,顺序进行。(c)若=k则转向(d);否则换行(d)计算乘子(e)消元:3.回代:用右端项b来存放解。3、实验分析:建立两个数组a和b,通过循环语句将n阶增广矩阵输入进去,通过对列的循环对每一列进行消去未知数,通过n小步n大步把矩阵化简成上三角形矩阵,最后通过迭代法解得方程组得解。3、函数分析:具体程序设计:2/8for(i=1;i=n;i++)//消元的第一重循环{p=0;q=0;for(m=i;mn+1;m++){if(pabs(a[m][i]))//比较选取列主元{p=abs(a[m][i]);//确定列主元q=m;//记录列主元所在的行序列号}}for(m=1;mn+1;m++)//交换系数{a[0][0]=a[q][m];//用a[0][0]做暂存单元a[q][m]=a[i][m];a[i][m]=a[0][0];}b[0]=b[q];//交换常数项,用b[0]做暂存单元b[q]=b[i];b[i]=b[0];for(t=i;t=n-1;t++)//具体的Gauss消元算法{w=a[t+1][i];for(j=i;j=n;j++){a[t+1][j]=a[t+1][j]-a[i][j]*(w/a[i][i]);}b[t+1]=b[t+1]-b[i]*(w/a[i][i]);}3/8k++;}for(i=n;i=1;i--)//回代过程{for(j=1;j=n;j++)v=a[i][j]*x[j]+v;x[i]=(b[i]-v)/a[i][i];v=0;}4、实验数据截频:4/85、程序说明:本程序在DevC++环境中编译运行并且通过测试,也可以在VC++6.0环境中编译运行。通过提示语句输入相应的系数矩阵和常数项。6:总结体会5/8列主元消元法和Gauss消元法的计算过程基本上是一样的,只是在每一次消元前要选取系数矩阵的列主元,然后把方程组做适当的行交换再进行消元运算,这就保证了舍入误差不扩散。列主元消元法克服了顺序Gauss消元的缺点,运算量也没有全主元消元法那么大,因此是解线性方程组的一种比较实用而且简单的方法。7:程序源代码:#includeiostream#includecmath#includeiomanipintconstN=100;usingnamespacestd;intmain(){intn,i,j,k,m,h,t,q;doublea[N][N],b[N],x[N],w,v,p;cout按Ctrl+C退出!endl;cout请输入矩阵的阶数:endl;while(cinn)//以下为数据输入,并显示所求方程{cout请输入系数矩阵:endl;for(i=1;i=n;i++){for(j=1;j=n;j++){cina[i][j];}6/8}cout请输入常数项:endl;for(i=1;i=n;i++)cinb[i];cout***************endl;cout您所要求的方程组为:endl;for(i=1;i=n;i++){intt=1;for(j=1;j=n;j++){couta[i][j]Xt++;if(j!=n)cout+;}cout=b[i]endl;}cout***************endl;k=1;for(i=1;i=n;i++)//消元的第一重循环{p=0;q=0;for(m=i;mn+1;m++){if(pabs(a[m][i])){p=abs(a[m][i]);q=m;}7/8}cout第k个列主元为第q行第i列的元素:;for(m=1;mn+1;m++)//交换系数{a[0][0]=a[q][m];a[q][m]=a[i][m];a[i][m]=a[0][0];}b[0]=b[q];//交换常数项b[q]=b[i];b[i]=b[0];couta[i][i]endl;cout第k个系数矩阵为:endl;//开始矩阵消元的过程for(m=1;m=n;m++){for(h=1;h=n;h++){coutsetiosflags(ios::left)setw(10)a[m][h];}coutendl;}cout第k个常数项为:endl;for(m=1;m=n;m++)coutb[m]endl;for(t=i;t=n-1;t++)//从此处开始时具体的消元算法{w=a[t+1][i];for(j=i;j=n;j++)8/8{a[t+1][j]=a[t+1][j]-a[i][j]*(w/a[i][i]);}b[t+1]=b[t+1]-b[i]*(w/a[i][i]);}cout***************endl;k++;}for(i=1;i100;i++)//从此处开始为回代过程x[i]=0;for(i=n;i=1;i--){for(j=1;j=n;j++)v=a[i][j]*x[j]+v;x[i]=(b[i]-v)/a[i][i];v=0;}cout该方程组的解为:endl;for(i=1;i=n;i++)//显示方程的解coutxi=x[i]endl;cout***************endl;cout按Ctrl+C退出!endl;cout请输入矩阵的阶数:endl;}system(pause);return0;}