関数の不動点の探索・平均緩和法と問題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 件のコメント :
コメントを投稿