如何在 Drake 中固定决策变量

How to hold decision variables fixed in Drake

我想使用交替执行 Lyapunov 函数系数优化,这需要在优化另一个子集的同时保持决策变量的一个子集不变。我如何在 Drake 中固定某些决策变量?

当你在李亚普诺夫分析中进行双线性交替时,该方法将在两个步骤之间交替:

  1. 将李亚普诺夫函数固定为常数值,并搜索拉格朗日乘数。
  2. 固定拉格朗日乘子为常数值,搜索李亚普诺夫函数(或子水平集)

我建议你创建一个像这样的辅助函数

def lyapunov_derivative(lyap, dynamics, x, lagrangian, rho):
  # Return the polynomial -Vdot - lagrangian * (rho - V)
  dVdx = np.array([lyap.Differentiate(x[i]) for i in range(x.shape[0])])
  Vdot = dVdx @ dynamics
  return -Vdot - lagrangian * (rho - V)

假设您找到了 Lyapunov 函数,然后您需要计算这个 Lyapunov 函数,用您找到的值替换它的所有决策变量。你可以通过

result = Solve(prog)
lyap_sol = result.GetSolution(lyap)
rho_sol = result.GetSolution(rho)

其中 lyap 是一个多项式,其决策变量值是通过求解数学程序刚刚找到的。现在 lyap_sol 不包含任何决策变量(它仍然包含不确定变量)。现在你可以调用 lyapunov_derivative(lyap_sol, dynamics, x, lagrangian, rho_sol) ,它将 return 你一个以拉格朗日作为未知项的多项式。然后,您可以求解数学程序以找到拉格朗日乘数系数的值,然后用该拉格朗日解调用 lyapunov_derivative 函数,找到 Lyapunov 函数,并进行下一次迭代。