结合之前博客中的代码对两种方法的抽象
如果真有朋友看完了我之前的几篇博客, 我真的挺感激。
而如果他是一位细心的人, 他应该会发现, 使用平均阻尼法和牛顿法求根的过程中,其根本的思路还是通过求不动点的方式来获得方程的根。
也就是, 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);
}