我想用odeint解决僵硬的颂歌。我正在关注this(rosenbrock4_dense_output步进器)但是,我的功能可以快速增长,所以如果x(t)> xMAX,我想停止集成。
在这个question中,他们有一个解决方案但是因为我是c ++的新手,所以在使用rosenbrock4_dense_output步进器时我不知道如何实现这个。
我想看看如何专门为rosenbrock4_dense_output步进器编写这个。
答案 0 :(得分:1)
目前,使用odeint并不容易。如果您可以使用范围库here,则可以合并for_each
和find_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;
}
}