2

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

但是,我更喜欢更优雅的解决方案,例如boost::fusion用作状态类型,然后保存不同的向量。据我从帖子和相关问题的实施中了解到,这样做原则上没有障碍。我只错过了一些具体实现的提示——特别是关于正确的规范

代数、运算和调整大小

例如创建错误步进器所需的。哪些现有的实现——例如odeint::fusion_algebra——可以直接使用,在这种情况下还需要做什么?

4

1 回答 1

1

只要它的每个元素都支持,就可以使用boost::fusion编译时容器fusion_algebradefault_operations

  • 与标量 (*) 相乘
  • 加法和减法 (+,-)
  • 调整大小

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

  1. 选择支持表达式模板的向量类型
  2. 实现一个嵌套代数,它用融合迭代融合序列并从子代数中for_each调用正确的for_each
  3. 实现一个迭代融合序列元素的自定义操作。

注意 1:调整大小通常意味着,如果您的类型需要调整大小,则您需要专门is_resizable针对编译时间进行调整,例如通过

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

和专业化resize_impl<>same_size<>。查看默认实现。这真的很容易,应该只是一条线。

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

于 2013-03-10T20:08:12.193 回答