如何使用C ++ Boost odeint库解决这个常微分方程

时间:2016-01-17 19:52:26

标签: c++ boost odeint

使用boost c ++ odeint库,如何解决以下常微分运动方程,

  

z''=-n²·z。

上述ODE的分析解决方案

  

z(t)=(z0'/ n)·sin(n·t)+ z0·cos(n·t)。

解决方案尝试按照评论(1月17日23:01)由OP回答

我的节目是:

void ode( const state_type &z , state_type &dzdt , double t ) { 
    dzdt[0] = z[1]; 
    dzdt[1] = -1 * z[0] * w * w; 
} 

void write_ode( const state_type &z , const double t ) {
    cout << t << '\t' << z[0] << '\t' << z[1] << endl; 
} 

int main { ... 

    integrate( ode , z , t , 1000 , 0.1 , write_ode ); 
}

但是,积分函数只返回z0和z0'的值。我需要找到z(t)的值。

1 个答案:

答案 0 :(得分:2)

您可以使用标准方法转换N维的一阶ODE的N阶微分方程。在您的情况下,这是:

x = z
y = dz/dt

dx/dt = y
dy/dt = n^2 x

您可以轻松地将其放入odeint的任何解算器中。但是,你的ODE似乎是汉密尔顿主义者 - 你也可能会想到一个辛解算器。它们保存了相空间体积和能量,仅仅是#34;围绕初始能量振荡。 Odeint已经实现了两个辛解算器。