您好,欢迎访问三七文档
当前位置:首页 > 办公文档 > 理论文章 > 主元素消去法和高斯消去法
#includestdafx.h#includeiostream.h#includeiomanip.h#includestdlib.h//全局变量定义区constintNumber=15;//方程最大个数doublea[Number][Number],b[Number],copy_a[Number][Number],copy_b[Number];//系数行列式intA_y[Number];intlenth,copy_lenth;//方程的个数doublea_sum;//计算行列式的值char*x;//未知量a,b,c的载体//函数定义区voidinput(){inti,j;cout方程的个数:;cinlenth;if(lenthNumber){coutItistoobig.\n;return;}x=newchar[lenth];for(i=0;ilenth;i++)x[i]='a'+i;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;}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\n1.Gauss消去法;cout\n2.主元素消去法;cout\n3.退出;cout\n请选择:;}//用其中一种方法求解后恢复数据以便用其他方法求解voidrecovery(){for(inti=0;ilenth;i++)for(intj=0;jlenth;j++)a[i][j]=copy_a[i][j];for(i=0;ilenth;i++)b[i]=copy_b[i];for(i=0;ilenth;i++)x[i]='a'+i;a_sum=0;lenth=copy_lenth;}//交换a[][]中和b[]两行voidexchange_hang(intm,intn){intj;doubletemp;for(j=0;jlenth;j++){temp=a[m][j];a[m][j]=a[n][j];a[n][j]=temp;}temp=b[m];b[m]=b[n];b[n]=temp;}//交换A_y[m],A_y[i]voidexchange(intm,inti){inttemp;temp=A_y[m];A_y[m]=A_y[i];A_y[i]=temp;}voidexchange_x(intm,intn)//交换未知量x[m]与x[n]{chartemp;temp=x[m];x[m]=x[n];x[n]=temp;}voidexchange_a_lie(intm,intn)//交换a[]中的两列{doubletemp;inti;for(i=0;ilenth;i++){temp=a[i][m];a[i][m]=a[i][n];a[i][n]=temp;}}//计算行列式中一种全排列的值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;}//计算行列式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;}//高斯消去法以后计算未知量的结果voidgauss_calculate(){inti,j;doublesum_ax;b[lenth-1]=b[lenth-1]/a[lenth-1][lenth-1];for(i=lenth-2;i=0;i--){for(j=i+1,sum_ax=0;jlenth;j++)sum_ax+=a[i][j]*b[j];b[i]=(b[i]-sum_ax)/a[i][i];}}//高斯消去法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;}}}//高斯列主元排列求解方程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_all_xiaoqu(){inti,j,k,maxi,maxj;doublelik;cout主元素消去法结果如下:\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;}}}//主元素消去法排列求解方程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;}//选择输出函数intchoose(){intchoice;charch;cinchoice;switch(choice){case1:gauss_row();break;case2:guass_all();break;case3:return0;default:cout输入错误,请重新输入:;choose();break;}cout\n是否换种方法求解(Y/N):;cinch;if(ch=='n'||ch=='N')return0;recovery();cout\n\n\n;return1;}//主函数voidmain(){intflag=1;input();//输入方程while(flag){print_menu();//打印主菜单flag=choose();//选择解答方式}}
本文标题:主元素消去法和高斯消去法
链接地址:https://www.777doc.com/doc-4922675 .html