使用 pydrake autodiff 计算 hessian

Computing hessian with pydrake autodiff

Drake 的卖点之一是可以通过 AutoDiff 轻松获得梯度,但我正在努力了解如何在 pydrake 中轻松计算二阶导数。

给定一个函数 f(x),我知道有两种计算雅可比行列式的方法。第一种方式使用 forwarddiff.jacobian 辅助函数,例如:

def f(x):
    return x.T@x

x = np.array([1,2,3])
fx = jacobian(f,x)     # = [2,4,6]

第二种方式更直接地使用autodiffutils绑定:

x = InitializeAutoDiff([1,2,3])
y = f(x)
fx = ExtractGradient(y)   # = [2,4,6]

是否有类似的方法来获取 Hessian?对 jacobian 辅助函数的嵌套调用不起作用,因为第二个参数不能是 AutoDiffXd 类型。但也许有一些方法更类似于上面的第二种方法?

当前推荐的答案是在需要多个导数时使用 symbolic::Expression 而不是 AutoDiffXd。虽然我们所有的 C++ 代码如果用 AutoDiffX<AutoDiffXd> 编译以提供二阶导数应该可以工作,但我们目前不将它们构建为 libdrake.so.

中的默认标量类型之一。