Как получить результаты дифференцирования с помощью 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потому что это может быть легко сбить с толку, если вы ожидаете взять производную по отношению к тому, что обычно называется Икс также. Итак, давайте назовем это a вместо.

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

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector