odeint streaming observer and related questions

前端 未结 1 1220
你的背包
你的背包 2021-01-14 07:48

I have a system of 4 coupled equations to solve and a parameter Gamma[i] to iterate over. Since I am quite new to C++, my code is a very rudimentary. If it looks sophisticat

1条回答
  •  离开以前
    2021-01-14 08:23

    Question #1 :

    I do not understand exactly what kind of output you need. But if you want to write the result after each iteration you can implement an output observer like this:

    struct output_observer
    {
        string filename_;
        size_t count_;
        output_observer( const string &filename ) : filename_( filename ) , count_( 0 ) { }
        void operator()( const state_type &x , time_type dt )
        {
            char fn[512] = "";
            sprintf( fn , "%s_%04lu.csv" , filename_.c_str() , count_ );
            ofstream fout( fn );
            for( size_t i=0 ; i

    You can apply this observer simply by

    integrate_const( runge_kutta4< vector >() , nli_obj , x ,
        0.0 , 3.0 , dz , output_observer( "filename" ) );
    

    Is this the desired functionality?

    Question #2 :

    It is not possible to see the intermediate e steps of runge_kutta4. The coefficients are the standard ones for the classical Runge-Kutta method: http://en.wikipedia.org/wiki/Runge%E2%80%93Kutta_methods

    Question #3 :

    odeint has several error steppers, which estimate the error made during one step. You can use for example the Runge_Kutta Cash Karp algorithm;

    runge_kutta_cash_karp54< state_type > rk;
    state_type xerr;
    rk.do_step( nli_obj , x , t , xerr );
    

    which makes ONE step and estimates the error and writes the error result in xerr.

    0 讨论(0)
提交回复
热议问题