cout<<"\t"<
}
cout<<"-----------请选择方程解答的方案----------";
cout<<"\n 1.克拉默(Cramer)法则";
cout<<"\n 2.Gauss列主元消去法";
cout<<"\n 3.Gauss全主元消去法";
cout<<"\n 4.Doolittle分解法";
cout<<"\n 5.退出";
cout<<"\n 输入你的选择:
";
}
voidinput()
{inti,j;
cout<<"方程的个数:
";
cin>>lenth;
if(lenth>Number)
{
cout<<"Itistoobig.\n";
return;
}
x=newchar[lenth];
for(i=0;i x[i]='a'+i;
//输入方程矩阵
//提示如何输入
cout<<"====================================================\n";
cout<<"请在每个方程里输入"<\n";
cout<<"例:
\n方程:
a";
for(i=1;i{
cout<<"+"<
}
cout<<"=10\n";
cout<<"应输入:
";
for(i=0;i cout<
cout<<"10\n";
cout<<"==============================\n";
//输入每个方程
for(i=0;i{
cout<<"输入方程"<
";
for(j=0;j cin>>a[i][j];
cin>>b[i];
}
//备份数据
for(i=0;i for(j=0;j copy_a[i][j]=a[i][j];
for(i=0;i copy_b[i]=b[i];
copy_lenth=lenth;
}
//输入选择
intchoose()
{
intchoice;charch;
cin>>choice;
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):
";
cin>>ch;
if(ch=='n'||ch=='N')return0;
recovery();
cout<<"\n\n\n";
return1;
}
//用克拉默法则求解方程.
voidcramer()
{
inti,j;doublesum,sum_x;charch;
//令第i行的列坐标为i
cout<<"用克拉默(Cramer)法则结果如下:
\n";
for(i=0;i A_y[i]=i;
sum=calculate_A(lenth,0);
if(sum!
=0)
{
cout<<"系数行列式不为零,方程有唯一的解:
";
for(i=0;i {ch='a'+i;
a_sum=0;
for(j=0;j A_y[j]=j;
exchange_lie(i);
sum_x=calculate_A(lenth,0);
cout< exchange_lie(i);
}
}
else
{
cout<<"系数行列式等于零,方程没有唯一的解.";
}
cout<<"\n";
}
double&calculate_A(intn,intm) //计算行列式
{inti;
if(n==1){
a_sum+=quanpailie_A();
}
else{for(i=0;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;i for(j=0;A_y[j]!
=i&&j if(A_y[j]>i)l++;
for(p=1,i=0;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;i{
for(j=0;j cout< cout<}
if(a[lenth-1][lenth-1]!
=0)
{
cout<<"系数行列式不为零,方程有唯一的解:
\n";
gauss_calculate();
for(i=0;i {
cout< }
}
else
cout<<"系数行列式等于零,方程没有唯一的解.\n";
}
voidgauss_row_xiaoqu() //高斯列主元消去法
{
inti,j,k,maxi;doublelik;
cout<<"用Gauss列主元消去法结果如下:
\n";
for(k=0;k{
j=k;
for(maxi=i=k;i if(fabs(a[i][j])>fabs(a[maxi][j]))maxi=i; //添加绝对值运算符
if(maxi!
=k)
exchange_hang(k,maxi);//
for(i=k+1;i {
lik=a[i][k]/a[k][k];
for(j=k;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;i{
for(j=0;j cout< cout<}
if(a[lenth-1][lenth-1]!
=0)
{
cout<<"系数行列式不为零,方程有唯一的解:
\n";
gauss_calculate();
for(i=0;i {
for(j=0;x[j]!
='a'+i&&j
cout< }
}
else
cout<<"系数行列式等于零,方程没有唯一的解.\n";
}
voidgauss_all_xiaoqu() //Gauss全主元消去法
{
inti,j,k,maxi,maxj;doublelik;
cout<<"用Gauss全主元消去法结果如下:
\n";
for(k=0;k{
for(maxi=maxj=i=k;i {
for(j=k;j if(fabs(a[i][j])>fabs(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;i {
lik=a[i][k]/a[k][k];
for(j=k;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;i--)
{
for(j=i+1,sum_ax=0;j sum_ax+=a[i][j]*b[j];
b[i]=(b[i]-sum_ax)/a[i][i];
}
}
voidDoolittle() //Doolittle消去法计算方程组
{
doubletemp_a[Number][Number],temp_b[Number];inti,j,flag;
for(i=0;i for(j=0;j temp_a[i][j]=a[i][j];
flag=Doolittle_check(temp_a,temp_b);
if(flag==0)cout<<"\n行列式为零.无法用Doolittle求解.";
xiaoqu_u_l();
calculate_u_l();
cout<<"用Doolittle方法求得结果如下:
\n";
for(i=0;i {
for(j=0;x[j]!
='a'+i&&j
cout< }
}
voidcalculate_u_l() //计算Doolittle结果
{inti,j;doublesum_ax=0;
for(i=0;i{
for(j=0,sum_ax=0;j
sum_ax+=a[i][j]*b[j];
b[i]=b[i]-sum_ax;
}
for(i=lenth-1;i>=0;i--)
{
for(j=i+1,sum_ax=0;j sum_ax+=a[i][j]*b[j];
b[i]=(b[i]-sum_ax)/a[i][i];
}
}
voidxiaoqu_u_l() //将行列式按Doolittle分解
{inti,j,n,k;doubletemp;
for(i=1,j=0;i a[i][j]=a[i][j]/a[0][0];
for(n=1;n{ //求第n+1层的上三角矩阵部分即U
for(j=n;j {for(k=0,temp=0;k temp+=a[n][k]*a[k][j];
a[n][j]-=temp;
}
for(i=n+1;i {for(k=0,temp=0;k temp+=a[i][k]*a[k][n];
a[i][n]=(a[i][n]-temp)/a[n][n];
}
}
}
intDoolittle_check(doubletemp_a[][Number],doubletemp_b[Number]) //若行列式不为零,将系数矩阵调整为顺序主子式大于零
{
inti,j,k,maxi;doublelik,temp;
for(k=0;k{
j=k;
for(maxi=i=k;i if(temp_a[i][j]>temp_a[maxi][j])maxi=i;
if(maxi!
=k)
{exchange_hang(k,maxi);
for(j=0;j {temp=temp_a[k][j];
temp_a[k][j]=temp_a[maxi][j];
temp_a[maxi][j]=temp;
}
}
for(i=k+1;i {
lik=temp_a[i][k]/temp_a[k][k];
for(j=k;j temp_a[i][j]=temp_a[i][j]-temp_a[k][j]*lik;
temp_b[i]=temp_b[i]-temp_b[k]*lik;
}
}
if(temp_a[lenth-1][lenth-1]==0) return0;
return1;
}
voidexchange_hang(intm,intn) //交换a[][]中和b[]两行
{
intj;doubletemp;
for(j=0;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;
}
voidexchange(intm,inti) //交换A_y[m],A_y[i]
{ inttemp;
temp=A_y[m];
A_y[m]=A_y[i];
A_y[i]=temp;
}
voidexchange_lie(intj) //交换未知量b[]和第i列
{doubletemp;inti;
for(i=0;i{temp=a[i][j];
a[i][j]=b[i];
b[i]=temp;
}
}
voidexchange_a_lie(intm,intn) //交换a[]中的两列
{doubletemp;inti;
for(i=0;i{temp=a[i][m];
a[i][m]=a[i][n];
a[i][n]=temp;
}
}
voidexchange_x(intm,intn) //交换未知量x[m]与x[n]
{chartemp;
temp=x[m];
x[m]=x[n];
x[n]=temp;
}
voidrecovery() //用其中一种方法求解后恢复数据以便用其他方法求解
{
for(inti=0;i for(intj=0;j a[i][j]=copy_a[i][j];
for(i=0;i b[i]=copy_b[i];
for(i=0;i x[i]='a'+i;
a_sum=0;
lenth=copy_lenth;
}