gpt4 book ai didi

boost - boost.odeint 中任意类型的要求

转载 作者:行者123 更新时间:2023-12-01 11:52:30 24 4
gpt4 key购买 nike

有一些使用 arbitrary precision 的例子和 matrices在 boost.odeint( boost 常微分方程求解器)中。

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

我应该为原子重载哪些操作?+、-、最小值、最大值、幂?

在哪个文件中可以查看odeint使用了哪些操作?

更新(一)来自 default algebra , 看起来需要 "+","*"和 abs(), max()

最佳答案

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

一般来说,在 odeint 中有两种特殊化类型的方法。

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

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

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

  • default_operations适用于大多数类型,如 double , float , std::complex<> , ... default_operations仅假设定义了运算符 +、-、*、/以及 abs 等基本函数, max .
  • thrust_operation与推力一起使用

如果我正确理解您的问题,您有一种或多种类型的点可以存在于不同的坐标系中,因此必须调整此类型的运算符以与 odeint 一起使用。在这种情况下,您可以使用 range_algebra结合“default_operations”:假设您的类型称为 point_type它基本上由 double 组成,这是主要的浮点类型。为了使用您需要的“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 这样的容器中使用你的 point_type , array等。在 odeint 中也有一个例子,展示了如何适应特殊的点类型:solar systempoint types .如果您使用 Boost.Operators 库,这将非常简单。

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

关于boost - boost.odeint 中任意类型的要求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10114639/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com