2016-10-14 3 views
1

Я учусь использовать эту библиотеку. Попытка дифференцировать простую функцию, y = x^2, не дает ожидаемых результатов (dy/dx = 2x = 16, когда x = 8).Как получить результаты дифференцирования с помощью Eigen :: AutoDiffScalar

#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.

 Смежные вопросы

  • Нет связанных вопросов^_^