2017-06-15 4 views
0

私はboost odeintを使用して微分方程式を展開しています。 時間と値は、平方根(ガウス誤差伝播を行う)の周りのラッパークラスによって与えられます。boost odeint:カスタムクラスとベクトル空間代数で制御されたステッパー

using Time = Number<double>; 
using Value = Number<double>; 

状態及びその誘導体は、Iはベクトル空間の代数

using Stepper = boost::numeric::odeint::runge_kutta_dopri5<State, Value, Derivative, Time, boost::numeric::odeint::vector_space_algebra>; 
とルンゲ・クッタ-Dopri-5ステッパーを使用宣言

class State : boost::addable<State>, boost::multipliable<State, Time>, boost::dividable<State> 
{ 
public: 
    void Add(Group const& group, Value alpha); 
    Value Get(Group const& group) const; 
    State& operator*=(Time const& time); 
    State& operator+=(State const& state); 
    State& operator/=(State const& state); 
    State abs() const; 
    Value norm_inf() const; 
private: 
    std::map<Group, Value> map_; 
}; 

State abs(State const& state); 

namespace boost 
{ 
namespace numeric 
{ 
namespace odeint 
{ 
template<> 
struct boost::numeric::odeint::vector_space_norm_inf<State> { 
    using result_type = Value; 
    result_type operator()(State const& state) const; 
}; 
} 
} 
} 

using Derivative = State; 

とカスタムクラスによって与えられます。

そして、私は全体のように思考を使用する

auto start_state = GetStart(); 
auto system = GetSystem(); 
auto min = GetMin(); 
auto max = GetMax(); 
auto dt = GetDt; 
auto observer = GetObserver(); 
auto stepper = boost::numeric::odeint::make_controlled<Stepper>(1e-6, 1e-6); 
boost::numeric::odeint::integrate_adaptive(Stepper(), system, start_state, min, max, dt, observer); 

これは魅力のように機能します。しかし、私が最後の2行目で定義した制御されたステッパーを使用していないことに気づくかもしれませんが、私はデフォルトステッパーを使用します。私はコンパイルエラーをfollwoing得る最後の行に代わりにデフォルトStepper()stepper変数を使用しようとする瞬間:

In file included from /home/me/Integrate.cpp:2: 
In file included from /usr/include/boost/numeric/odeint.hpp:35: 
/usr/include/boost/numeric/odeint/stepper/controlled_runge_kutta.hpp:85:17: error: no matching constructor for initialization of 'typename operations_type::rel_error<value_type>' (aka 'rel_error<me::Number<double> >') 
       typename operations_type::template rel_error<value_type>(m_eps_abs , m_eps_rel , m_a_x , m_a_dxdt * abs(get_unit_value(dt)))); 
       ^               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
/usr/include/boost/numeric/odeint/stepper/controlled_runge_kutta.hpp:768:50: note: in instantiation of function template specialization 'odeint::default_error_checker<me::Number<double>, odeint::vector_space_algebra, odeint::default_operations>::error<me::State, me::State, me::State, me::Number<double> >' requested here 
     value_type max_rel_err = m_error_checker.error(m_stepper.algebra() , in , dxdt_in , m_xerr.m_v , dt); 
               ^
/usr/include/boost/numeric/odeint/stepper/controlled_runge_kutta.hpp:716:38: note: in instantiation of function template specialization 'odeint::controlled_runge_kutta<odeint::runge_kutta_dopri5<me::State, me::Number<double>, me::State, me::Number<double>, odeint::vector_space_algebra, odeint::default_operations, odeint::initially_resizer>, odeint::default_error_checker<me::Number<double>, odeint::vector_space_algebra, odeint::default_operations>, odeint::default_step_adjuster<me::Number<double>, me::Number<double> >, odeint::initially_resizer, odeint::explicit_error_stepper_fsal_tag>::try_step<(lambda at /home/me/Integrate.cpp:28:19), me::State, me::State, me::State, me::State>' requested here 
     controlled_step_result res = try_step(system , x , dxdt , t , m_xnew.m_v , m_dxdtnew.m_v , dt); 
            ^
