您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 用高斯消去法解线性方程组。C++程序及结果
用高斯消去法解线性方程组。设有n元线性方程组如下:算法:对于k从0开始到n-2结束,进行以下步骤:首先,第k行第k列的数不能为0,若为0,则与下面不为0的行交换。将k行所有数除以第k行第k列的数.其次,进行消去:a[i][j]=a[i][j]-a[i][k]*a[k][j],j,i=k+1,k+2,…,n-1b[i]=b[i]-a[i][k]*b[k],i=k+1,k+2,……,n-1最后,回代过程x[n-1]=b[n-1]/a[n-1][n-1]x[i]=b[i]-∑a[i][j]x[j],I=n-2,…1,0定义一个矩阵类Matrix作为基类,然后由矩阵类派生出线性方程组类Linequ。程序清单:#includeiostream#includecmathusingnamespacestd;classMatrix//定义矩阵类{public:Matrix(intdims=2)//构造函数{index=dims;//保护数据赋值MatrixA=newdouble[index*index];//动态内存分配}~Matrix(){delete[]MatrixA;}//内存释放voidsetMatrix(double*rmatr)//设置矩阵值{for(inti=0;iindex*index;i++)a00x0+a01x1+…+a0,n-1xn-1=b0a10x0+a11x1+…+a1,n-1xn-1=b1…An-1,0x0+an-1,1x1+…+an-1,n-1xn-1=bn-1{*(MatrixA+i)=rmatr[i];}//矩阵成员赋初值}voidprintM();//显示矩阵protected:intindex;double*MatrixA;};classLinequ:publicMatrix//线性方程组类{public:Linequ(intdims=2):Matrix(dims){sums=newdouble[dims];solu=newdouble[dims];}~Linequ();voidsetLinequ(double*a,double*b);//方程赋值voidprintL();//显示方程intSolve();//高斯消元法求解voidshowX();//输出方程的解private:double*sums;double*solu;};voidMatrix::printM()//显示矩阵的元素{coutTheMatrixis:endl;for(inti=0;iindex;i++){for(intj=0;jindex;j++)cout*(MatrixA+i*index+j);coutendl;}}Linequ::~Linequ(){delete[]sums;delete[]solu;}voidLinequ::setLinequ(double*a,double*b)//方程赋值{setMatrix(a);for(inti=0;iindex;i++)sums[i]=b[i];}voidLinequ::printL()//显示方程{coutTheLineequtionis:endl;for(inti=0;iindex;i++){for(intj=0;jindex;j++)cout*(MatrixA+i*index+j);coutsums[i]endl;}}voidLinequ::showX()//输出方程的解{coutTheResultis:endl;for(inti=0;iindex;i++){coutX[i]=solu[i]endl;}}intLinequ::Solve()//解线性方程组{intl,k,i,j,is,p,q,m=0;doubled,t;l=1;for(k=0;k=index-2;k++)//消去过程{d=0.0;for(i=k;i=index-1;i++)for(j=k;j=index-1;j++){t=fabs(MatrixA[i*index+j]);if(td){d=t;is=i;}}if(d+1.0==1.0)l=0;if(l==0){coutfailendl;return(0);}d=MatrixA[k*index+k];if(d==0){m++;d=MatrixA[(k+m)*index+k];is=k+m;}if(is!=k){for(j=k;j=index-1;j++){p=k*index+j;q=is*index+j;t=MatrixA[p];MatrixA[p]=MatrixA[q];MatrixA[q]=t;}t=sums[k];sums[k]=sums[is];sums[is]=t;}d=MatrixA[k*index+k];for(j=k;j=index-1;j++){p=k*index+j;MatrixA[p]=MatrixA[p]/d;}sums[k]=sums[k]/d;for(i=k+1;i=index-1;i++){for(j=k+1;j=index-1;j++){p=i*index+j;MatrixA[p]=MatrixA[p]-MatrixA[i*index+k]*MatrixA[k*index+j];}sums[i]=sums[i]-MatrixA[i*index+k]*sums[k];}}d=MatrixA[(index-1)*index+index-1];if(fabs(d)+1.0==1.0){coutfailendl;return(0);}solu[index-1]=sums[index-1]/d;//回代过程for(i=index-2;i=0;i--){t=0.0;for(j=i+1;j=index-1;j++)t=t+MatrixA[i*index+j]*solu[j];solu[i]=sums[i]-t;}}intmain()//主函数{doublea[]={2,-0.5,-0.5,0,-0.5,2,0,-0.5,-0.5,0,2,-0.5,0,-0.5,-0.5,2};doubleb[4]={0,3,3,0};Linequequl(4);equl.setLinequ(a,b);equl.printL();if(equl.Solve())equl.showX();elsecoutFailendl;return0;}运行结果:
本文标题:用高斯消去法解线性方程组。C++程序及结果
链接地址:https://www.777doc.com/doc-6741898 .html