2017-12-16 10 views
1

私は、微分方程式の右辺の項を定義するクラスを持っています: このクラスは、rhs関数とその派生物を計算する方法を提供します 関数はこのようにベクトルコンテナに格納されますこのクラスは微分方程式の系にも適しています。ここメソッドを書く別の方法

私は変更するだろうメソッドが定義されているインタフェース

template <typename Type = double> 
class rhsODEProblem { 

     using analysisFunction = std::function<const Type(const Type, const std::valarray<Type>)>; 


    public: 



    rhsODEProblem(const std::vector<std::function<const Type(const Type,const std::valarray<Type>)>> numfun , 
        const std::vector<std::function<const Type(const Type,const Type)>> exactfun , 
        const Type,const Type,const Type,const std::valarray<Type>,const std::string) noexcept ; 


    rhsODEProblem(const std::vector<std::function<const Type(const Type,const std::valarray<Type>)>> numfun, 
       const Type, const Type, const Type, const std::valarray<Type>) noexcept ; 


     virtual ~rhsODEProblem() = default ; 

     rhsODEProblem(const rhsODEProblem &) = default ; 
     rhsODEProblem(rhsODEProblem&&) = default ; 
     rhsODEProblem& operator=(const rhsODEProblem&) = default ; 
     rhsODEProblem& operator=(rhsODEProblem&&) = default ; 


     const std::vector<std::function<const Type(const Type,const std::valarray<Type>)>> numericalFunction ; 

     const std::vector<std::function<const Type(const Type,const Type)>> analiticalFunction ; 


     const std::vector<analysisFunction>& f = numericalFunction ; 


     const auto dfdt(std::size_t indx , const Type t , const std::valarray<Type> u) { 
      return (f[indx](t, u+eps)-f[indx](t,u))/eps ; 
     } 


     auto setRhs (const std::vector< 
        std::function<const Type(const Type,const std::valarray<Type>)>> numfun) noexcept 
     {  

     for(auto i=0 ; i < numfun.size() ; i++) 
     { 
      numericalFunction.push_back(numfun.at(i)) ; 
     } 
     } 

     auto setExact(const std::vector<std::function<const Type(const Type,const Type)>> exactfun) noexcept 
     { 
      for(auto i=0 ; i < exactfun.size(); i++) 
      { 
      analiticalFunction.push_back(exactfun.at(i)); 
      } 
     } 

     auto solveExact() noexcept ; 

     const Type t0() const noexcept { return _t0 ;} 
     const Type tf() const noexcept { return _tf ;} 
     const Type dt() const noexcept { return _dt ;} 
     const std::valarray<Type> u0() const noexcept { return _u0 ;} 
     const std::string fname()  const noexcept { return filename ;} 


//--- 
    private: 

        Type _t0 ; // start time 
        Type _tf ; // final time 
        Type _dt ; // time-step 
    std::valarray<Type> _u0 ; // iv 

    std::string filename ; 

    Type eps = 1e-12 ; 


}; 
私は、次の構文 dfdt[index](t , u_valarray)を使用してそれを呼び出す代わりに dfdt(index, t, u_valarray)ことができる方法でメソッドdfdtを変更したい

どのようにしてこの方法を変更できますか?あなたの答えのための

EDIT感謝私の場合、それはするつもりので:

foo_helper(foo &, int index); 
      operator()(int n, Type t, std::valarray<Type> u); 

右?

EDITいいえ私はポイントを取得しませんでした。

class dfdx { 
     public: 
      dfdx(rhsODEProblem<Type> &r , int index_) : index{index_ } {} 
      void operator()(Type t, std::valarray<Type> u){ 
        return (f[index](t, u + eps)-f[index](t,u))/eps ; 
      } 
     int index ; 
    }; 

    dfdx operator[](std::size_t index) { 
     return dfdx(*this, index); 
    } 

が、私はこの方法でそれを呼び出す:私は書い

rhs.dfdx[j](t , uOld)) 

が、私はエラーを得た:

BackwardEulerSolver.H:114:50: error: invalid use of ‘class mg::numeric::odesystem::rhsODEProblem<double>::dfdx’ 
            (1- dt() * rhs.dfdx[j](t , uOld)) ; 
               ~~~~^~~~ 
+0

これは、XYの問題のように思えます。なぜあなたは 'dfdt(index、t、u_valarray)'の代わりに 'dfdt [index](t、u_valarray)'を使いたいのですか?いずれにしても、 'dfdt()'メンバ関数を削除し、2つの引数を受け取る関数オブジェクトを返す 'operator []()'を実装する 'dfdt'という名前のオブジェクトを作成します。 – Peter

答えて

1

私は方法のdfdtを変更したいです次の構文を使用して呼び出すことができる方法dfdt[index](t , u_valarray)dfdt(index, t, u_valarray)の代わりに私は変更できます この方法 ?

あなたはインデックス演算子([])をオーバーロードすることを行うには、呼び出し演算子(())をオーバーロード内部ヘルパー型を返すことができます。ここで

はスケッチです:

class foo { 
    class foo_helper; 
    friend class foo_helper; 
public: 
    class foo_helper { 
    public: 
      foo_helper(foo &, int index); 
      void operator()(int n, double y); 
    }; 
    foo_helper operator[](int index) { 
      return foo_helper(*this, index); 
    } 
}; 
+0

質問の 'dfdt()'がメンバ関数であり、 'operator []()'を持つクラスのインスタンスではないという事実がありません。 – Peter

+0

@Peter私が提案したような構造でこのメンバ関数を呼び出す方法はありませんか? – user0042

関連する問題