📄 gsandsor.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 + -