/usr/include/boost/numeric/odeint/stepper/controlled_runge_kutta.hpp:899:16: note: in instantiation of function template specialization 'odeint::controlled_runge_kutta<odeint::runge_kutta_dopri5<me::State, me::Number<double>, me::State, me::Number<double>, odeint::vector_space_algebra, odeint::default_operations, odeint::initially_resizer>, odeint::default_error_checker<me::Number<double>, odeint::vector_space_algebra, odeint::default_operations>, odeint::default_step_adjuster<me::Number<double>, me::Number<double> >, odeint::initially_resizer, odeint::explicit_error_stepper_fsal_tag>::try_step<(lambda at /home/me/Integrate.cpp:28:19), me::State, me::State>' requested here 
     return try_step(system , x , m_dxdt.m_v , t , dt); 
      ^
/usr/include/boost/numeric/odeint/stepper/controlled_runge_kutta.hpp:617:16: note: in instantiation of function template specialization 'odeint::controlled_runge_kutta<odeint::runge_kutta_dopri5<me::State, me::Number<double>, me::State, me::Number<double>, odeint::vector_space_algebra, odeint::default_operations, odeint::initially_resizer>, odeint::default_error_checker<me::Number<double>, odeint::vector_space_algebra, odeint::default_operations>, odeint::default_step_adjuster<me::Number<double>, me::Number<double> >, odeint::initially_resizer, odeint::explicit_error_stepper_fsal_tag>::try_step_v1<(lambda at /home/me/Integrate.cpp:28:19), me::State>' requested here 
     return try_step_v1(system , x , t , dt); 
      ^
/usr/include/boost/numeric/odeint/integrate/detail/integrate_adaptive.hpp:103:22: note: in instantiation of function template specialization 'odeint::controlled_runge_kutta<odeint::runge_kutta_dopri5<me::State, me::Number<double>, me::State, me::Number<double>, odeint::vector_space_algebra, odeint::default_operations, odeint::initially_resizer>, odeint::default_error_checker<me::Number<double>, odeint::vector_space_algebra, odeint::default_operations>, odeint::default_step_adjuster<me::Number<double>, me::Number<double> >, odeint::initially_resizer, odeint::explicit_error_stepper_fsal_tag>::try_step<(lambda at /home/me/Integrate.cpp:28:19), me::State>' requested here 
      res = st.try_step(system , start_state , start_time , dt); 
        ^
/usr/include/boost/numeric/odeint/integrate/integrate_adaptive.hpp:42:20: note: in instantiation of function template specialization 'odeint::detail::integrate_adaptive<odeint::controlled_runge_kutta<odeint::runge_kutta_dopri5<me::State, me::Number<double>, me::State, me::Number<double>, odeint::vector_space_algebra, odeint::default_operations, odeint::initially_resizer>, odeint::default_error_checker<me::Number<double>, odeint::vector_space_algebra, odeint::default_operations>, odeint::default_step_adjuster<me::Number<double>, me::Number<double> >, odeint::initially_resizer, odeint::explicit_error_stepper_fsal_tag>, (lambda at /home/me/Integrate.cpp:28:19), me::State, me::Number<double>, (lambda at /home/me/Integrate.cpp:48:21)>' requested here 
    return detail::integrate_adaptive(
       ^
/usr/include/boost/numeric/odeint/algebra/default_operations.hpp:435:9: note: candidate constructor not viable: no known conversion from 'me::State' to 'me::Number<double>' for 4th argument 
     rel_error(Fac1 eps_abs , Fac1 eps_rel , Fac1 a_x , Fac1 a_dxdt) 
     ^
/usr/include/boost/numeric/odeint/algebra/default_operations.hpp:431:12: note: candidate constructor (the implicit move constructor) not viable: requires 1 argument, but 4 were provided 
    struct rel_error 
     ^
/usr/include/boost/numeric/odeint/algebra/default_operations.hpp:431:12: note: candidate constructor (the implicit copy constructor) not viable: requires 1 argument, but 4 were provided 

私は、odeint::rel_error<me::Number<double>>Number型であることになっていることがわかりますが、製品m_a_dxdt * abs(get_unit_value(dt))することができますrel_errorコンストラクタの4番目のパラメータとして使用される値はStateです。 私はStateクラスのベクトル空間代数を実装する際に間違いを犯したと仮定しますが、間違いをどこで行ったのか分かりません。

時間と値の型を平文doubleに置き換えると、エラーチェッカーが再び機能します。

答えて

0

odeintの指示に間違いがあるようです。 の代わりにabs関数の戻り値の型がValueの場合、コンパイルエラーが無くなると予想します。

関連する問題