您的位置:首页 > 编程语言 > PHP开发

gauss-jordan 消元法

2011-03-25 11:12 323 查看
gauss-jordan消元法的基本思想是将系数矩阵化为单位阵,那样就省去了回代的过程,直接的到方程组的解,该方法也可用于求矩阵的逆矩阵。其代码如下:

#include<iostream.h>
#include<math.h>
#include<process.h>

class jordan
{
private:
int i,j,k,n,flag,scani,scanj,*row,*col;
double eps,pivot,aijcolk,*x,**a;
public:
void jordan_input();//数据输入的函数声明
void jordan_reduction();//消去法函数声明
void jordan_output();//结果输出的函数声明
~jordan()
{
delete [] row;
delete [] col;
delete [] x;
for(i=0;i<n;i++)
{
delete [] a[i];
}
delete []a;
}
};

void main()
{
jordan solution;
solution.jordan_input();
solution.jordan_reduction();
solution.jordan_output();
}

void jordan::jordan_input()
{
cout<<"输入方程的个数:";
cin>>n;
row = new int
;
col = new int
;
x = new double
;
a = new double*
;

for(i=0;i<n;i++)
{
a[i] = new double[n+1];
}
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
cout<<"/n输入 a["<<i<<"]["<<j<<"]=";
cin>>a[i][j];
}
for(i=0;i<n;i++)
{
cout<<"/n输入 b["<<i<<"]=";
cin>>a[i]
;
}
cout<<"/n输入最小主元素";
cin>>eps;
}

void jordan::jordan_reduction()
{
for(k=0;k<n;k++)
{
pivot = 0.0;
for(i=0;i<n;i++)
{
flag = 0;
for(j=0;j<n;j++)
{
flag = 0;
if(k>0)
{
for(scani=0;scani<k;scani++)
for(scanj=0;scanj<k;scanj++)
{
if((i==row[scani])||(j==col[scanj]))
{
flag = 1;//标记记录过的行和列
}
}
}
else
{

flag = 0;//标记为未为设置
}
if(flag == 0)
{
if(fabs(a[i][j])>fabs(pivot))
{
pivot = a[i][j];
row[k] = i;
col[k] = j;
}
}//记录主元信息结束
}
}

if(fabs(pivot)>eps)
{
for(j=0;j<(n+1);j++)
{
a[row[k]][j]/=pivot;
}
for(i=0;i<n;i++)
{
aijcolk=a[i][col[k]];
if(i!=row[k])
{
for(j=0;j<(n+1);j++)
{
a[i][j] = a[i][j] - aijcolk * a[row[k]][j];
}
}
}
}
else
{
cout<<"/n最大的主元素 = "<<pivot<<endl;
cout<<"/n矩阵可能奇异.失败..."<<endl;
exit(0);
}
}
for(i=0;i<n;i++)
{
x[col[i]] = a[row[i]]
;
}
}

void jordan::jordan_output()
{
cout<<"/n结果是:"<<endl;
for(i=0;i<n;i++)
{
cout<<"/nx["<<i<<"]="<<x[i]<<endl;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  pivot ini delete output input