如何使用 Eigen::AutoDiffScalar 检索微分结果
How to retrive differentiation results with 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;
}
您声明的标量实际上就是一个标量,因此您求的是标量 (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[= 的东西求导,它很容易混淆24=] 还有。所以,我们称它为 a
。
- 若da/dx=0,则a为常量。那么,显然,d/dx a² = 0 也是。
- 如果da/dx=1,那么基本上a=x。然后,d/dx a² = d/dx x² = 2x.
我正在学习使用这个库。试图区分一个简单的函数 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;
}
这输出
x = 8
y = 64
y' = 16
我建议将变量命名为 x
以外的名称,因为如果您希望对通常称为 x[= 的东西求导,它很容易混淆24=] 还有。所以,我们称它为 a
。
- 若da/dx=0,则a为常量。那么,显然,d/dx a² = 0 也是。
- 如果da/dx=1,那么基本上a=x。然后,d/dx a² = d/dx x² = 2x.