Source code for state_space_control.controllers.lqr
"""Continuous-time LQR: u = u_eq - K x minimizing integral of x'Qx + u'Ru."""
from scipy.linalg import solve, solve_continuous_are
from ..base import ControllerDesign, ControllerResult, Plant, as_matrix, register
[docs]
@register('lqr')
class LQR(ControllerDesign):
"""State-feedback LQR. Q and R may be scalars, diagonals, or matrices."""
def __init__(self, Q=1.0, R=1.0):
self.Q = Q
self.R = R
[docs]
def design(self, plant: Plant) -> ControllerResult:
Q = as_matrix(self.Q, plant.n_states, 'Q')
R = as_matrix(self.R, plant.n_inputs, 'R')
P = solve_continuous_are(plant.A, plant.B, Q, R)
K = solve(R, plant.B.T @ P)
return ControllerResult(
name='lqr', plant=plant, K=K,
info={'riccati_P': P, 'cost_Q': Q, 'cost_R': R})