2012-08-01

SCIP in C++11 ― 1.3.3節 その2


関数の不動点の探索・平均緩和法と問題1.35
ラムダの具体的な型は実装依存なので、ラムダの型はautoを使うか、
テンプレートパラメタにするか、
functionラッパを使って捕まえる必要がある。
特にテンプレートなどとの適合性が高いのはfunctionラッパ。
またラムダで再帰をやるときは、
一度functionラッパで関数名の宣言だけしておいて、
ラムダの定義のところで関数名をキャプチャしなければならない。

-----
(const function<double(double)>& f,
 const double firstGuess)
{
    const double tolerance(0.00001);
    const function<bool(double,double)> isCloseEnough
        =[tolerance](const double v1,const double v2)
        {return(abs(v1-v2)<tolerance);};
    function<double(double)> Try;
    Try=[&f,&isCloseEnough,&Try](const double guess)->const double{
        const double next(f(guess));
        if(isCloseEnough(guess,next)){return(next);}
        else{return(Try(next));}
    };
    return(Try(firstGuess));
}

const function<double(double,double)> average=
    [](const double a,const double b){return((a+b)/2.0);};
const function<double(double)> sqrtFixed=
    [](const double x)
{
    return(fixedPoint([x](const double y){return(average(y,x/y));},1.0));
};

int main(int argc, char** argv)
{
    cout<<setprecision(16)<<"Solution of x=cos(x): x="
        <<fixedPoint([](const double x){return(cos(x));},1.0)<<endl;
   
    cout<<setprecision(16)<<"Solution of x=sin(x)+cos(x): x="
        <<fixedPoint
        ([](const double x){return(sin(x)+cos(x));},1.0)<<endl;
   
    cout<<setprecision(16)<<"sqrt(2)="<<sqrtFixed(2.0)<<endl;
   
    const function<double(double)> goldenRatioEquation=
        [](const double x){return(1.0+1.0/x);};
    cout<<endl<<"Excersize1.35:"<<endl;
    cout<<setprecision(16)<<"golden ratio="
         <<fixedPoint(goldenRatioEquation,1.0)<<endl;


    return(0);
}
-----
出力
-----
Solution of x=cos(x): x=0.7390822985224024
Solution of x=sin(x)+cos(x): x=1.258731596297117
sqrt(2)=1.41421356237469

Excersize1.35:
golden ratio=1.618032786885246

0 件のコメント :

コメントを投稿