⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 linequ.cpp

📁 高斯法解线性方程组
💻 CPP
字号:
//类的实现
#include"linequ.h"

//the function member of Class Matrix                   //基类成员函数的实现
void Matrix::setMatrix(double *rmatr)                   //设置矩阵
{
	for(int i=0;i<index*index;i++){
		*(MatrixA+i)=rmatr[i];                          //矩阵成员赋初值
	}
}

Matrix::Matrix(int dims)                               //矩阵Matrix类的构造函数
{
	index=dims;                                         //保护数据赋值
	MatrixA=new double[index*index];                    //动态分配内存
}

Matrix::~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;
	}
}

//the function member of Class Linequ
Linequ::Linequ(int dims):Matrix(dims)                   //派生类Linequ的构造函数
{                                                       //使用参数调用基类构造函数
	sums=new double[dims];                              //动态内存分配
	solu=new double[dims];
}

Linequ::~Linequ()                                       //派生类Linequ的析构函数
{                                                       //调用基类析构函数
	delete[] sums;                                      //释放内存
	delete[] solu;
}

void Linequ::setLinequ(double *a,double *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+1<<"]="<<solu[i]<<endl;
	}
}

int Linequ::Solve()                                     //全选主元高斯消去法求解方程
{
	int *js,l,k,i,j,is,p,q;
	double d,t;
	js=new int[index];
	l=1;
	for(k=0;k<=index-2;k++){                             //消去过程
		d=0.0;
		for(i=k;i<=index-1;i++)
			for(j=k;j<=index-1;j++){
				t=fabs(MatrixA[i*index+j]);
				if(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]=MatrixA[p]/d;}
		sums[k]=sums[k]/d;
		for(i=k+1;i<=index-1;i++){
			for(j=k+1;j<=index-1;j++){
				p=i*index+j;
				MatrixA[p]=MatrixA[p]-MatrixA[i*index+k]*MatrixA[k*index+j];
			}
			sums[i]=sums[i]-MatrixA[i*index+k]*sums[k];
		}
	}
	d=MatrixA[(index-1)*index+index-1];
	if(fabs(d)+1.0==1.0)
	{
		delete[] js;cout<<"fail"<<endl;
		return(0);
	}
	solu[index-1]=sums[index-1]/d;                               //回代过程
	for(i=index-2;i>=0;i--){
		t=0.0;
		for(j=i+1;j<=index-1;j++)
			t=t+MatrixA[i*index+j]*solu[j];
		solu[i]=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);
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -