Я учусь использовать эту библиотеку. Пытаясь изменить простую функцию, 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;
}
Скаляр, который вы объявили, в буквальном смысле слова — скаляр, так что вы находите производную от скаляра (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
вместо.
Других решений пока нет …