boost.odeint中任意类型的要求

boost.odeint中任意类型的要求,boost,operator-overloading,numeric,numerical-methods,Boost,Operator Overloading,Numeric,Numerical Methods,在boost.odeint(boost常微分方程求解器)中有一些使用和的示例 我想在不同类型的坐标(笛卡尔坐标、极坐标或作用角)中使用odeint原子 我应该为原子重载哪些操作? +,-,最小,最大,功率 我可以在哪个文件中查找odeint使用的操作 更新(1) 从中,它看起来需要“+”、“*”和abs(),max()很抱歉回答得太长了,但我觉得某种澄清会有帮助: 通常,在odeint中有两种专门化类型的方法 一种方法是专门化代数,这些代数被认为可以适应在容器或集合上迭代的方式,如std::ve

在boost.odeint(boost常微分方程求解器)中有一些使用和的示例

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

我应该为原子重载哪些操作? +,-,最小,最大,功率

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

更新(1)
从中,它看起来需要“+”、“*”和abs(),max()

很抱歉回答得太长了,但我觉得某种澄清会有帮助:

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

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

  • range\u algebra
    适用于满足boost.range中范围概念的所有容器
  • 编译时序列的融合代数
  • 向量空间代数
    ,它将迭代指向操作
  • 推力代数
    用于推力-CUDA的类似STL的框架
适应特殊类型的第二种可能是允许您指定如何对容器元素执行基本操作的操作。这里存在一些预定义的操作

  • default\u操作
    对大多数类型都有效,如
    double
    float
    std::complex
    <代码>默认\u操作仅假设定义了运算符+、-、*、/,以及诸如
    abs
    max
    等基本功能
  • 推力_操作
    用于推力
如果我正确理解了您的问题,您有一个或多个类型的点可以位于不同的坐标系中,因此必须调整此类型上的运算符以使用odeint。在这种情况下,您可以将
范围\u代数
与“默认\u操作”结合使用:假设您的类型称为
点\u类型
,它基本上由双精度浮点类型组成。为了使用“默认_操作”,您需要

  • 点类型运算符+(点类型,双精度)
  • 点类型运算符+(双精度,点类型)
  • 点类型运算符+(点类型,点类型)
  • 点类型运算符*(点类型,双精度)
  • 点类型运算符*(双精度,点类型)
  • 点类型运算符/(点类型,双精度)
  • 双abs(点式)
我认为这就是所需要的一切。然后,您应该能够在容器中使用点类型,如
向量
数组
,等等。odeint中还有一个示例,演示了如何调整特殊点类型:使用。如果您使用Boost.Operators库,这是非常简单的


编辑:修复了一些打字错误。

我不完全理解。如果要进行坐标变换,则不需要新类型,因为变换的是方程。您的问题是:“对于odeint,我想使用我自己的状态类型。我的状态类型必须支持的最小操作集是什么?”@AndréBergner,是的,您是正确的。