计算C (符号数学)中的Jacobian矩阵
Computing the Jacobian matrix in C++ (symbolic math)
简介
假设我需要以下一组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
仅在运行时知道(并且没有诸如线性之类的约束),则必须自动化差异化。如果您希望这完全发生(与数值估计相反),则需要使用符号计算。例如,在此处和此处查找支持此功能的库。
请注意,雅各布通常取决于状态和时间,因此不可能将其表示为常数矩阵(例如在您的示例中),除非您的问题很无聊,以至于您无论如何都可以分析地解决它。
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- .cpp和.h文件中的模板专用化声明
- 反向给定链表中的K节点
- 正在查找文档以获得PS4平台的C++中的设备信息
- enum是C++中的宏变量还是整数变量
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 将字符串存储在c++中的稳定内存中
- 文本文件中的单词链表
- 递归函数计算序列中的平方和(并输出过程)
- 如何从C++中的依赖类型中获得它所依赖的类型
- C++中的"inline"关键字
- 如何运行位于boost/libs/python/example/tutorial目录中的hello.cpp和Jamfil
- 如何使用 < 和 > 命令获取 c++ 中的输入和输出?
- 用C++中的一个变量定义一个常量
- vector.resize()中的分配错误
- 使用指针从C++中的数组中获取最大值
- arr[-1]在c++中的奇怪行为
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 将值指定给向量(2D)的向量中的某个位置
- 计算C (符号数学)中的Jacobian矩阵