使用odeint控制时间步长(Boost)

时间:2016-06-09 05:09:18

标签: c++ boost odeint

我正在尝试通过以下示例使用ODEINT库来学习解决ODE问题。但是,当我输出结果时,时间步长只是跳过0; 1; 5.5; 25 ...有没有办法控制这个时间步骤,使其增加" 1"。谢谢!

#include <iostream>
#include <boost/array.hpp>

#include <boost/numeric/odeint.hpp>

using namespace std;
using namespace boost::numeric::odeint;

const double sigma = 0.0018;


typedef std::vector< double > state_type;

void my_ode( const state_type &x , state_type &dxdt , int t )
{
    dxdt[0] = sigma * x[0]*( 1 - x[0] );

}

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

int main(int argc, char **argv)
{
    state_type x(1); // Initial condition, vector of 1 element (scalar problem)
     x[0] = 0.001;
    integrate( my_ode , x , 0.0 , 6000.0 , 1.0 , write_ode );
}

1 个答案:

答案 0 :(得分:0)

是的,有一种简单的方法可以做到这一点。本教程充满了各种示例。

您需要定义特定的解算器。一个好的选择可能是密集的输出求解器,它具有步长控制,让人们可以在任意时间步长计算解。它可能像

一样使用
// not tested
state_type x(1);
x[0] = 0.001;
auto rkd = runge_kutta_dopri5<state_type>{};
auto stepper = make_dense_output(1.0e-6, 1.0e-6, rkd);
integrate_const(stepper, x, 0.0, 6000.0, 1.0, write_ode);