Taylor展開

13 Oct

Taylor展開を計算せよといわれてつい思い出すのはC++ Templateによるコンパイル時計算。
演習の注意書きに
「使用言語は問わない。ただし、作成するプログラムの性能には常に注意すること」
と書いてある。性能に注意して作成すれば・・・定数化するのは当然ともいえるが・・・;

でもふと思い立ったので、iteratorやらboost::lambdaやらその辺の勉強をすべく、変なことに挑戦。

結局こんな感じ。


<?php
using namespace std;
 using namespace boost;
 using namespace boost::lambda;
 
 
 double taylor(int nfunction1<doubleintfunc){
  return accumulate(
    make_transform_iterator(make_counting_iterator(0),func),
    make_transform_iterator(make_counting_iterator(n),func),
   0.0);
}
 
 double fact(int n){
  if(n<=1)return 1.0;
  else return n*fact(n-1);
}
 
 
 int main(){
  double (*dpow)(double,double) = &pow;//use double version
  cout << taylor(15,
                 (bind(dpow,-5.5,_1) / bind(fact,_1))
                 ) << endl;
 
  cout << 1/taylor(15,
                 (bind(dpow,5.5,_1) / bind(fact,_1))
                 ) << endl;
  cout<<exp(-5.5);
}
 ?>

Leave a Reply

Your email address will not be published.