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

📄 作业gauss_seidel.cpp

📁 线形方程中高斯求解
💻 CPP
字号:
#include"iostream.h"
#include"iomanip.h"
#include"math.h"
void OutPut(double *a,int n)
{
	int i;
	cout<<"the solution is:"<<endl;
	for(i=0;i<n;i++)
		cout<<setw(15)<<setprecision(8)<<a[i];
	cout<<endl<<endl;
}
bool IsContent(double *a,double *b,int n,int flag)
{
	double TOL=0.00001;
	int i;
	double max1=0,max2=0;
	for(i=0;i<n;i++)
	{
		if(flag==1)
		{  
			if(max1<fabs(a[i]))
		       max1=fabs(a[i]);
		}
		else
		{
			max1+=a[i]*a[i];
			max1=sqrt(max1);
		}
		if(max2<fabs(fabs(a[i])-fabs(b[i])))
		   max2=fabs(fabs(a[i])-fabs(b[i]));
	}
	if(max2/max1<TOL)
	{
		OutPut(a,n);
		return true;
	}
	else 
		return false;

}
void AssignValue(double *a,double *b,int n)
{
	int i;
	for(i=0;i<n;i++)
		a[i]=b[i];
}
void FindValue(double a[][6],double *b,int n,int flag,int l)
{
	int i;
	int j;
	if(flag==1)
	{
	   for(i=0;i<n;i++)
		  for(j=0;j<=n;j++)
			   b[i]=a[i][n];
	}
	else
	{
		for(i=0;i<n;i++)
				if(l!=i)
					b[i]=a[l][i];
				else
					b[i]=0;
	}

}
double MulMin(double *a,double *b,int flag,int n,double va,int l)
{
	int i;
	double aa=0;
	for(i=0;i<n;i++)
	   if(flag==1)
			aa+=a[i]*b[i];
     if(flag==2)
		aa=b[l]-va;
	 return aa;
}
void Jaus(int flag)
{
	double a[5][6]={4,1,1,0,1,6,
		          -1,-3,1,1,0,6,
				  2,1,5,-1,-1,6,
				 -1,-1,-1,4,0,6,
				   0,2,-1,1,4,6};
    double x[5],x1[5]={0,0,0,0,0};
	double b[5],c[5];
	double ss;
	int n=5;
	int k=1,i;
	FindValue(a,b,5,1,0);
    while(k<20)
	{
		for(i=0;i<n;i++)
		{
			FindValue(a,c,n,2,i);
			ss=MulMin(x1,c,1,n,0,0);
			ss=MulMin(x1,b,2,n,ss,i);
			x[i]=ss/a[i][i];
		}
		if(IsContent(x,x1,n,flag))
	    {
		//	cout<<" loop times  "<<k<<endl;
			return ;
		}
		k++;
		AssignValue(x1,x,n);
	}
	
	cout<<"no successful"<<endl;
}
double MulMinG(double *a,double *b,int flag,int n,double va,int l)
{
	int i;
	double aa=0;
	for(i=l;i<n;i++)
	   if(flag==1)
			aa+=a[i]*b[i];
     if(flag==2)
		aa=b[l]-va;
	 return aa;
}
void Gaus(int flag)
{
	double a[5][6]={4,1,1,0,1,6,
		          -1,-3,1,1,0,6,
				  2,1,5,-1,-1,6,
				 -1,-1,-1,4,0,6,
				   0,2,-1,1,4,6};
    double x[5],x1[5]={0,0,0,0,0};
	double b[5],c[5];
	double ss,ss1;
	int n=5;
	int k=1,i;
	FindValue(a,b,5,1,0);
    while(k<20)
	{
		for(i=0;i<n;i++)
		{
			FindValue(a,c,n,2,i);
			ss=MulMinG(x1,c,1,n,0,i+1);
			ss=MulMin(x1,b,2,n,ss,i);
			ss1=MulMin(x,c,1,i,0,0);
			x[i]=(ss-ss1)/a[i][i];
		}
		if(IsContent(x,x1,n,flag))
		{
		//	cout<<setw(4)<<"loop times "<<k<<endl;
			return ;
		}
		k++;
		AssignValue(x1,x,n);
	}
	
	cout<<"no successful"<<endl;
}

void main()
{
	cout<<"this is Jacobi,infinate::"<<endl;
	Jaus(1);
	cout<<"this is Jacobi,L2::"<<endl;
	Jaus(2);
	cout<<"this is gauss,infinate::"<<endl;
    Gaus(1);
	cout<<"this is gauss,L2::"<<endl;
	Gaus(2);
}
		           
	



⌨️ 快捷键说明

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