Reputation: 63
I want to perform Lyapunov function coefficient optimization using alternations, which requires holding a subset of decision variables fixed while optimizing another subset. How do I hold certain decision variables fixed in Drake?
Upvotes: 0
Views: 75
Reputation: 2766
When you do bilinear alternation in Lyapunov analysis, the approach will alternate between the two steps:
I would suggest you to create a helper function like this
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)
Let's say you have found the Lyapunov function, you will then need to evaluate this Lyapunov function, substituting all its decision variables with the values you found. You can do this through
result = Solve(prog)
lyap_sol = result.GetSolution(lyap)
rho_sol = result.GetSolution(rho)
where lyap
is a polynomial whose decision variable values were just found by solving the mathematical program. Now lyap_sol
doesn't contain any decision variables (it still contains indeterminates). Now you can call lyapunov_derivative(lyap_sol, dynamics, x, lagrangian, rho_sol)
that will return you a polynomial with lagrangian as the unknown terms. You can then solve a mathematical program to find the value of the lagrangian multiplier coefficients, and then call lyapunov_derivative
function with that lagrangian solution, find the Lyapunov function, and proceed to the next iteration.
Upvotes: 1