C++ Can';我不能让BOOST odeint和Adams Bashforth Moulton一起工作
我在从BOOST odeint库获取Adams Bashforth Moulton方法时遇到了一些问题。我已经成功地使用了Bulirsch Stoer,但出于某种原因,亚当斯·巴什福思·莫尔顿(Adams Bashforth Moulton)只要我尝试使用大于2的订单,就会返回nan。如果我使用顺序1或2,我会得到双倍的正确答案。我已将代码缩减为:C++ Can';我不能让BOOST odeint和Adams Bashforth Moulton一起工作,c++,boost,C++,Boost,我在从BOOST odeint库获取Adams Bashforth Moulton方法时遇到了一些问题。我已经成功地使用了Bulirsch Stoer,但出于某种原因,亚当斯·巴什福思·莫尔顿(Adams Bashforth Moulton)只要我尝试使用大于2的订单,就会返回nan。如果我使用顺序1或2,我会得到双倍的正确答案。我已将代码缩减为: #include <iostream> #include <boost/array.hpp> #include <bo
#include <iostream>
#include <boost/array.hpp>
#include <boost/numeric/odeint.hpp>
#include <boost/version.hpp>
typedef boost::array<long double, 2> state_type;
using namespace boost::numeric::odeint;
class Boost_odeint_rhs{
public:
Boost_odeint_rhs(){
}
void operator() (const state_type &x, state_type &dxdt, const double t)
{
dxdt[0] = 1;
dxdt[1] = 2;
}
};
int main() {
std::cout << "using boost "
<< BOOST_VERSION / 100000 << "."
<< BOOST_VERSION / 100 % 1000 << "."
<< BOOST_VERSION % 100 << std::endl;
std::cout << "integrating vector [1,2] over (0,1)" << std::endl;
Boost_odeint_rhs rhs;
state_type Bint;
Bint[0] = 0.0;
Bint[1] = 0.0;
adams_bashforth_moulton< 2 , state_type > stepper;
//bulirsch_stoer< state_type > stepper( 1e-5 , 0.0 , 0.0 , 1.0 );
integrate_adaptive( stepper , rhs , Bint , 0.0 , 1.0 , 1e-3 );
std::cout << "returned integral = " << Bint[0] << " "<< Bint[1] << std::endl;
}
#包括
#包括
#包括
#包括
typedef boost::数组状态_类型;
使用名称空间boost::numeric::odeint;
等级提升\u odeint\u rhs{
公众:
Boost_odeint_rhs(){
}
void运算符()
{
dxdt[0]=1;
dxdt[1]=2;
}
};
int main(){
std::cout看起来像一个奇怪的错误。当我改变
typedef boost::array< long double , 2 > state_type
typedef boost::数组状态类型
到
typedef boost::数组状态类型
这是可行的。但这当然不是一个真正的解决方案,但也许这是你的一个解决办法。尽管如此,我正在努力找到问题并提供解决方案
更新:这是odeint中的一个bug。但是它已经被修复,并且将在下一个版本的boost中提供修复(应该很快出现)。您也可以使用odeint中的当前版本。这样做了,它起了作用,谢谢!当您说下一个版本的boost时,您是指1.56(目前处于beta测试阶段)或者之后的那一个是的,我的意思是1.56。它应该很快就会出来。Boost 1.56现在出来了。
typedef boost::array< double , 2 > state_type