数值计算方法(六)——迭代法求解线性方程组

雅克比迭代公式

公式:
在这里插入图片描述
代码实现:
双重循环实现迭代过程

/**
 *@name Jacobi_iteration:雅克比迭代方法求解向量
 *@param1 x:初始解向量x
 *@param2 x1:迭代结果解向量
 *@param3 error:迭代停止的精度限
**/
void Jacobi_iteration(double* x,double* x1,double error)
{
	double temp=0;
	double delta=100;
	while(fabs(delta)>error)
	{
		//根据迭代公式进行计算
		for (int i=0;i<2;i++)
		{
			//每一次利用中间变量temp存储迭代结果
			temp=0;
			for (int j=0;j<2;j++)
			{
				if(i!=j)
					temp+=1/A[i][i]*(b[i]-A[i][j]*x[j]);
			}
			x1[i]=temp;
		}

		//打印这一轮的解向量,并求出误差
		Print_vector(x1);
		delta=Max(x1)-Max(x);

		//将x1赋给x,进入新一轮迭代
		for(int i=0;i<2;i++)
		{
			x[i]=x1[i];
		}
	}
}

高斯-塞德尔迭代

公式:
在这里插入图片描述
代码实现:
这里应该可以有两种写法,我直接将计算得到的x1[i]同时更新给了x[i],也可以直接利用公式,小于i的用向量x1,大于i的用向量x。

/**
*@name Gaussian_iteration:高斯迭代方法求解向量
*@param1 x:初始解向量x
*@param2 x1:迭代结果解向量
*@param3 error:迭代停止的精度限
**/
void Gaussian_iteration(double* x,double* x1,double error)
{
	double temp=0;
	double delta=100;
	double max_x;
	while(fabs(delta)>error)
	{
		max_x=Max(x);
		//利用高斯迭代法进行迭代
		for(int i=0;i<2;i++)
		{
			temp=0;
			for(int j=0;j<2;j++)
			{
				if(i!=j)
					temp+=1/A[i][i]*(b[i]-A[i][j]*x[j]);
			}
			x1[i]=x[i]=temp;
		}

		//打印这一轮迭代的解向量
		Print_vector(x1);
		delta=Max(x1)-max_x;

	}
}

超松弛法

公式:
利用了一个松弛因子进行加速,注意0<w<2
在这里插入图片描述
代码实现:

/**
*@name Super_loose:超松弛迭代方法求解向量
*@param1 x:初始解向量x
*@param2 x1:迭代结果解向量
*@param3 error:迭代停止的精度限
*@param4 w;松弛因子
**/
void Super_loose(double* x,double* x1,double error,double w)
{
	double temp=0;
	double delta=100;
	double max_x;
	double temp_x[2];
	while(fabs(delta)>error)
	{
		//将变化前的x存起来
		max_x=Max(x);
		for(int i=0;i<2;i++)
		{
			temp_x[i]=x[i];
		}

		//利用高斯迭代法进行迭代
		for(int i=0;i<2;i++)
		{
			temp=0;
			for(int j=0;j<2;j++)
			{
				if(i!=j)
					temp+=1/A[i][i]*(b[i]-A[i][j]*x[j]);
			}
			x1[i]=x[i]=temp;
		}

		//超松弛加权
		for(int i=0;i<2;i++)
		{
			x1[i]=w*x1[i]+(1-w)*temp_x[i];
		}

		//打印这一轮迭代的解向量
		Print_vector(x1);
		delta=Max(x1)-max_x;
	}
}
发布了99 篇原创文章 · 获赞 29 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_44586750/article/details/103423473
今日推荐