Boost :: odeint

时间:2016-02-26 15:56:58

标签: c++ boost dynamic eigen

我正在尝试使用动态特征矩阵和带有boost :: odeint的向量。原因是我想解决由任意大小的用户输入定义的问题。问题可以通过以下形式在状态空间方程中捕获:x' = A*x + B*uhttps://en.wikipedia.org/wiki/State-space_representation),它基本上是boost :: odeint所需的dxdt()函数。

以下代码是我正在尝试做的一个例子:

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

typedef Eigen::VectorXd state_type;

state_type x;
Eigen::MatrixXd A;

void ODE_function (const state_type &x, state_type &dxdt, double)
{
    dxdt = A * x;
}

void write_states(const state_type &x, const double t)
{
    std::cout << t << "\t";
    for (int i = 0; i < x.size(); i++)
    {
        std::cout << *(x.data()+i) << "\t";
    }
    std::cout << std::endl;
}

int main()
{
    int nr_of_states;

    std::cout << "How many (random) states would you like to simulate?: ";
    std::cin >> nr_of_states;
    std::cout << std::endl;

    x = state_type(nr_of_states);
    A = Eigen::MatrixXd(nr_of_states, nr_of_states);

    srand(365);

    for (int i = 0; i < A.size(); i++)
    {
        *(A.data()+i) = ((double)rand()/(double)RAND_MAX);
    }

    for (int i = 0; i < x.size(); i++)
    {
        *(x.data()+i) = i;
    }

    typedef runge_kutta_dopri5<state_type, double, state_type, double, vector_space_algebra> stepper;
    integrate_adaptive(stepper(), ODE_function, x, 0.0, 25.0, 0.1, write_states);

    std::cout <<std::endl << "final state vector: " << std::endl << x << std::endl;

    return 0;
}

用户可以输入系统中的状态量,因此为了简洁示例,状态矩阵A和初始状态值被赋予任意值。然后使用Boost :: odeint来求解状态空间方程。编译上面的代码失败,返回以下错误消息:

  

cc1plus.exe:内存不足,分配174479字节

当我排除以下两段代码时,所有内容都可以正常编译:

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

typedef runge_kutta_dopri5<state_type, double, state_type, double, vector_space_algebra> stepper;
integrate_adaptive(stepper(), ODE_function, x, 0.0, 100.0, 1.0, write_states);

如果现在再次包含<boost/numeric/odeint.hpp>,编译器将返回相同的错误消息。我试图在源文件上使用UFT8和UFT16编码,但无济于事。

我将非常感谢能够通过建议或解决方案帮助解决这个问题的人

0 个答案:

没有答案