找回密码
 注册
搜索
热搜: 回贴
  • 前程无忧官网首页 有什么好的平台可以
  • 最新的销售平台 互联网营销的平台有哪
  • 制作网页的基本流程 网页制作和网页设
  • 【帝国CMS】输出带序号的列表(数字排
  • 网站建设公司 三一,中联,极东泵车的
  • 织梦 建站 织梦网站模版后台怎么更改
  • 云服务官网 哪些网站有免费的简历模板
  • 如何建网站要什么条件 建网站要用什么
  • 吉林市移动公司电话 吉林省退休人员网
  • 设计类毕业论文 网站设计与实现毕业论
查看: 1801|回复: 0

温习经典算法 自定义运算法则的高斯消元法算法实现(自定义运算的加减乘除) ...

[复制链接]
发表于 2009-11-2 04:22:31 | 显示全部楼层 |阅读模式 IP:江苏扬州
高斯算法:矩阵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;
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|小黑屋|最新主题|手机版|微赢网络技术论坛 ( 苏ICP备08020429号 )

GMT+8, 2024-9-30 01:33 , Processed in 0.232059 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表