您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > c++解线性方程组的几种方法
//解线性方程组#includeiostream.h#includeiomanip.h#includestdlib.h//----------------------------------------------全局变量定义区constintNumber=15;//方程最大个数doublea[Number][Number],b[Number],copy_a[Number][Number],copy_b[Number];//系数行列式intA_y[Number];//a[][]中随着横坐标增加列坐标的排列顺序,如a[0][0],a[1][2],a[2][1]...则A_y[]={0,2,1...};intlenth,copy_lenth;//方程的个数doublea_sum;//计算行列式的值char*x;//未知量a,b,c的载体//----------------------------------------------函数声明区voidinput();//输入方程组voidprint_menu();//打印主菜单intchoose();//输入选择voidcramer();//Cramer算法解方程组voidgauss_row();//Gauss列主元解方程组voidguass_all();//Gauss全主元解方程组voidDoolittle();//用Doolittle算法解方程组intDoolittle_check(doublea[][Number],doubleb[Number]);//判断是否行列式0,若是,调整为顺序主子式全0voidxiaoqu_u_l();//将行列式Doolittle分解voidcalculate_u_l();//计算Doolittle结果double&calculate_A(intn,intm);//计算行列式doublequanpailie_A();//根据列坐标的排列计算的值,如A_y[]={0,2,1},得sum=a[0][A_y[0]]*a[1][A_y[1]]*a[2][A_y[2]]=a[0][0]*a[1][2]*a[2][1];voidexchange(intm,inti);//交换A_y[m],A_y[i]voidexchange_lie(intj);//交换a[][j]与b[];voidexchange_hang(intm,intn);//分别交换a[][]和b[]中的m与n两行voidgauss_row_xiaoqu();//Gauss列主元消去法voidgauss_all_xiaoqu();//Gauss全主元消去法voidgauss_calculate();//根据Gauss消去法结果计算未知量的值voidexchange_a_lie(intm,intn);//交换a[][]中的m和n列voidexchange_x(intm,intn);//交换x[]中的x[m]和x[n]voidrecovery();//恢复数据//主函数voidmain(){intflag=1;input();//输入方程while(flag){print_menu();//打印主菜单flag=choose();//选择解答方式}}//函数定义区voidprint_menu(){system(cls);cout------------方程系数和常数矩阵表示如下:\n;for(intj=0;jlenth;j++)cout系数j+1;cout\t常数;coutendl;for(inti=0;ilenth;i++){for(j=0;jlenth;j++)coutsetw(8)setiosflags(ios::left)a[i][j];cout\tb[i]endl;}cout-----------请选择方程解答的方案----------;cout\n1.克拉默(Cramer)法则;cout\n2.Gauss列主元消去法;cout\n3.Gauss全主元消去法;cout\n4.Doolittle分解法;cout\n5.退出;cout\n输入你的选择:;}voidinput(){inti,j;cout方程的个数:;cinlenth;if(lenthNumber){coutItistoobig.\n;return;}x=newchar[lenth];for(i=0;ilenth;i++)x[i]='a'+i;//输入方程矩阵//提示如何输入cout====================================================\n;cout请在每个方程里输入lenth系数和一个常数:\n;cout例:\n方程:a;for(i=1;ilenth;i++){cout+i+1x[i];}cout=10\n;cout应输入:;for(i=0;ilenth;i++)couti+1;cout10\n;cout==============================\n;//输入每个方程for(i=0;ilenth;i++){cout输入方程i+1:;for(j=0;jlenth;j++)cina[i][j];cinb[i];}//备份数据for(i=0;ilenth;i++)for(j=0;jlenth;j++)copy_a[i][j]=a[i][j];for(i=0;ilenth;i++)copy_b[i]=b[i];copy_lenth=lenth;}//输入选择intchoose(){intchoice;charch;cinchoice;switch(choice){case1:cramer();break;case2:gauss_row();break;case3:guass_all();break;case4:Doolittle();break;case5:return0;default:cout输入错误,请重新输入:;choose();break;}cout\n是否换种方法求解(Y/N):;cinch;if(ch=='n'||ch=='N')return0;recovery();cout\n\n\n;return1;}//用克拉默法则求解方程.voidcramer(){inti,j;doublesum,sum_x;charch;//令第i行的列坐标为icout用克拉默(Cramer)法则结果如下:\n;for(i=0;ilenth;i++)A_y[i]=i;sum=calculate_A(lenth,0);if(sum!=0){cout系数行列式不为零,方程有唯一的解:;for(i=0;ilenth;i++){ch='a'+i;a_sum=0;for(j=0;jlenth;j++)A_y[j]=j;exchange_lie(i);sum_x=calculate_A(lenth,0);coutendlch=sum_x/sum;exchange_lie(i);}}else{cout系数行列式等于零,方程没有唯一的解.;}cout\n;}double&calculate_A(intn,intm)//计算行列式{inti;if(n==1){a_sum+=quanpailie_A();}else{for(i=0;in;i++){exchange(m,m+i);calculate_A(n-1,m+1);exchange(m,m+i);}}returna_sum;}doublequanpailie_A()//计算行列式中一种全排列的值{inti,j,l;doublesum=0,p;for(i=0,l=0;ilenth;i++)for(j=0;A_y[j]!=i&&jlenth;j++)if(A_y[j]i)l++;for(p=1,i=0;ilenth;i++)p*=a[i][A_y[i]];sum+=p*((l%2==0)?(1):(-1));returnsum;}//高斯列主元排列求解方程voidgauss_row(){inti,j;gauss_row_xiaoqu();//用高斯列主元消区法将系数矩阵变成一个上三角矩阵for(i=0;ilenth;i++){for(j=0;jlenth;j++)coutsetw(10)setprecision(5)a[i][j];coutsetw(10)b[i]endl;}if(a[lenth-1][lenth-1]!=0){cout系数行列式不为零,方程有唯一的解:\n;gauss_calculate();for(i=0;ilenth;i++)//输出结果{coutx[i]=b[i]\n;}}elsecout系数行列式等于零,方程没有唯一的解.\n;}voidgauss_row_xiaoqu()//高斯列主元消去法{inti,j,k,maxi;doublelik;cout用Gauss列主元消去法结果如下:\n;for(k=0;klenth-1;k++){j=k;for(maxi=i=k;ilenth;i++)if(a[i][j]a[maxi][j])maxi=i;if(maxi!=k)exchange_hang(k,maxi);//for(i=k+1;ilenth;i++){lik=a[i][k]/a[k][k];for(j=k;jlenth;j++)a[i][j]=a[i][j]-a[k][j]*lik;b[i]=b[i]-b[k]*lik;}}}//高斯全主元排列求解方程voidguass_all(){inti,j;gauss_all_xiaoqu();for(i=0;ilenth;i++){for(j=0;jlenth;j++)coutsetw(10)setprecision(5)a[i][j];coutsetw(10)b[i]endl;}if(a[lenth-1][lenth-1]!=0){cout系数行列式不为零,方程有唯一的解:\n;gauss_calculate();for(i=0;ilenth;i++)//输出结果{for(j=0;x[j]!='a'+i&&jlenth;j++);coutx[j]=b[j]endl;}}elsecout系数行列式等于零,方程没有唯一的解.\n;}voidgauss_all_xiaoqu()//Gauss全主元消去法{inti,j,k,maxi,maxj;doublelik;cout用Gauss全主元消去法结果如下:\n;for(k=0;klenth-1;k++){for(maxi=maxj=i=k;ilenth;i++){for(j=k;jlenth;j++)if(a[i][j]a[maxi][maxj]){maxi=i;maxj=j;}}if(maxi!=k)exchange_hang(k,maxi);if(maxj!=k){exchange_a_lie(maxj,k);//交换两列exchange_x(maxj,k);}for(i=k+1;ilenth;i++){lik=a[i][k]/a[k][k];for(j=k;jlenth;j++)a[i][j]=a[i][j]-a[k][j]*lik;b[i]=b[i]-b[k]*lik;}}}voidgauss_calculate()//高斯消去法以后计算未知量的结果{inti,j;doublesum_ax;b[lenth-1]=b[lenth-1]/a[lenth-1][lenth-1];for(i=lenth-2;i=0;
本文标题:c++解线性方程组的几种方法
链接地址:https://www.777doc.com/doc-4368559 .html