?? gsandsor.cpp
字號:
/*****************************************************************陳煒****XS08012048*********繼教學(xué)院**********/
/*用Gauss-Seidel迭代法和SOR迭代發(fā)解一個系數(shù)矩陣為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};//****系數(shù)矩陣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;//*******************************精度要求,循環(huán)停止條件
double e=1.0;//********************************與前一次迭代誤差,初值設(shè)為1,用以啟動循環(huán)
int count=0;//*********************************記錄迭代次數(shù)
for(int k=0;k<n;k++)
y[k]=x[k]=0;//*****************************迭代初始向量設(shè)為{0,0,0}
clock_t start,finish;//************************計時變量,記錄開始和結(jié)束時間
double totaltime;//****************************儲存運行時間
start=clock();//*******************************G-S迭代過程計時開始
cout<<"G-S迭代過程:"<<endl;
for(int i=0;i<n;i++)//輸出設(shè)置
{
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迭代式的實現(xiàn):
{
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]);//***************計算本次迭代與上次迭代結(jié)果差的最大值
y[m-1]=x[m-1];//***************************將本次迭代結(jié)果存入y[n]
cout.width(15);
cout.precision(7);
cout<<x[m-1];//****************************打印每次迭代結(jié)果
}
cout<<endl;
}
finish=clock();//**********************************G-S迭代過程結(jié)束時間記錄
//*************************************************G-S迭代結(jié)束
cout<<endl<<"用G-S迭代法計算方程組的解為:"<<endl;
for(i=0;i<n;i++)
cout<<"x["<<i<<"]="<<x[i]<<endl;//******************輸出滿足精度的最終解
cout<<"迭代次數(shù):"<<count<<"次"<<endl;//*************輸出迭代次數(shù)
totaltime=(double)(finish-start)/CLOCKS_PER_SEC;//**計算運行時間
cout<<"G-S迭代過程的運行時間為"<<setprecision(6)<<totaltime<<"秒!"<<endl;//輸出運行時間
cout<<endl;
/***********************************G-S迭代法解方程組:結(jié)束*******************************/
/***********************************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;//*********************************迭代初始向量設(shè)為{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迭代式的實現(xiàn):
{
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]);//***************計算本次迭代與上次迭代結(jié)果差的最大值
y[m-1]=x[m-1];//***************************將本次迭代結(jié)果存入y[n]
cout.width(15);
cout.precision(7);
cout<<x[m-1];//****************************打印每次迭代結(jié)果
}
cout<<endl;
}
finish=clock();//****************************************SOR迭代過程結(jié)束時間記錄
//***************************************************SOR迭代結(jié)束
cout<<endl<<"用SOR迭代法計算方程組的解為:"<<endl;
for(i=0;i<n;i++)
cout<<"x["<<i<<"]="<<x[i]<<endl;//******************輸出滿足精度的最終解
cout<<"迭代次數(shù):"<<count<<"次"<<endl;//*************輸出迭代次數(shù)
totaltime=(double)(finish-start)/CLOCKS_PER_SEC;//**計算運行時間
cout<<"SOR迭代過程的運行時間為"<<setprecision(6)<<totaltime<<"秒!"<<endl;//輸出運行時間
/***********************************SOR迭代法解方程組:結(jié)束*******************************/
return 0;
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -