使用Eigen和Odeint在dxdt函数内进行矩阵*向量乘法

时间:2015-08-23 17:11:52

标签: c++ matlab eigen eigen3 odeint

我正在尝试用C ++编写一些代码,否则使用Eigen和Odeint可以很容易地在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);
}

非常感谢能够伸出援手的任何人。

2 个答案:

答案 0 :(得分:3)

代码的(Eigen)语法问题如下:

  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()

答案 1 :(得分:1)

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