[计算机数值分析]埃特金算法加速迭代法求根过程

Posted Spring-_-Bear

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[计算机数值分析]埃特金算法加速迭代法求根过程相关的知识,希望对你有一定的参考价值。

问题描述

由于前有加速方案需要提供迭代函数 φ(x) 的导数 φ(x)′ 的有关信息而不便于实际应用。若取迭代初值 x₀,迭代一次得 x₁,将 x₁ 迭代一次得 x₂,根据对迭代公式的加工(如下所示),消去估计值 L,则可解出近似根。

由于:
x1 = φ(x0)                        x* - x1 ≈ L(x* - x0)
x2 = φ(x1)                        x* - x2 ≈ L(x* - x1)
故有:
x* ≈ x2 - (x2-x1)2 / (x2-2x1+x0)

若以上式右端得出得结果作为新的改进值,则这样构造出得加速公式不再含有关于导数的信息,但它需要使用两次迭代值进行加工。上述方法称为埃特金(Aitken)加速方法。其具体计算公式如下:
(1)迭代: x₁ = φ(x₀)
(2)迭代第二次:x₂ = φ(x₁)
(3)加权平均改进: x₂ = x₁ - (x₁ - x₂)²/(x₁ - 2x₂ + x₀)
判断是否符合精度要求,符合要求则结束迭代,否则继续。

运行示例

未使用加速算法

使用Aitken加速算法


由此可见,未使用加速算法时,相同条件下,需要迭代 9 次才能找到符合精度要求得近似根,而使用Aitken加速算法时仅仅只需要迭代 2 次,显然,Aitken加速算法效果显著。

源码

//程序实现用迭代法求方程的根
#include<iostream>
#include<cmath>
using namespace std;

//用户自定义的迭代函数f(x)
double function(double x)

	double result = pow(x + 1, 1.0 / 3);
	return result;


int main(void)

	//x0为迭代初值,x1=f(x0)为一次迭代值;x2=f(x1)为二次迭代值;
	//x3为利用埃特金加速公式处理后的近似解
	double x0, x1, x2, x3;
	double accrucy, item;    accrucy为精度;
	int n, k = 1;   //n为允许的最大迭代次数

	cout << "请输入迭代初值:";
	cin >> x0;
	cout << "请输入精度:";
	cin >> accrucy;
	cout << "请输入您想要的最大迭代次数:";
	cin >> n;

	do 
	
		x1 = function(x0);
		x2 = function(x1);

		x3 = x2 - pow(x2 - x1, 2) / (x2 - 2 * x1 + x0);   //对一、二次迭代值进行加工得x3

		if (abs(x0 - x3) < accrucy)     //根的近似解符合精度要求,输出近似根
		   
			cout << "近似解为:" << x3;
		
		else    //继续下一次迭代,直至找到符合精度要求的根或最大迭代次数用完
		    
			if (k > n)    //允许迭代n次,当迭代次数大于n时结束迭代
			    
				cout << "迭代次数耗尽,迭代结束!\\n未找到符合精度要求的根!!!" << endl;
				break;
			
			else 
			
				//输出本次迭代信息
				cout << "第" << k << "次迭代!\\t迭代函数的值为:" << x3 << "\\t此次迭代精度为:" << abs(x3 - x0) << endl;
				//交换x0与x2,为下一次迭代做好准备
				item = x0;
				x0 = x3;
				x3 = item;
				k++;
			
		
	 while (abs(x0 - x3) >= accrucy);   //循环进行条件为找到的根不符合精度要求

	return 0;

以上是关于[计算机数值分析]埃特金算法加速迭代法求根过程的主要内容,如果未能解决你的问题,请参考以下文章

[计算机数值分析]迭代法求根过程的加速

[计算机数值分析]迭代法求根过程的加速

《数值分析》-- 非线性方程的数值解法

《数值分析》-- 非线性方程的数值解法

《数值分析》-- 非线性方程的数值解法

[计算机数值分析]迭代法求方程的根