Как получить результаты дифференцирования с помощью Eigen::AutoDiffScalar

Я учусь использовать эту библиотеку. Пытаясь изменить простую функцию, 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;
}

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;
}

Это выводы

х = 8
у = 64
у ' = 16

Я рекомендую назвать переменную как-то иначе xпотому что это может быть легко запутанным, если вы ожидаете взять производную по отношению к чему-то, что обычно также называется x. Итак, давайте назовем это a вместо.

  • Если da/dx=0, то a является константой. Тогда, очевидно, d/dx a² = 0.
  • если da/dx=1, то по существу a = x. Тогда d/dx a² = d/dx x² = 2x.
Другие вопросы по тегам