我正在学习使用这个库。尝试区分简单函数y = x^2
不会产生预期结果(dy/dx = 2x = 16
时x = 8
)。
#include <eigen3/Eigen/Core>
#include <eigen3/unsupported/Eigen/AutoDiff>
#include <iostream>
int main(int argc, char *argv[])
{
Eigen::AutoDiffScalar<Eigen::Vector2d> x(8.0), y;
y = x*x;
std::cout << y.derivatives()[0];
return 0;
}
答案 0 :(得分:1)
你声明的标量就是那个 - 标量,所以你找到了标量的导数(8 * 8),这是0.为了表明8是第一个变量的值,你需要将其一阶导数设为1:
#include <eigen3/Eigen/Core>
#include <eigen3/unsupported/Eigen/AutoDiff>
#include <iostream>
int main(int argc, char *argv[])
{
// Note different initialization
Eigen::AutoDiffScalar<Eigen::Vector2d> x(8.0, Eigen::Vector2d(1,0)), y;
y = x*x;
std::cout << "x = " << x << "\n"
<< "y = " << y << "\n"
<< "y' = " << y.derivatives()[0] << "\n";
return 0;
}
此输出
x = 8
y = 64
y'= 16
我建议将变量命名为x
之外的其他变量,因为如果您希望对通常称为 x 的变量采用导数,则很容易引起混淆。所以,我们改为称之为a
。