c++ 高斯消去法 求线性方程组的解

用列主元高斯消去法求解线性方程组AX=B的解
(1) 系数矩阵(数组)和常数矩阵(数组)的输入要求编写独立函数实现;
(2) 列主元高斯消去法(消元和回代)的算法用独立函数实现;
(3) 待求变量矩阵(数组)的输出要求编写独立函数实现。

先说如何调用的,用高斯消元法做的

//By JJ,2008

#include<iostream.h>
#include"01.h"
void main()
{
equation a;
a.InputData();
a.solve_eqution();
cin.get();
cin.get();
}

下面是以前写的类,可能要你自己修改一下

#include<iomanip.h>
const int Max_Number=20;
class equation
{
private:
int number; //方程个数
char value[Max_Number]; //未知量
double modulus[Max_Number][Max_Number]; //方程系数
double constant[Max_Number]; //右端常数
public:
equation(int _number=0); //构造函数
void InputData(); //输入数据
void solve_eqution(); //高斯全主元消去
void gauss_all_valueiaoqu(); //Gauss全主元消去法
void gauss_calculate(); //高斯消去法以后计算未知量的结果
void evaluechange_hang(int m,int n);
void evaluechange_a_lie(int m,int n);
void evaluechange_value(int m,int n);
};

equation::equation(int _number)
{
number=_number;
}

//----------------------------初始化数据为0
void equation::InputData()
{
int i,j;
if(number==0)
{
cout<<"输入方程的个数:";
cin>>number;
}

//--------------初始化变量符号为默认的a,b,c..
for(i=0;i<number;i++)
value[i]='a'+i;

//---------输入数据------01.提示如何输入
cout<<"====================================================\n";
cout<<"请在每个方程里输入"<<number<<"系数和一个常数:\n";
cout<<"例:\n方程:a";
for(i=1;i<number;i++)
{
cout<<"+"<<i+1<<value[i];
}
cout<<"=10\n";
cout<<"应输入:";
for(i=0;i<number;i++)
cout<<i+1<<" ";
cout<<"10\n";
cout<<"==============================\n";

//---------02.输入每个方程
for(i=0;i<number;i++)
{
cout<<"输入方程"<<i+1<<":";
for(j=0;j<number;j++)
cin>>modulus[i][j];
cin>>constant[i];
}
}

//高斯全主元排列求解方程
void equation::solve_eqution()
{
int i,j;
gauss_all_valueiaoqu();
if(modulus[number-1][number-1]!=0)
{

gauss_calculate();

for(i=0;i<number;i++) //输出结果
{
for(j=0;value[j]!='a'+i&&j<number;j++);
cout<<value[j]<<"="<<constant[j]<<endl;
}
}
else
cout<<"系数行列式等于零,方程没有唯一的解.\n";
}

void equation::gauss_all_valueiaoqu() //Gauss全主元消去法
{
int i,j,k,mavaluei,mavaluej;double lik;
cout<<"用Gauss全主元消去法结果如下:\n";

for(k=0;k<number-1;k++)
{

for(mavaluei=mavaluej=i=k;i<number;i++)
{
for(j=k;j<number;j++)
if(modulus[i][j]>modulus[mavaluei][ mavaluej])
{ mavaluei=i;
mavaluej=j;
}

}
if(mavaluei!=k)
evaluechange_hang(k,mavaluei);
if(mavaluej!=k)
{
evaluechange_a_lie(mavaluej,k); //交换两列
evaluechange_value(mavaluej,k);

}

for(i=k+1;i<number;i++)
{
lik=modulus[i][k]/modulus[k][k];
for(j=k;j<number;j++)
modulus[i][j]=modulus[i][j]-modulus[k][j]*lik;
constant[i]=constant[i]-constant[k]*lik;
}
}
}

void equation::gauss_calculate() //高斯消去法以后计算未知量的结果
{
int i,j;double sum_avalue;
constant[number-1]=constant[number-1]/modulus[number-1][number-1];
for(i=number-2;i>=0;i--)
{
for(j=i+1,sum_avalue=0;j<number;j++)
sum_avalue+=modulus[i][j]*constant[j];
constant[i]=(constant[i]-sum_avalue)/modulus[i][i];
}
}

void equation::evaluechange_hang(int m,int n) //交换a[][]中和b[]两行
{
int j; double temp;
for(j=0;j<number;j++)
{ temp=modulus[m][j];
modulus[m][j]=modulus[n][j];
modulus[n][j]=temp;

}
temp=constant[m];
constant[m]=constant[n];
constant[n]=temp;
}

void equation::evaluechange_a_lie(int m,int n) //交换a[]中的两列
{ double temp;int i;
for(i=0;i<number;i++)
{ temp=modulus[i][m];
modulus[i][m]=modulus[i][n];
modulus[i][n]=temp;
}
}

void equation::evaluechange_value(int m,int n) //交换未知量x[m]与x[n]
{ char temp;
temp=value[m];
value[m]=value[n];
value[n]=temp;
}
温馨提示:答案为网友推荐,仅供参考
相似回答