np.linalg.solve() 不适用于 AutoDiff 吗?

Is np.linalg.solve() not working for AutoDiff?

np.linalg.solve() 对 AutoDiff 不起作用吗?我用的是求解机械手方程。错误信息如下所示。 我尝试了类似的“双”版本代码,没问题。请告诉我如何解决,谢谢!

### here is the error message                        
vdot_ad = np.linalg.solve(M_,ggg_ad) 
    File "<__array_function__ internals>", line 5, in solve
    File "/usr/local/lib/python3.8/site-packages/numpy/linalg/linalg.py", line 394, in solve
    r = gufunc(a, b, signature=signature, extobj=extobj)
    TypeError: No loop matching the specified signature and casting was found for ufunc solve1

####. here is the code 
plant = MultibodyPlant(time_step= 0.01)
parser = Parser(plant)
parser.AddModelFromFile("double_pendulum.sdf")
plant.Finalize()
plant_autodiff = plant.ToAutoDiffXd()

####### <AutoDiff> get the error message
xu = np.hstack((x, u))
xu_ad = initializeAutoDiff(xu)[:,0]
x_ad = xu_ad[:4]
q_ad = x_ad[:2]
v_ad = x_ad[2:4]
u_ad = xu_ad[4:]
(M_, Cv_, tauG_, B_, tauExt_) = ManipulatorDynamics(plant_autodiff, q_ad, v_ad)
vdot_ad = np.linalg.solve(M_,tauG_ + np.dot(B_,u_ad) - np.dot(Cv_,v_ad)) 

请注意,在 pydrake 中,AutoDiffXd 标量使用 dtype=object 暴露给 NumPy。

这种方法有一些缺点,例如您现在 运行 遇到的问题。
这不一定是 Drake 的问题,而是 NumPy 本身的限制,因为 ufunc 是在 18.04 的(超旧)版本上实现的。

为了说明,这是我在 Ubuntu 18.04、CPython 3.6.9、NumPy 1.13.3 上看到的:

>>> import numpy as np
>>> A = np.eye(2)
>>> b = np.array([1, 2])
>>> np.linalg.solve(A, b)
array([ 1.,  2.])
>>> A = A.astype(object)
>>> b = b.astype(object)
>>> np.linalg.solve(A, b)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3/dist-packages/numpy/linalg/linalg.py", line 375, in solve
    r = gufunc(a, b, signature=signature, extobj=extobj)
TypeError: No loop matching the specified signature and casting
was found for ufunc solve1

最直接的解决方案是在 pydrake 中公开一个类似的例程,并让用户利用它。

这也是我们必须为 np.linalg.inv 做的:
https://github.com/RobotLocomotion/drake/pull/11173/files

不是最好的解决方案:( 但是,它很简单!