高斯算法:矩阵a==[a11,a12,a13,.....]矩阵,b=[b11,b12,b13,.....]为方程右边的列向量。
第一步:从a的k行、k列开始的子矩阵中选取绝对值最大的元素作为主元素,例如|ai1,j1|=max|aij|,k<j<n,然后换行使得这个子矩阵具有最大绝对值的元素在k行、k列。
第二步: 进行归一化计算。
akj=akj/akk; j=k+1,......n-1
bk=bk/akk;
第三步:进行消去计算
aij=aij-aik*akj; j,i=k+1,....,n-1
bi=bi-aik*bk; i=k+1.....,n-1
第三步:回代过程
x(n-1)“(下标是n-1)”=b(n-1))“(下标是n-1)”/a(n-1),(n-1))“(下标是(n-1),(n-1))”
xi=bi-∑aij*xj;∑的范围为j=i+1到n-1,i=n-2,.....,1,0
我做了3个文件linequ.h声明类,linequ.cpp实现类,lequmain.cpp主类
拜托各位大侠,帮手调试一下,我编译过了,但运行出错。
linequ.h如下:
//begin of file linequ.h //文件一,类声明
#include <math.h>
#include <iostream.h>
typedef int data; ////////////方便测试
class count ///////////定义运算
{
public:
count(data c=0.0,data d=0.0);
data add(data a,data b); /////a+b
data del(data a,data b); /////a-b
data mul(data a,data b); ////a*b
data div(data a,data b); //////a/b
data datafabs(data a); /////a 绝对值
int datamax(data a,data b); /////a>b 返回1,反之返回0;
protected:
data a;
data b;
};
/////////////////////////////////////////
class matrix:public count
{
public:
matrix(int dims=2);
~matrix();
void setmatrix(data *rmatr);
void printm();
protected:
int index;
data *matrixa;
};
//////////////////////////////////////////
class linequ: public matrix//,public count
{
public :
linequ(int dims=2);
~linequ();
void setlinequ(data *a,data *b);
void printl();
int solve();
void showx();
private:
data *sums;
data *solu;
};
//end of file linequ.h
/////////////////////////////////////////////
linequ.cpp如下:
//begin of file linequ.cpp
#include "linequ.h"
#include <math.h>
count::count(data c,data d)
{
a=c;
b=d;
}
////////////////////////////////
data count::add(data a,data b)
{
return(a+b);
}
////////////////////////////////
data count::del(data a,data b)
{
return(a-b);
}
////////////////////////////////
data count::mul(data a,data b)
{
return(a*b);
}
////////////////////////////////
data count::div(data a,data b)
{
if(b+1.0==1.0)
return(0.0);
else return(a/b);
}
////////////////////////////////
int count::datamax(data a,data b)
{
if(a>b)return(1);
else return(0);
}
////////////////////////////////////
data count::datafabs(data a)
{
return(fabs(a));
}
////////////////////////////////
void matrix::setmatrix(data *rmatr)
{
for(int i=0;i<index*index;i++)
{
*(matrixa+i)=rmatr[i];
}
}
/////////////////////////////////
matrix::matrix(int dims)
{
index=dims;
matrixa=new data[index*index];
}
/////////////////////////////////
matrix::~matrix()
{
delete[] matrixa;
}
/////////////////////////////////
void matrix::printm()
{
cout<<"the matrix is :"<<endl;
for(int i=0;i<index;i++)
{
for(int j=0;j<index;j++)
cout<<*(matrixa+i*index+j)<<" ";
cout<<endl;
}
}
/////////////////////////////////
linequ::linequ(int dims):matrix(dims)
{
sums=new data[dims];
solu=new data[dims];
}
/////////////////////////////////
linequ::~linequ()
{
delete[] sums;
delete[] solu;
}
//////////////////////////////////
void linequ::setlinequ(data *a,data *b)
{
setmatrix(a);
for(int i=0;i<index;i++)
sums[i]=b[i];
}
////////////////////////////////////
void linequ::printl()
{
cout<<"the line eqution is:"<<endl;
for(int i=0;i<index;i++)
{
for(int j=0;j<index;j++)
cout<<*(matrixa+i*index+j)<<" ";
cout<<" "<<sums[i]<<endl;
}
}
/////////////////////////////////////////
void linequ::showx()
{
cout<<"the result is :"<<endl;
for(int i=0;i<index;i++)
cout<<"x["<<i<<"]="<<solu[i]<<endl;
}
/////////////////////////////////////////
int linequ::solve()
{
int *js,l,k,i,j,is,p,q;
data d,t,m;
js=new int[index];
l=1;
for(k=0;k<=index-2;k++)
{
d=0.0; ////////////给出参照值
for(i=k;k<index-1;i++)
for(j=k;j<=index-1;j++)
{
t=datafabs(matrixa[i*index+j]);
if(datamax(t,d))
{d=t;js[k]=j;is=i;}
}
if(d+1.0==1.0)l=0; ////////////给出参照值
else
{
if(js[k]!=k)
for(i=0;i<=index-1;i++)
{
p=i*index+k;q=i*index+js[k];
t=matrixa[p];matrixa[p]=matrixa[q];matrixa[q]=t;
}
if(is!=k)
{
for(j=k;j<=index-1;j++)
{
p=k*index+j;q=is*index+j;
t=matrixa[p];matrixa[p]=matrixa[q];matrixa[q]=t;
}
t=sums[k];sums[k]=sums[is];sums[is]=t;
}
}
if(l==0)
{
delete[] js;
cout<<"fail"<<endl;
return(0);
}
d=matrixa[k*index+k];
for(j=k+1;j<=index-1;j++)
{
p=k*index+j;matrixa[p]=div(matrixa[p],d);
}
sums[k]=div(sums[k],d);
for(i=k+1;i<=index-1;i++)
{
for(j=k+1;j<=index-1;j++)
{
p=i*index+j;
t=mul(matrixa[i*index+k],matrixa[k*index+j]);
matrixa[p]=del(matrixa[p],t);
}
t=mul(matrixa[i*index+k],sums[k]);
sums[i]=del(sums[i],t);
}
}
d=matrixa[(index-1)*index+index-1];
if(datafabs(d)+1.0==0) ////////////参照数
{
delete[] js;
cout<<"fail"<<endl;
return(0);
}
solu[index-1]=div(sums[index-1],d);
for(i=index-2;i>=0;i--)
{
t=0.0; //////////参照数
for (j=i+1;j<=index-1;j++)
m=mul(matrixa[i*index+j],solu[j]);
t=add(t,m);
solu[i]=del(sums[i],t);
}
js[index-1]=index-1;
for(k=index-1;k>=0;k--)
if(js[k]!=k)
{
t=solu[k];
solu[k]=solu[js[k]];
solu[js[k]]=t;
}
delete[] js;
return(1);
}
////////////////////////////////////////////////
linequ.cpp如下:
#include "linequ.cpp"
void main()
{
data a[]={1,1,1,1,2,1,1,1,2};
data b[]={3,4,4};
linequ equ1(3);
equ1.setlinequ(a,b);
equ1.printl();
if(equ1.solve())
equ1.showx();
else
cout<<"fail"<<endl;
}