Jet型产生基本思想是引入一个额外的元素epsilon(e), e满足e != 0, e^2 = 0,即e为一个无穷小量,类似与复数,扩展了实数的范围.一般表达式为x + y*e.Jet型能方便的计算导数.
例如:
在x = 10处的导数为20.
我们引入无穷小量e,原式为
其中20为x=10处导数值.
对于多参数的函数求导,例如
计算f(1,3)处导数时,分别用不同的无穷小量进行导数计算.
df/dx:
df/dy:
采用dual number(Jet)计算函数f的梯度
template<typename T>
T f(const T &x, const T &y) {
return x * x + x * y;
}
// The "2" means there should be 2 dual number components.
// It computes the partial derivative at x=10, y=20.
Jet<double, 2> x(10, 0); // Pick the 0th dual number for x.
Jet<double, 2> y(20, 1); // Pick the 1st dual number for y.
Jet<double, 2> z = f(x, y);
LOG(INFO) << "df/dx = " << z.v[0]
<< "df/dy = " << z.v[1];