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

📄 c8.cpp

📁 数值分析最常用的四十种算法
💻 CPP
字号:
//C8.cpp
//Solve a linear system,using G-S Iteration

const int N=3;
#include<iostream.h>

int ReachTOL(double x1[],double x2[],double tol,int n)
{
	int i;
	double error=0;
	for (i=0;i<n;i++)
	{
		error+=(x1[i]-x2[i])*(x1[i]-x2[i]);
	}
	if(error<tol) 
		return 1;
	else
		return 0;
}

void GSI(double a[][N],double b[],double x0[],double tol,int max,int n)
{
	double x1[N],x00[N];
	int k,i,j;
	for (i=0;i<n;i++)                     //Initialazation
	{
		x1[i]=0;
		x00[i]=x0[i];
	}
	for (k=0;k<max;k++)
	{
		for (i=0;i<n;i++)
		{
			for (j=0;j<n;j++)
			{
			    if(j!=i)
				{
				    x1[i]+=a[i][j]*x00[j];
				} 
			}
		    x1[i]=((-1)*x1[i]+b[i])/a[i][i];
			
			if(i<n-1)
				x00[i]=x1[i];
		}
		if(ReachTOL(x00,x1,tol,n))
		{
			for (i=0;i<n;i++)
			{ 
		        cout<<"x"<<i<<" is: "<<x1[i]<<endl;
			} 
			cout<<x1[0]*(-1)+6*x1[1]-1*x1[2];
			cout<<endl;
			cout<<"Has iterated "<<k<<" times."<<endl;
			return;
		}
		x00[n-1]=x1[n-1];
		for (i=0;i<n;i++)
		{
		    x1[i]=0;
		}
	}
	cout<<"Exceed the maximium iteration time"<<endl;
	for (i=0;i<n;i++)
	{ 
         cout<<"x"<<i<<" is: "<<x1[i]<<endl;
	}
	cout<<endl;
}

void main(void)
{
	double a[N][N]={6,-1,-1,
		-1,6,-1,
		-1,-1,6};
	double b[N]={11.33,32,42};      
	double x0[N]={0,0,0};
	double tol=1e-6;
	int max=100,i,j;
	for(i=0;i<N;i++)
	{
		for(j=0;j<N;j++)
		{
			a[i][j]/=100;  //why divide 100?
		}
	}
	for (i=0;i<N;i++)
	{
		b[i]/=100;
	}
    GSI(a,b,x0,tol,max,N);
	cin>>i;
}

//Result:reach the precision of 1e-4,with iteration of 5 times
//x0 is: 4.66597;x1 is: 7.61888;x2 is: 9.04747
//从后面的比较可以看出GS的确比Jacobi占优

⌨️ 快捷键说明

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