【问题标题】:Using Eigen with Odeint to do matrix*vector multiplication inside dxdt function在 dxdt 函数中使用 Eigen 和 Odeint 进行矩阵*向量乘法
【发布时间】:2015-08-23 17:11:52
【问题描述】:

我正在尝试使用 Eigen 和 Odeint 用 C++ 编写一些在 MatLab 中很容易编写的代码。但是,我对 Eigen 和 Odeint 库都很陌生,而且我还没有走得太远。如果有人能指出我正确的方向(就如何编码而言),我应该能够从那里得到它。

这大致是我想做的,但无法开始工作(在伪代码中;所有大写字母都是常量):

typedef Eigen::Matrix<double, Dynamic, 1> state_type_1d;
typedef Eigen::Matrix<double, Dynamic, Dynamic> state_type_2d;

state_type Q(N*N,N*N) = ... // initialize Q

void dxdt_fun( state_type_1d &x , state_type_1d &dxdt , double t )
{

    static state_type_2d v(N,N);

    v = (0.5 * (1 + tanh((x-0.5) * GAIN)));
    dxdt = -x*LAMBDA + v.colwise.sum() + v.rowwise.sum(); // needs bsxfun??
    dxdt = dxdt + Q * x; // matrix times vector
}

void main(int argc, char **argv)
{
    state_type_1d u(N,N); 
    srand((unsigned int) time(0));
    u.setRandom(); // picks random numbers from -1 to 1
    runge_kutta_dopri5<state_type_1d,double,state_type_1d,double,vector_space_algebra>stepper;

    integrate_adaptive(stepper, dxdt_fun, u, 0.0, 100.0, 0.01, write_dxdt);
}

非常感谢任何可以伸出援手的人。

【问题讨论】:

    标签: c++ matlab eigen eigen3 odeint


    【解决方案1】:

    您的代码的(特征)语法问题如下:

    1. v.colwise.sum() 应该是 v.colwise().sum()
    2. 同样,v.rowwise.sum() 应该是 v.rowwise().sum()
    3. state_type_1d u(N,N); 是混合向量类型,矩阵构造函数。
    4. v = (0.5 * (1 + tanh((x-0.5) * GAIN))); 似乎是系数向量乘积到矩阵变量中。而且我认为 Eigen 没有内置的 tanh 但我可能是错的。即使是这样,语法错误。如果存在,它应该是(x-0.5).tanh()

    【讨论】:

      【解决方案2】:

      我编写了一个解决方案,其中我同时使用了Eigenodeint。见this link,以双摆为例。

      【讨论】:

        猜你喜欢
        • 2019-06-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-25
        • 2019-03-29
        • 2022-07-06
        • 2016-02-22
        相关资源
        最近更新 更多