迭代算法

一、产生背景

 求解一元高次方程、线性和非线性方程组、曲线拟合等问题,提出了很多迭代法来近似求解这类问题。

 常见的有:梯度法、最小二乘法、牛顿迭代法。

 只要解收敛,求解的过程就是一种不断用变量旧值递推新值的过程。

二、 基本思想

(1)确定迭代变量:迭代变量一般就是要求解的问题的解,利用迭代递推公式可以不断的由旧值递推出新值。

(2)迭代递推关系是根据旧值计算新值的关系或公式,这是迭代法实现的关键,如果不能确定迭代关系,则无法用迭代法实现算          法。              

(3)确定终止条件。迭代终止条件是控制迭代过程推出的关键条件。    

     迭代终止条件一般有三种假设:                  

   (1)迭代变量已经求得问题的精确值;  

   (2)迭代变量无法得到精确值;   

   (3)制定明确的迭代计算次数。                 

一般情况下,为了防止迭代关系在某个区间上发散(不收敛)使得算法进入死循环,都会把第三个条件作为异常退出条件和其他迭代终止条件配合使用,也就是说,即使无法得到符合条件的解,只要迭代计算次数达到某个限制值,也退出迭代过程。     

三、例子

     计算一个数的平方根,数学上一般用迭代法,常用的迭代递推公式是:
         x_(n+1)=1/2(x_n+a/x_n )
std::pair<bool, double> cl_root(double a, double eps)
{
    double xi = a / 2.0; //初始值用a的一半,很多人的选择
    double xt;
    int count = 0;
    do
    {
        xt = xi;
        xi = (xt + (a / xt)) / 2.0;
        count++; //用于检查是否收敛的计数器
        if (count >= LOOP_LIMIT)
        {
            return {false, 0.0}; //不收敛,返回失败 
        }
    } while (std::fabs(xi - xt) > eps);

    return { true, xi };
}

你可能感兴趣的:(算法)