i++)x[i]='a'+i。
//输入方程矩阵
//提示如何输入cout<<"====================================================\n"。
cout<<"请在每个方程里输入"<\n"。
cout<<"例:
\n方程:
a"。
for(i=1。
ii++)
{cout<<"+"<
}cout<<"=10\n"。
cout<<"应输入:
"。
for(i=0。
ii++)cout<
cout<<"10\n"。
cout<<"==============================\n"。
//输入每个方程for(i=0。
ii++){
cout<<"输入方程"<
"。
for(j=0。
jj++)cin>>a[i][j]。
cin>>b[i]。
}
//备份数据
for(i=0。
ii++)for(j=0。
jj++)copy_a[i][j]=a[i][j]。
for(i=0。
ii++)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。
ii++)
A_y[i]=i。
sum=calculate_A(lenth,0)。
if(sum!
=0)
{
cout<<"系数行列式不为零,方程有唯一的解for(i=0。
ii++)
{ch='a'+i。
a_sum=0。
for(j=0。
jj++)
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
。
ii++)
{
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。
ii++)
for(j=0。
A_y[j]!
=i&&jj++)if(A_y[j]>i)l++。
for(p=1,i=0。
ii++)p*=a[i][A_y[i]]。
sum+=p*((l%2==0)?
(1):
(-1))。
returnsum。
}
//高斯列主元排列求解方程voidgauss_row()
{
inti,j。
gauss_row_xiaoqu()。
//用高斯列主元消区法将系数矩阵变成一个上三角矩阵
for(i=0。
ii++)
{
for(j=0。
jj++)cout<}
if(a[lenth-1][lenth-1]!
=0)
{
cout<<"系数行列式不为零,方程有唯一的解:
\n"。
gauss_calculate()。
for(i=0。
ii++)//输出结果
{cout<}
}
else
cout<<"系数行列式等于零,方程没有唯一的解.\n"
}
voidgauss_row_xiaoqu()//高斯列主元消去法
{
inti,j,k,maxi。
doublelik。
cout<<"用Gauss列主元消去法结果如下:
\n"。
for(k=0。
kk++)
{
j=k。
for(maxi=i=k。
ii++)if(a[i][j]>a[maxi][j])maxi=i。
if(maxi!
=k)
exchange_hang(k,maxi)。
//
for(i=k+1。
ii++)
{
lik=a[i][k]/a[k][k]。
for(j=k。
jj++)
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。
ii++)
{
for(j=0。
jj++)
cout<cout<}
if(a[lenth-1][lenth-1]!
=0)
{
cout<<"系数行列式不为零,方程有唯一的解:
\n"。
gauss_calculate()。
for(i=0。
ii++)//输出结果
{
for(j=0。
x[j]!
='a'+i&&jj++)。
cout<}
}
else
cout<<"系数行列式等于零,方程没有唯一的解.\n"
}
voidgauss_all_xiaoqu()//Gauss全主元消去法
{
inti,j,k,maxi,maxj。
doublelik。
cout<<"用Gauss全主元消去法结果如下:
\n"。
for(k=0。
kk++)
for(maxi=maxj=i=k。
ii++)
{
for(j=k。
jj++)
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。
ii++)
{
lik=a[i][k]/a[k][k]
。
for(j=k。
j。
j++)
a[i][j]=a[i][j]-a[k][j]*lik
b[i]=b[i]-b[k]*lik
。
}
}
}
voidDoolittle()//Doolittle消去法计算方程组{
doubletemp_a[Number][Number],temp_b[Number]。
inti,j,flag
for(i=0。
ii++)
for(j=0。
jj++)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。
i++)//
输出结果
for(j=0。
x[j]!
='a'+i&&j。
j++)。
}
cout<。
voidcalculate_u_l()//计算Doolittle结果{inti,j。
doublesum_ax=0。
for(i=0。
ii++)
{
for(j=0,sum_ax=0。
j
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。
jj++)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。
ii++)
a[i][j]=a[i][j]/a[0][0]。
for(n=1。
nn++)
{//求第n+1层的上三角矩阵部分即U
for(j=n。
jj++)
{for(k=0,temp=0。
kk++)
temp+=a[n][k]*a[k][j]。
a[n][j]-=temp。
}
for(i=n+1。
ii++)//求第n+1层的下三角矩阵部分即L
{for(k=0,temp=0。
kk++)
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。
kk++)
{
j=k。
for(maxi=i=k。
ii++)
if(temp_a[i][j]>temp_a[maxi][j])maxi=i。
if(maxi!
=k)
{exchange_hang(k,maxi)。
for(j=0。
jj++)
{temp=temp_a[k][j]。
temp_a[k][j]=temp_a[maxi][j]。
temp_a[maxi][j]=temp。
}
}
for(i=k+1。
ii++)
{
lik=temp_a[i][k]/temp_a[k][k]。
for(j=k。
jj++)temp_a[i][j]=temp_a[i][j]-temp_a[k][j]*liktemp_b[i]=temp_b[i]-temp_b[k]*lik。
}
}
return0。
if(temp_a[lenth-1][lenth-1]==0)return1。
}
voidexchange_hang(intm,intn){
intj。
doubletemp。
for(j=0。
jj++){temp=a[m][j]。
a[m][j]=a[n][j]。
a[n][j]=temp。
//交换a[][]中和b[]两行
}
temp=b[m]。
b[m]=b[n]。
b[n]=temp。
}
{doubletemp。
inti。
for(i=0。
ii++){temp=a[i][j]。
a[i][j]=b[i]。
b[i]=temp。
}
}
//交换a[]中的两列
voidexchange_a_lie(intm,intn)
{doubletemp。
inti。
for(i=0。
ii++){temp=a[i][m]。
a[i][m]=a[i][n]。
a[i][n]=temp。
}
}
voidexchange_x(intm,intn)
{chartemp。
temp=x[m]。
x[m]=x[n]。
x[n]=temp。
}
voidrecovery()其他方法求解
{
for(inti=0。
ii++)
for(intj=0。
jj++)
a[i][j]=copy_a[i][j]。
for(i=0。
ii++)
b[i]=copy_b[i]。
for(i=0。
ii++)
x[i]='a'+i。
a_sum=0。
lenth=copy_lenth。
//交换未知量x[m]与x[n]
//用其中一种方法求解后恢复数据以便用
}