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

📄 wyr.cpp

📁 方程的数值计算方法
💻 CPP
字号:
//第三章逐次超松弛迭代法
//王玉荣051791,B组。
#include<iostream.h>
#include<math.h>

int n=9;								//方程组的维数
double limit;
double b[9]={-15,27,-23,0,-20,12,-7,7,10};

double max(double a,double b)
{
	if(a>b)
	{
		return a;
	}
	else
	{
		return b;
	}
}
void func(double a[9][9])
{
	double Rn=2*limit;
	double rk,value,w;
	int p;
	int bestp=1;						//迭代过程中要用到的递增变量
	int k;
	int mink;							//k用来保存本次松弛因子对应的迭代次数,mink用来保存最优迭代次数
	double x[20];
	double A;							//中间变量,用于计算中间出现的复杂变量和
	double bestx[20];
	int i;
	double aii;
	for(p=0;p<99;p++)
	{
		w=(double)(p+1)/50.0;
		k=0;
		Rn=2*limit;
		for(i=0;i<n;i++)				//迭代向量初始化为0矩阵
			x[i]=0.0;	
		while(Rn>limit)
		{
			for(int i=0;i<n;i++)		//执行一次变换xi
			{
				A=0.0;
				for(int j=0;j<n;j++)
				{
					if(j!=i)
					{
						A+=a[i][j]*x[j];
					}
				}
				value=x[i];
				
				aii=1.0/a[i][i];
				x[i]=(1-w)*x[i]+w*(b[i]-A)*aii;
			
				if(i==0)
				{
					Rn=fabs(x[i]-value);
				}
				else
				{
					rk=fabs(x[i]-value);
					Rn=max(rk,Rn);
				}
			}
			k++;
		}
		if(p==0)
		{
			mink=k;
		}
		else
		{
			if(k<mink)
			{
				for(i=0;i<n;i++)
					bestx[i]=x[i];
				mink	=k;
				bestp	=p+1;			//记录最佳的p
			}
		}
		cout<<"松弛因子w"<<(p+1)<<"="<<(p+1)/50.0<<"时,迭代次数k="<<k;
		if(!(p%2))
			cout<<'\t';
		else
			cout<<'\n';
	}
	cout<<"\n最佳松弛因子w="<<bestp/50.0<<";\n";
	cout<<"对应的迭代次数为"<<mink<<'\n';
	cout<<"解向量是:"<<'\n';
	for(i=0;i<n;i++)
	{
		cout<<"x("<<(i+1)<<")="<<bestx[i]<<'\t';
	}
	cout<<'\n';
}

void main(void)
{
	double a1[9][9]={{31,-13,0,0,0,-10,0,0,0},{-13,35,-9,0,-11,0,0,0,0},{0,-9,31,-10,0,0,0,0,0},{0,0,-10,79,-30,0,0,0,-9},{0,0,0,-30,57,-7,0,-5,0},{0,0,0,0,-7,47,-30,0,0},{0,0,0,0,0,-30,41,0,0},{0,0,0,0,-5,0,0,27,-2},{0,0,0,-9,0,0,0,-2,29}};

	cout<<"***********数值分析第三章逐次超松弛迭代法解方程组的计算***********\n";
	
	cout<<"请输入容许误差:";
	cin>>limit;
	func(a1);
}

⌨️ 快捷键说明

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