计算C (符号数学)中的Jacobian矩阵

Computing the Jacobian matrix in C++ (symbolic math)

本文关键字:中的 Jacobian 矩阵 符号 计算      更新时间:2023-10-16

简介

假设我需要以下一组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库,但是在这种情况下,我找不到任何解决方案。在隐式系统中只有简短的说明,但是以下代码不起作用:

sys.second( x , jacobi , t )

它也请求时间(t),因此它可能不会生成解决方案的分析形式。我会误解文件吗?还是我应该使用其他功能?我更喜欢留在Boost之内,因为我需要Jacobian作为ublas::matrix,我想避免转换。

编辑:

更具体的我将在rosenbrock4 ode求解器内使用jacobian。示例在这里 - 行47-52。我需要自动生成这种结构,因为稍后可能会更改ODE集,并且我想避免手动重写Jacobian。同样,ode定义内的一些变量在时间上并不恒定。

我知道这是事实很久以后,但是我最近一直想做同样的事情,并遇到了许多做得很好的自动差异(AD)库。我主要是在使用特征广告,因为我已经到处都在使用特征。这是一个示例,说明如何使用Eigen的广告来获取Jacobian。

autodiff.org上还有一长串C 广告库。

希望这对某人有帮助!

雅各布基于函数的导数。如果该函数f仅在运行时知道(并且没有诸如线性之类的约束),则必须自动化差异化。如果您希望这完全发生(与数值估计相反),则需要使用符号计算。例如,在此处和此处查找支持此功能的库。

请注意,雅各布通常取决于状态和时间,因此不可能将其表示为常数矩阵(例如在您的示例中),除非您的问题很无聊,以至于您无论如何都可以分析地解决它。