私は、微分方程式の右辺の項を定義するクラスを持っています: このクラスは、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)) ;
~~~~^~~~
これは、XYの問題のように思えます。なぜあなたは 'dfdt(index、t、u_valarray)'の代わりに 'dfdt [index](t、u_valarray)'を使いたいのですか?いずれにしても、 'dfdt()'メンバ関数を削除し、2つの引数を受け取る関数オブジェクトを返す 'operator []()'を実装する 'dfdt'という名前のオブジェクトを作成します。 – Peter