如何使用Eigen :: AutoDiffScalar来检索区分结果

时间:2016-10-14 12:27:02

标签: c++ eigen autodiff

我正在学习使用这个库。尝试区分简单函数y = x^2不会产生预期结果(dy/dx = 2x = 16x = 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;
}

1 个答案:

答案 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

  • 如果da / dx = 0,则a是常数。那么,显然,d / dx a2 = 0。
  • 如果da / dx = 1,则基本上a = x。然后,d / dx a2 = d / dxx2 = 2x。