C++: Typy i obiekty funkcyjne

Sumowanie

Klasy i obiekty funkcyjne

Klasa Polynomial jako klasa funkcyjna

Klasa Polynomial jako klasa funkcyjna

Modyfikacja funkcji Sum

Przykład - metoda Newtona

Przykład: metoda Newtona - implementacja funkcyjna w C++

Oto przykładowa implementacja metody Newtona
template
class Newton{
  private:
    const Function& f;
    const Function& derf;
    const Scalar epsilon;
    const int limit;
  public:
    Newton(const Function& A_f, const Function& A_derf, Scalar A_epsilon, int A_limit):
       f(A_f),derf(A_derf),epsilon(A_epsilon),limit(A_limit){}
  Scalar findRoot(const Scalar x,const int depth) const{
    const Scalar y=f(x);
    if( (y-epsilon) || depth>=limit) return x;
    return findRoot(x-y/derf(x),depth+1);
  }
};

Metoda Newtona dla wielomianów

Przykład: numeryczne liczenie całek

Kod całki Riemanna to rozwinięty kod sumowania:
template<typename Function, typename Scalar>
Scalar RiemInt(Function f,Scalar from, Scalar to, Scalar step){
  Scalar result=Scalar(0);
  for(Scalar s=from;s<to;s+=step){
    result+=f(s)*step;
  }
  return  result;
}

Przypadek złożenia

template<class Op1, class Op2>
class Composition{
  Op1 op1;
  Op2 op2;
public:
  Composition(const Op1& A_op1, const Op2& A_op2):op1(A_op1),op2(A_op2){}
  double operator()(double A_a) const{
    return op1(op2(A_a));
  }
};
template<typename Op1, typename Op2>
inline Composition<Op1,Op2> operator|(const Op1& op1,const Op2& op2){
  return Composition<Op1,Op2>(op1,op2);
}

Funkcje kreujące