我想用odeint解决一个僵硬的颂歌。我一直在关注this(rosenbrock4_dense_output步进器),但是我的函数可以快速增长,因此如果x(t)> xMAX,我想停止积分。

在这个question中,他们有一个解决方案,但是由于我是c++的新手,所以我不知道在使用rosenbrock4_dense_output步进器时如何实现此功能。

我想看看如何专门为rosenbrock4_dense_output步进器编写此代码。

最佳答案

当前,使用odeint很难做到这一点。如果可以使用范围库here,则可以组合for_eachfind_if算法。

否则,您需要自己编写循环,这也不是那么困难,应该类似于以下内容:

auto stepper = make_dense_output< rosenbrock4< double > >( 1.0e-12 , 1.0e-12 );
auto ode = make_pair( stiff_system() , stiff_system_jacobi() );

double t = 0.0;
double const end_time = 50.0;
double const dt = 0.01;
vector_type x( 2 , 1.0 );
const double y_min = 1.0;

stepper.initialize( x , t , dt );
cout << t << " " << x[0] << " " << x[1] << endl; // or some other output
t += dt;
while( t < end_time )
{
    if( t > stepper.current_time() )
    {
        // perform a real step
        stepper.do_step( ode );
    }
    else
    {
        // perform a dense output step
        stepper.calc_state( t , x );
        cout << t << " " << x[0] << " " << x[1] << endl; // or some other output
        t += dt;
    }
    if( x[1] < y_min ) // or some other condition
    {
        cout << "Bound reached." << endl;
        break;
    }
}

关于c++ - 停止将odeint与刚性ode集成,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33334073/

10-12 19:32