c++ - 用 C++ 计算雅可比矩阵(符号数学)

标签 c++ boost

简介

假设我需要以下 ODE 集合的雅可比矩阵:

dxdt[ 0 ] = -90.0 * x[0] - 50.0 * x[1];
dxdt[ 1 ] = x[0] + 3*x[1];
dxdt[ 2 ] = x[1] + 50*x[2];

在 Matlab/Octave 中这会很容易:

syms x0 x1 x2;
f = [-90.0*x0-50.0*x1, x0+3*x1, x1+50*x2]
v=[x0, x1, x2]
fp = jacobian(f,v)

这将产生以下输出矩阵:

[-90  -50  0 ]
[ 1    3   0 ]
[ 0    1   50]

我需要什么

现在我想在 C++ 中重现相同的结果。我之前无法计算雅可比行列式并对其进行硬编码,因为它取决于用户输入和时间等。所以我的问题是:如何做到这一点?通常对于数学运算,我使用 Boost库,但是在这种情况下我找不到任何解决方案。 implicit systems 中对此只有简短说明, 但以下代码不起作用:

sys.second( x , jacobi , t )

它还请求时间 (t),因此它可能不会生成解析形式的解决方案。我误解了文档吗?还是我应该使用其他功能?我宁愿留在 Boost 中,因为我需要雅可比行列式作为 ublas::matrix 并且我想避免转换。

编辑:

更具体地说,我将在 rosenbrock4 ODE 求解器中使用 Jacobian。示例 here - 第 47-52 行。我需要自动生成这个结构,因为 ODE 集以后可能会改变,我想避免每次都手动重写 Jacobian。此外,ODE 定义中的一些变量在时间上不是常量。

最佳答案

我知道这是很久之后的事了,但我最近一直想做同样的事情,并且遇到了许多在这方面做得很好的自动微分 (AD) 库。我大部分时间都在使用 Eigen's AD因为我已经到处都在使用 Eigen。这是一个 example了解如何使用 Eigen 的 AD 来获得您所要求的雅可比矩阵。

autodiff.org 上还有一长串 C++ AD 库.

希望这对某人有帮助!

关于c++ - 用 C++ 计算雅可比矩阵(符号数学),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46253593/

相关文章:

c++ - boost::bind 静态函数的参数

c++ - 为 Linux C++ 构建创建一个干净的隔离编译环境

c++ - 为 STL 迭代器重载运算符->

c++ - 通过 boost::bind 从 vector 中删除字符串

c++ - 这个使用 boost::mismatch 的例子是什么意思?

c++ - Armadillo的cx_mat和Boost的odeint编译报错

c++ - 内存操作错误?

c++ - 具有 C++ 重载函数的 SWIG 类型映射

c++ - 使用Source Reader从网络摄像机源获取H264示例

c++ - boost::factory 和 std::function