boost.odeint中任意类型的要求

时间:2012-04-11 22:05:10

标签: boost operator-overloading numeric numerical-methods

有一些在boost.odeint中使用arbitrary precisionmatrices的例子(boost普通微分方程求解器)。

我想在不同类型的坐标(笛卡尔,极坐标或动作角度)中使用odeint原子。

我应该为原子重载哪些操作? +, - ,min,max,pow?

我可以在哪个文件中查找odeint使用的操作?

更新(1) 来自default algebra,它看起来需要“+”,“*”和abs(),max()

1 个答案:

答案 0 :(得分:5)

对于一个相当冗长的答案感到抱歉,但我觉得某种澄清会有所帮助:

通常,在odeint中有两种专门化类型的方法。

一种方法是专门化代数,这些代数被认为可以适应迭代容器或集合的方式,如std::vectorstd::arrayublas::matrix等。在odeint中存在一些预定义的代数:

  • range_algebra适用于实现boost.range
  • 范围概念的所有容器
  • fusion_algebra用于编译时序列
  • vector_space_algebra将迭代指向操作。
  • thrust_algebra用于推力 - 一个类似STL的CUDA框架

适应特殊类型的第二种可能性是允许您指定如何对容器元素执行基本操作的操作。这里存在一些预定义的操作

  • default_operations适用于大多数类型,例如doublefloatstd::complex<>,... default_operations仅假设运营商+, - ,* ,/的定义以及absmax等基本功能。
  • thrust_operation用于推力使用

如果我正确理解了您的问题,您可以使用一种或多种类型的点来生活在不同的坐标系中,因此这类操作符必须适应odeint。在这种情况下,您可以将range_algebra与'default_operations'结合使用:假设您的类型称为point_type,它基本上由双浮点类型(主浮点类型)组成。要使用'default_operations',您需要

  • point_type operator+( point_type , double );
  • point_type operator+( double , point_type );
  • point_type operator+( point_type , point_type );
  • point_type operator*( point_type , double );
  • point_type operator*( double , point_type );
  • point_type operator/( point_type , double );
  • double abs( point_type );

我认为这就是所需要的。然后,您应该能够在vectorarray等容器中使用您的point_type。在odeint中还有一个示例,展示如何调整特殊点类型:solar system with {{ 3}}。如果您使用Boost.Operators库,这很容易。

编辑:修正了一些拼写错误。