0

对于我正在处理的项目,我需要使用基于迭代器的解决方案,以便在满足某些条件时停止集成。看起来下面的代码,当应用于我们的具体情况时,将起作用。使用 Visual Studio 2010 和 2013 以及 Boost 1.57 时,以下代码可以工作并编译。

 {
      auto stepper = make_controlled( 1.0e-6 , 1.0e-6 , runge_kutta_cash_karp54< state_type > () );
      state_type x = {{ 10.0 , 10.0 , 10.0 }};
      auto iter = boost::find_if( make_adaptive_time_range( stepper , lorenz() , x , 0.0 , 1.0 , 0.01 ) ,
                                             []( const std::pair< const state_type & , double > &x ) 
                                             {return ( x.first[0] < 0.0 ); }
                                             );

      cout << iter->second << "\t" << iter->first[0] << "\t" << iter->first[1] << "\t" << iter->first[2] << "\n";
 }

问题的出现是因为我们也对使用 Bulirsch-Stoer 方法感兴趣。当我尝试如下实现 Bulirsch-Stoer 步进器时:

{
    bulirsch_stoer<state_type> stepper(1e-9, 0.0, 0.0, 0.0);        
    state_type x = {{ 10.0 , 10.0 , 10.0 }};

    auto iter = boost::find_if( make_adaptive_time_range( stepper , lorenz() , x , 0.0 , 1.0 , 0.01 ) ,
                                 []( const std::pair< const state_type & , double > &x ) {
                                    return ( x.first[0] < 0.0 ); } );

            cout << iter->second << "\t" << iter->first[0] << "\t" << iter->first[1] << "\t" << iter->first[2] << "\n";
}

我收到以下编译错误。

 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\xutility(275): error C2582: 'operator =' function is unavailable in 'boost::numeric::odeint::adaptive_time_iterator<Stepper,System,State,StepperTag>'
 1>          with
 1>          [
 1>              Stepper=boost::numeric::odeint::bulirsch_stoer<state_type>,
 1>              System=lorenz,
 1>              State=state_type,
 1>              StepperTag=boost::numeric::odeint::controlled_stepper_tag
 1>          ]
 Etc.

该错误必须与 Visual Studio 有关,因为当我使用 gcc 时编译完全相同的代码。谁能帮我让 Bulirsch-Stoer 步进器在 make_adaptive_time_range 中工作?

谢谢您的帮助!

4

0 回答 0