结合之前博客中的代码对两种方法的抽象

如果真有朋友看完了我之前的几篇博客, 我真的挺感激。

而如果他是一位细心的人, 他应该会发现, 使用平均阻尼法和牛顿法求根的过程中,其根本的思路还是通过求不动点的方式来获得方程的根。

也就是, 1) 构造合适的函数 2)将函数转化为用于求不动点的函数 3)求转化后函数的不动点

于是, 之前的步骤就可以转化为:

using transformFun = function<dFun(dFun)>;

double FixedPointOfTransform (  dFun g
                              , transformFun transform
                              , cdouble &guess)
{
    return FixedPoint (transform(g), guess);
}

double AverageDampSqrt(cdouble &x)
{
    return FixedPointOfTransform ([x] (cdouble &y)
                                      {return (x / y);}
                                 , AverageDamp
                                 , 1.0);
}

double NewtonSqrt (cdouble &x)
{
  return FixedPointOfTransform ([x] (cdouble &y)
                       {return (pow(y, 2) / x);}
                    , NewtonTransfrom
                    , 1.0);
}

 

posted @ 2015-02-08 15:46  wu_overflow  阅读(129)  评论(0)    收藏  举报