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

How to retrive differentiation results with Eigen::AutoDiffScalar

我正在学习使用这个库。试图区分一个简单的函数 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;
}

您声明的标量实际上就是一个标量,因此您求的是标量 (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[= 的东西求导,它很容易混淆24=] 还有。所以,我们称它为 a

  • 若da/dx=0,则a为常量。那么,显然,d/dx a² = 0 也是。
  • 如果da/dx=1,那么基本上a=x。然后,d/dx a² = d/dx x² = 2x.