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

📄 gsandsor.cpp

📁 高斯GS与超松弛SOR迭代算法解线性方程组
💻 CPP
字号:

/*****************************************************************陈炜****XS08012048*********继教学院**********/

/*用Gauss-Seidel迭代法和SOR迭代发解一个系数矩阵为3*3的线性方程组*/

#include<iostream>
#include<math.h>
#include<time.h>
#include<iomanip>

using namespace std;
const n=3;
/*******************************************主程序********************************************************/
int main(void)
{
double a[n][n]={4,-2,-1,-2,4,-2,-1,-2,3};//****系数矩阵A
double b[n]={0,-2,3};//************************向量b[n]
double x[n],y[n];//****************************定义解向量x[n]及向量y[n],
                //*****************************用以储存迭代过程中x[n]的前一次解
	
	/*************************G-S迭代法解方程组:开始*************************************/

	double c=1e-7;//*******************************精度要求,循环停止条件
    double e=1.0;//********************************与前一次迭代误差,初值设为1,用以启动循环
	int count=0;//*********************************记录迭代次数
	for(int k=0;k<n;k++)
		y[k]=x[k]=0;//*****************************迭代初始向量设为{0,0,0}

	clock_t start,finish;//************************计时变量,记录开始和结束时间
    double totaltime;//****************************储存运行时间
    start=clock();//*******************************G-S迭代过程计时开始
	cout<<"G-S迭代过程:"<<endl;
	for(int i=0;i<n;i++)//输出设置
	{
		cout.width(12);
		cout<<"x["<<i<<"]";
	}
	cout<<endl<<endl;
	//*************************************************G-S迭代开始

	start=clock();//*******************************G-S迭代过程开始时间记录

	while(e>c)
	{
		e=0;count++;//****************************每次迭代钱e置零,cout加一
	
	for(int i=0;i<n;i++)//*************************G-S迭代式的实现:
	  {	
		x[i]=b[i];
		for(int j=0;j<n;j++)
		if(j!=i)	x[i]=x[i]-a[i][j]*x[j];
		 x[i]=x[i]/a[i][i];
	  }
	cout<<count<<": ";
	for(int m=1;m<=n;m++)
		{
		if(fabs(y[m-1]-x[m-1])>e)
			e=fabs(y[m-1]-x[m-1]);//***************计算本次迭代与上次迭代结果差的最大值
		y[m-1]=x[m-1];//***************************将本次迭代结果存入y[n]
		cout.width(15);
		cout.precision(7);
		cout<<x[m-1];//****************************打印每次迭代结果
		}
	cout<<endl;
	}
	finish=clock();//**********************************G-S迭代过程结束时间记录
	//*************************************************G-S迭代结束
	
	cout<<endl<<"用G-S迭代法计算方程组的解为:"<<endl;
	for(i=0;i<n;i++)
	cout<<"x["<<i<<"]="<<x[i]<<endl;//******************输出满足精度的最终解
	cout<<"迭代次数:"<<count<<"次"<<endl;//*************输出迭代次数
	totaltime=(double)(finish-start)/CLOCKS_PER_SEC;//**计算运行时间
	cout<<"G-S迭代过程的运行时间为"<<setprecision(6)<<totaltime<<"秒!"<<endl;//输出运行时间
	cout<<endl;
	/***********************************G-S迭代法解方程组:结束*******************************/



    /***********************************SOR迭代法解方程组:开始*******************************/
	c=1e-7; e=1.0;count=0;//***************************重新初始化
	double w=1.45;//***********************************松弛因子w=1.45
	for(k=0;k<n;k++)
		y[k]=x[k]=0;//*********************************迭代初始向量设为{0,0,0}
	
	cout<<"SOR迭代过程:"<<endl;
		for(i=0;i<n;i++)
		{	
		cout.width(12);
		cout<<"x["<<i<<"]";
		}
	cout<<endl<<endl;
	//*************************************************SOR迭代开始

	start=clock();//***********************************SOR迭代过程开始时间记录

	while(e>c)
	{
	e=0;count++;
	
	for(i=0;i<n;i++)//******************************SOR迭代式的实现:
	  {	
		x[i]=b[i];
		for(int j=0;j<n;j++)
		if(j!=i)	x[i]=x[i]-a[i][j]*x[j];
		 x[i]=(1-w)*y[i]+w*x[i]/a[i][i];
		 
	  }
	cout<<count<<": ";
	for(int m=1;m<=n;m++)
		{
		if(fabs(y[m-1]-x[m-1])>e)
			e=fabs(y[m-1]-x[m-1]);//***************计算本次迭代与上次迭代结果差的最大值
		y[m-1]=x[m-1];//***************************将本次迭代结果存入y[n]
		cout.width(15);
		cout.precision(7);
		cout<<x[m-1];//****************************打印每次迭代结果
		}
	cout<<endl;
	}
	finish=clock();//****************************************SOR迭代过程结束时间记录

	//***************************************************SOR迭代结束
	cout<<endl<<"用SOR迭代法计算方程组的解为:"<<endl;
	for(i=0;i<n;i++)
	cout<<"x["<<i<<"]="<<x[i]<<endl;//******************输出满足精度的最终解
	cout<<"迭代次数:"<<count<<"次"<<endl;//*************输出迭代次数
	totaltime=(double)(finish-start)/CLOCKS_PER_SEC;//**计算运行时间
	cout<<"SOR迭代过程的运行时间为"<<setprecision(6)<<totaltime<<"秒!"<<endl;//输出运行时间

   /***********************************SOR迭代法解方程组:结束*******************************/
return 0;
}

⌨️ 快捷键说明

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