2017-07-27 14 views
0

state_type ublas::vector<std::complex<double>>に '高密度出力'が含まれていますが、 のrunge_kutta_dopri5ステッパーでコンパイルすると次のエラーが表示されます。boost_deintのmake_dense_outputでエラーC2440をコンパイルします

C2440 'リターン':から変換できません 'のstd ::複雑な' 'ダブル' に、数値の\ odeint \ステッパーの\ controlled_runge_kutta.hpp \ブーストで89

#include <iostream> 
#include <complex> 
#include <boost/numeric/ublas/blas.hpp> 
#include <boost/numeric/ublas/vector.hpp> 
#include <boost/numeric/ublas/vector_proxy.hpp> 
#include <boost/numeric/ublas/assignment.hpp> 
#include <boost/numeric/ublas/matrix.hpp> 
#include <boost/numeric/ublas/io.hpp> 
#include <boost/numeric/odeint.hpp> 

using namespace boost::numeric::odeint; 
namespace bnu = boost::numeric::ublas; 

typedef bnu::vector<std::complex<double>> state_type; 

struct solver_test 
{ 
    state_type & m_a; 
    solver_test(state_type& a): m_a(a) { } 

    void operator()(const state_type &x, state_type &dxdt, double t) const 
    { 
     // dummy! 
     dxdt = element_prod(x, m_a); 
    } 
}; 

struct observer 
{ 
    std::vector<double> & m_tm; 
    std::vector<state_type> & m_out; 

    observer(std::vector<double>& tm, std::vector<state_type> & out) 
     :m_tm(tm), m_out(out) { } 

    template< class State > 
    void operator()(const State &x, double t) const 
    { 
     m_tm.push_back(t); 
     m_out.push_back(x); 
    } 
}; 

int main(int argc, char **argv) 
{ 
    std::vector<double> tm; 
    std::vector<state_type> out; 
    state_type a_vec(10); 
    std::fill_n(a_vec.begin(), 10, std::complex<double>(1.0, 0.5)); 

    state_type noise(10); 
    std::fill_n(noise.begin(), 10, std::complex<double>(1.5, 1.5)); 

    const double dt = 0.1; 

    typedef runge_kutta_dopri5<state_type> dp_stepper_type; 

    integrate_const(make_dense_output(1.0e-6, 1.0e-3, dp_stepper_type()), 
     solver_test(a_vec), noise, 0.0, 10.0, dt, observer(tm, out)); 

    // This works 
    //integrate_const(dp_stepper_type(), 
    // solver_test(a_vec), noise, 0.0, 10.0, dt, observer(tm, out)); 

    return 0; 
} 

私は1_64_0ブーストを使用していますMSのVisualでスタジオコミュニティ2017. 私は何が欠けていますか?

答えて

0

この問題の他の理由から、state_type変数には次の回避策を使用しました。

typedef std::vector<std::complex<double>> state_type; 

Iは行列演算を活用するboost::numeric::ublas内部ソルバー(関数オブジェクト)を使用しました。それは完璧ではありませんが、それは働いた。

関連する問題