状态类型提升:在boost中融合:odeint

时间:2013-03-10 17:16:49

标签: c++ boost odeint

我想用boost::odeint来解决不同变量集合的微分方程 - 比如std::vector类型并行。一种解决方案当然是将所有变量组合成一个大的向量,然后将其用作状态变量。

但是,我更喜欢更优雅的解决方案,例如使用boost::fusion作为状态类型,然后保存不同的向量。据我所知postingrelated problem的实现,原则上没有障碍。我只是错过了一些具体实施的提示 - 特别是关于

的正确规范

代数,操作和调整大小

例如,创建错误步进器所需的

。哪些现有实施 - 例如odeint::fusion_algebra - 可以直接使用,在这种情况下还有什么可以做?

1 个答案:

答案 0 :(得分:1)

使用boost::fusion编译时容器,如果fusion_algebradefault_operations正常,只要其每个元素都支持

  • 使用标量(*)
  • 进行乘法运算
  • 加法和减法(+, - )
  • 调整大小

基本浮点类型就是这种情况,例如doublefloat,甚至std::complex。对于支持表达式模板的类型也是如此,例如来自MTL,boost :: ublas或vexcl和viennacl的向量和矩阵类型。但std::vector不可能,因为向量不会实现或超载相应的+ * - /运算符。在这种情况下,您有三种可能性

  1. 选择支持表达模板的矢量类型
  2. 实现嵌套代数,该代数使用fusion for_each迭代融合序列,并从子代数中调用正确的for_each
  3. 实现一个迭代融合序列元素的自定义操作。
  4. 注1:调整大小通常意味着,如果您的类型需要调整大小,则将is_resizable专门化为编译时为true,例如通过

    template<>
    is_resizable< YourType > : boost::true_type { };
    

    并专门化resize_impl<>same_size<>。看看默认实现。这真的很容易,应该只是一个单行。

    注意2:如果您还需要步长控制,并选择使用带有快速模板的矢量类型,则运算符/和函数max必须存在,并且它们必须执行逐元素划分和元素最大这可能很难实现。如果您需要帮助,请随时与我们联系。