1

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

1 回答 1

2

您声明的标量实际上就是一个标量,因此您要找到标量 (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 a² = 0 也是如此。
  • 如果 da/dx=1,则本质上是 a=x。那么,d/dx a² = d/dx x² = 2x。
于 2016-10-14T13:21:34.983 回答