【问题标题】:Stop integration in odeint with stiff ode停止在 odeint 中与僵硬 ode 的集成
【发布时间】:2015-10-25 19:27:49
【问题描述】:

我想用 odeint 解决一个僵硬的 ode。我在关注this(rosenbrock4_dense_output stepper),但是我的函数增长很快,所以如果 x(t)>xMAX,我想停止积分。

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

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

【问题讨论】:

  • 就在上周,我添加了一个示例,该示例可以找到越过某个阈值的确切点:github.com/headmyshoulder/odeint-v2/blob/master/examples/…,它使用 odeint 的迭代器接口和 find_if 来在越过阈值时停止。然后它对交叉点进行二等分,但您可能不需要。要适应 Rosenbrock,您只需更改步进器和 rhs 函数。
  • 这似乎正是我需要的,但我不知道如何使它与 rosenbrock4_dense_output 步进器一起工作。只需将 runge_kutta_dopri5 更改为 rosenbrock4_dense_output,而不是使用 vector_type 的 state_type:其中定义了 vector_Type: typedef boost::numeric::ublas::vector vector_type;不是全部。你介意解释一下我的具体情况会如何改变吗?
  • 您还需要调整 rhs,例如自动颂歌= make_pair(stiff_system(),stiff_system_jacobi()); - 另见下面 headmyshould 的回答

标签: c++ boost odeint


【解决方案1】:

目前,使用 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;
    }
}

【讨论】:

  • odeint 迭代器不能与 rosenbrock_dense_out 一起使用吗?还是你指的是find_if无法访问轨迹的问题?
  • 第二个问题:boost::range::find_if()我们无法访问轨迹并进行观察。
  • 您是否介意明确写下代码将如何使用 rosenbrock4_dense_output 步进器,因为我一直在阅读 odeint 的文档,但我似乎没有正确理解。
  • 好的,完成。 stiff_systemstiff_system_jacobi取自您所指的刚性系统示例。
猜你喜欢
  • 2013-03-16
  • 1970-01-01
  • 1970-01-01
  • 2020-06-05
  • 2019-02-04
  • 1970-01-01
  • 1970-01-01
  • 2011-01-06
  • 1970-01-01
相关资源
最近更新 更多