如何可视化数学程序的雅可比行列式

问题描述 投票:0回答:1

我一直在 CasADi 中研究一些 NLP 问题,但我正在考虑是否可以回来并再次与 Drake 合作。

我想知道的一件事是是否有一种方法可以可视化 Drake 中优化变量的约束雅可比行列式。

在 CasADi 我可以做这样的事情:

jac = ca.jacobian(constraints,opt_variables)
plt.figure(figsize=(10,10),dpi=100)
plt.spy(jac.sparsity(),markersize=0.5)

并得到如下输出: 雅可比稀疏矩阵的图像

我很好奇是否有办法在 Drake 中做类似的事情?

另一个相关问题是如何检查约束/变量顺序,或者是否有任何提示。

这里我附上了同一问题的雅可比矩阵,但只是约束和变量的顺序不同: 重新排列变量的雅可比

阶次/梯度矩阵形状似乎对 ipopt 产生巨大差异,第一个对角化示例的求解时间约为 0.5 秒,而第二个示例的求解时间几乎为 50-100 秒。

drake
1个回答
0
投票

你可以通过这个得到约束的雅可比行列式

x_ad = pydrake.math.InitializeAutoDiff(x)
y_ad = constraint.Eval(x_ad)
jac = pydrake.math.ExtractGradient(y_ad)
plt.figure(figsize=(10,10),dpi=100)
plt.spy(jac.sparsity(),markersize=0.5)

接下来,是否有任何简单的方法可以更改 pydrake 中约束的顺序,或者您只需按照您希望它们在雅可比中显示的顺序来定义它们

当您调用 MathematicalProgram::AddConstraint() 函数时,您应该按照您希望它们在雅可比中显示的顺序添加它们。

根据您使用的求解器(IPOPT/SNOPT),在每个求解器内,我们根据约束类型对约束进行分组。也就是说,我们首先添加所有通用非线性约束,然后添加二次约束和洛伦兹锥约束等。因此,如果按以下顺序添加约束:generic_constraint0,二次约束0,lorentz_cone_constraint0,generic_constraint1,lorentz_cone_constraint1,那么在IpoptSolver中,约束条件排序为

generic_constraint0
generic_constraint1
quadratic_constraint0
lorentz_cone_constraint0
lorentz_cone_constraint1
© www.soinside.com 2019 - 2024. All rights reserved.