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

(一)直接迭代

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

/**
 *@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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值