首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >不能和亚当斯-巴什福斯-莫尔顿合作

不能和亚当斯-巴什福斯-莫尔顿合作
EN

Stack Overflow用户
提问于 2014-08-06 16:14:23
回答 1查看 706关注 0票数 6

我有一些困难,从BOOST odeint库获得亚当斯-巴什福斯-莫尔顿方法工作。我在Bulirsch-Stoer上取得了成功,但由于某种原因,亚当斯-巴什福斯-穆尔顿每次尝试使用订单> 2时都会返回nan。如果我使用订单1或2,我得到的真实答案是原来的两倍。我已经将我的代码简化为:

代码语言:javascript
运行
复制
#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;
}

我在Ubuntu 14.04上使用BOOST 1.54.0和GCC 4.8.2

提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-06 21:53:14

看上去是个奇怪的错误。当我改变

代码语言:javascript
运行
复制
typedef boost::array< long double , 2 > state_type

代码语言:javascript
运行
复制
typedef boost::array< double , 2 > state_type

它起作用了。当然,这不是一个真正的解决方案,但也许这是一个解决办法。不过,我正试图找出问题的所在,并提供解决办法。

更新:--这是odeint中的一个bug。但是它已经被修复了,并且将在下一个版本的boost中得到修复(很快就会出现)。您还可以使用来自odeint github储存库的当前版本。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25165248

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档