使用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步进器?
答案 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 );