我有 C++ 的答案。它可能不是发布它的最佳位置,但它可能仍然很有趣。(我没有找到更好的放置它的地方,这就是我在寻找 C++ 解决方案时登陆的地方)。
下面是一个 C++ 示例,当变量等于或小于零时停止积分。
#include <iostream>
#include <boost/range/algorithm.hpp>
#include <boost/numeric/odeint.hpp>
using namespace std;
using namespace boost::numeric::odeint;
typedef double state_type;
typedef runge_kutta_cash_karp54< state_type > error_stepper_type;
class Myode{
public:
void operator()(const state_type& x, state_type& dxdt, const double t){dxdt=-1-x;}
static bool done(const state_type &x){return x<=0.0;}
};
int main(int argc, char* argv[]){
Myode ode;
state_type x=10.0;
auto stepper = make_controlled< error_stepper_type >( 1.0e-10 , 1.0e-6 );
auto iter= boost::find_if(make_adaptive_range(stepper,ode,x, 0.0 , 20.0 , 0.01 ),
Myode::done);
cout<<"integration stopped at"<<x<<endl;
return 1;
}
积分在第一次达到小于或等于零的值 x 时停止(参见完成函数)。因此,根据您当前的步长,它可能远低于零。
请注意,这使用 c++11 构造,因此您需要在编译器上启用它。在我的情况下(gcc 4.4),它是通过在编译命令中添加 -std=gnu++0x 来实现的。