使用C ++ Boost odeint库的二阶微分方程

时间:2014-02-03 11:18:53

标签: c++ boost odeint

使用boost c ++ odeint库,是否可以求解如下定义的二阶微分方程?

m*x''[i] + x'[i] = K*\sum{j=1,N} sin(x[j] - x[i]), where i = 1,2,3..N.
m = 1, K = 1

其中x的初始值是在0到2 * pi之间的N个均匀生成的随机数的向量或阵列。 我想使用odeint的runge_kutta步进器整合上面的等式?

我可以通过写上面的eqn来解决它。在两个一阶微分方程中,但是 那么在那种情况下如何编写或修改odeint步进器?

1 个答案:

答案 0 :(得分:4)

只需将方程转换为一阶ODE,并使用长度为2 N的状态类型。前N个条目现在只处理x[i],而后N个条目指的是速度x'[i]

void ode( state_type const& x , state_type &dxdt , double t )
{
    for( size_t i=0 ; i<N ; ++i )
    {
        double sum = 0.0;
        // calculate sum
        dxdt[i] = x[i+N];
        dxdt[i+N] = K * sum;
    }
}

完整示例可能看起来像

size_t N = 512;
typedef std::vector< double > state_type;
state_type x( 2 * N );
// initialize x
double t_start = 0.0 , t_end = 10.0 , dt = 0.01;
odeint::integrate( ode , x , t_start , t_end , dt );