我想用boost::odeint
来解决不同变量集合的微分方程 - 比如std::vector
类型并行。一种解决方案当然是将所有变量组合成一个大的向量,然后将其用作状态变量。
但是,我更喜欢更优雅的解决方案,例如使用boost::fusion
作为状态类型,然后保存不同的向量。据我所知posting和related problem的实现,原则上没有障碍。我只是错过了一些具体实施的提示 - 特别是关于
代数,操作和调整大小
例如,创建错误步进器所需的。哪些现有实施 - 例如odeint::fusion_algebra
- 可以直接使用,在这种情况下还有什么可以做?
答案 0 :(得分:1)
使用boost::fusion
编译时容器,如果fusion_algebra
和default_operations
正常,只要其每个元素都支持
基本浮点类型就是这种情况,例如double
,float
,甚至std::complex
。对于支持表达式模板的类型也是如此,例如来自MTL,boost :: ublas或vexcl和viennacl的向量和矩阵类型。但std::vector
不可能,因为向量不会实现或超载相应的+ * - /运算符。在这种情况下,您有三种可能性
for_each
迭代融合序列,并从子代数中调用正确的for_each
注1:调整大小通常意味着,如果您的类型需要调整大小,则将is_resizable
专门化为编译时为true,例如通过
template<>
is_resizable< YourType > : boost::true_type { };
并专门化resize_impl<>
和same_size<>
。看看默认实现。这真的很容易,应该只是一个单行。
注意2:如果您还需要步长控制,并选择使用带有快速模板的矢量类型,则运算符/
和函数max
必须存在,并且它们必须执行逐元素划分和元素最大这可能很难实现。如果您需要帮助,请随时与我们联系。