Eigen :: VectorXd和Boost :: Odeint,不起作用

问题描述 投票:0回答:1

我正在测试Eigen :: VectorXd作为boost :: odeint的state_type。我使用此代码:

#include <Eigen/Eigen>
#include <boost/numeric/odeint.hpp>
#include <boost/numeric/odeint/external/eigen/eigen_algebra.hpp>

#include <iostream>
#include <vector>

template<class T>
struct push_back_state_and_time
{
    std::vector<T>& m_states;
    std::vector< double >& m_times;

    push_back_state_and_time( std::vector<T> &states ,std::vector<double> &times )
    : m_states(states) , m_times(times) { }

    void operator()(const T &x ,double t )
    {
        m_states.push_back(x);
        m_times.push_back(t);
    }
};

template<class T>
struct write_state
{
    void operator() ( const T &x, const double t ) {
        std::cout << t << "\t";
        for(size_t i = 0; i < x.size(); ++i)
            std::cout << x[i] << "\t";
        std::cout << std::endl;
    };
};

template<class T>
class odeClass {
private:
    double Ka, Kel, Vd;
public:
    odeClass(double ka, double kel, double vd) : Ka(ka), Kel(kel), Vd(vd) {};
    void operator() (const T &x, T &dxdt, const double t) {
        dxdt[0] = - Ka * x[0];
        dxdt[1] = Ka * x[0] - Kel * x[1];
    };
};

void testODE_Eigen() {
    double Ka = 0.195, Vd = 13.8, Kel = 0.79 / Vd;
    Eigen::VectorXd x(2);
    x << 40 / Vd, 0.0;

    odeClass<Eigen::VectorXd> myClass(Ka, Kel, Vd);

    boost::numeric::odeint::runge_kutta4<Eigen::VectorXd, double, Eigen::VectorXd, double, boost::numeric::odeint::vector_space_algebra> stepper;

    size_t steps = integrate_adaptive( stepper, myClass, x ,0.0 ,100.0 ,0.5 ,write_state<Eigen::VectorXd>() );
}

void testODE_Vector() {
    double Ka = 0.195, Vd = 13.8, Kel = 0.79 / Vd;
    std::vector<double> x = { 40 / Vd, 0.0 };

    odeClass<std::vector<double>> myClass(Ka, Kel, Vd);

    boost::numeric::odeint::runge_kutta4<std::vector<double>> stepper;

    size_t steps = integrate_adaptive( stepper, myClass, x ,0.0 ,100.0 ,0.5 ,write_state<std::vector<double>>() );
}

int main()
{
    testODE_Eigen();
    return 0;
}

运行函数testODE_Vector();, it works perfectly, but when runningtestODE_Eigen();`我得到了第一个集成步骤,一个断言停止:“断言失败:索引> = 0 &&索引

任何线索?

谢谢。

c++ eigen odeint
1个回答
0
投票

似乎您在使用的Eigen库中未通过断言。对于类似Assertion failed: index >= 0 && index < size()的消息,库可能正在尝试在内部迭代向量,并在尝试访问向量之前检查向量是否有效。我会检查您传入的对象,并确保它们有效。

© www.soinside.com 2019 - 2024. All rights reserved.