2.cpp

来自「线性方程组求根实验」· C++ 代码 · 共 80 行

CPP
80
字号
#include<iostream>
#include<math.h>
using namespace std;
double a[11][11],b[11];
double x[11],w=1.25,epi=1e-6;
void Jacobi();
void SOR();
int main()
{
	//定义方程组
	for(int i=1;i<=10;i++)
	{
		for(int j=1;j<=10;j++)
			a[i][j]=1.0/(i+j-1);
		b[i]=1.0/i;
		x[i]=0.0;//初始向量取0
	}
	Jacobi();
	//初始向量取0
	for(int i=1;i<=10;i++)
		x[i]=0.0;
	SOR();
	system("pause");
	return 0;
}

void Jacobi()
{	
	double max=0.0;
	bool succ=1;
	do{
		if(max>10000)
		{
			cout<<"Jacobi迭代法不收敛"<<endl;
			succ=0;
			break;
		}
		max=0.0;
		//保存上一次的结果
		double x_last[11];
		for(int i=1;i<=10;i++)
			x_last[i]=x[i];
		for(int i=1;i<=10;i++)
		{
			double sum=0.0;
			for(int j=1;j<=10;j++)
				if(j!=i)
					sum+=a[i][j]*x_last[j];
			x[i]=(b[i]-sum)/a[i][i];
			if(max<fabs(x[i]-x_last[i]))
				max=fabs(x[i]-x_last[i]);
		}
	}while(max>epi);
	if (succ)
	{
		cout<<"Jacobi迭代法求出方程组的解x="<<endl;
		for(int i=1;i<=10;i++)
			cout<<x[i]<<endl;
	}	
}
void SOR()
{
	double max;
	do{
		max=0.0;
		for(int i=1;i<=10;i++)
		{
			double sum=0.0,last=x[i];
			//j<i的x[j]已经更新为最新计算出的
			for(int j=1;j<=10;j++)
				sum+=a[i][j]*x[j];
			x[i]=x[i]+w*(b[i]-sum)/a[i][i];
			if(max<fabs(x[i]-last))
				max=fabs(x[i]-last);
		}
	}while(max>epi);
	cout<<"SOR迭代法求出方程组的解x="<<endl;
	for(int i=1;i<=10;i++)
		cout<<x[i]<<endl;
}

⌨️ 快捷键说明

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