数值计算方法(五)——迭代法求方程根

(一)直接迭代

数学描述:
在这里插入图片描述
代码实现:

/**
 *@name Equation_iteration:方程求根的迭代法
 *@param1 x0:初始值
**/
double Equation_iteration(double x0)
{
	double xk=x0;
	double xk1;
	double error=100;
	while(fabs(error)>1e-4)
	{
		xk1=function(xk);
		error=xk1-xk;
		xk=xk1;
		cout<<"the iteration result is "<<xk1<<endl;
	}
	return xk1;
}

(二)利用加权平均进行迭代加速

数学公式:
注意:
这里加权中用的系数只跟x0有关
在这里插入图片描述
代码实现:

/**
  *@name Equation_iteration_weighting:带加权加速的迭代法
  *@param1 x0:
**/
double Equation_iteration_weighting(double x0)
{
	double xk=x0;
	double xk1;
	double error=100;
	double L=function_diff(x0);
	while(fabs(error)>1e-4)
	{
		xk1=1/(1-L)*(function(xk)-L*xk);
		error=xk1-xk;
		xk=xk1;
		cout<<"the iteration result is "<<xk1<<endl;
	}
	return xk1;
}

(三)松弛法实现迭代加速

数学公式:
注意:
这里的松弛因子随每一次的xk而发生变化
在这里插入图片描述
代码实现:

/**
  *@name Equation_iteration_weighting:松弛加速的迭代法
  *@param1 x0:
**/
double Equation_iteration_loose(double x0)
{
	double xk=x0;
	double xk1;
	double error=100;
	double wk;
	while(fabs(error)>1e-4)
	{
		//先求出wk,防止出现除0
		if(function_diff(xk)!=1)
			wk=1/(1-function_diff(xk));
		else
			wk=1;

		//松弛迭代
		xk1=wk*function(xk)+(1-wk)*xk;
		error=xk1-xk;
		xk=xk1;
		cout<<"the iteration result is "<<xk1<<endl;
	}
	return xk1;
}

(四)埃特金加速迭代方法

数学公式:
注意:
这里利用两次迭代去替换导数值
在这里插入图片描述
代码实现:

/**
 *@name Equation_iteration_Aitken:埃特金加速的迭代法
 *@param1 x0:
**/
double Equation_iteration_Aitken(double x0)
{
	double xk=x0;
	double xk1;
	double xk2;
	double compensate;
	double error=100;
	while(fabs(error)>1e-4)
	{
		xk1=function(xk);
		xk2=function(xk1);
		//计算补偿
		if(fabs(xk2-2*xk1+xk)>1e-4)
			compensate=pow(xk2-xk1,2)/(xk2-2*xk1+xk);
		else
			compensate=0;
		//这里用的是xk2,再对其进行补偿
		xk1=xk2-compensate;
		error=xk1-xk;
		xk=xk1;
		cout<<"the iteration result is "<<xk1<<endl;
	}
	return xk1;
}
发布了99 篇原创文章 · 获赞 29 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_44586750/article/details/103203960