有一些在boost.odeint中使用arbitrary precision和matrices的例子(boost普通微分方程求解器)。
我想在不同类型的坐标(笛卡尔,极坐标或动作角度)中使用odeint原子。
我应该为原子重载哪些操作? +, - ,min,max,pow?
我可以在哪个文件中查找odeint使用的操作?
更新(1) 来自default algebra,它看起来需要“+”,“*”和abs(),max()
答案 0 :(得分:5)
对于一个相当冗长的答案感到抱歉,但我觉得某种澄清会有所帮助:
通常,在odeint中有两种专门化类型的方法。
一种方法是专门化代数,这些代数被认为可以适应迭代容器或集合的方式,如std::vector
,std::array
,ublas::matrix
等。在odeint中存在一些预定义的代数:
range_algebra
适用于实现boost.range fusion_algebra
用于编译时序列vector_space_algebra
将迭代指向操作。thrust_algebra
用于推力 - 一个类似STL的CUDA框架适应特殊类型的第二种可能性是允许您指定如何对容器元素执行基本操作的操作。这里存在一些预定义的操作
default_operations
适用于大多数类型,例如double
,float
,std::complex<>
,... default_operations
仅假设运营商+, - ,* ,/的定义以及abs
,max
等基本功能。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 );
我认为这就是所需要的。然后,您应该能够在vector
,array
等容器中使用您的point_type。在odeint中还有一个示例,展示如何调整特殊点类型:solar system with {{ 3}}。如果您使用Boost.Operators库,这很容易。
编辑:修正了一些拼写错误。