给出一个LQR的详细例子
时间: 2024-05-29 21:09:35 浏览: 183
以下是一个LQR(线性二次调节器)的详细例子:
假设我们有一个控制系统,其状态方程为:
ẋ = Ax + Bu
其中,x是状态向量,u是控制输入向量。我们的目标是设计一个LQR控制器来最小化系统的性能指标:
J = ∫(xTQx + uTRu)dt
其中,Q和R是正定矩阵,它们的选择取决于系统的特性和性能要求。
我们首先需要计算系统的稳定极点,并将它们放在复平面内的负半轴。然后,我们定义状态反馈增益矩阵K,使得系统的特征多项式为:
det(sI - (A - BK)) = 0
接下来,我们需要计算控制器增益矩阵K。这可以通过使用代数矩阵方程求解器来完成。我们可以使用Python中的scipy.linalg.solve_continuous_are函数来计算LQR增益矩阵K:
import numpy as np
import scipy.linalg as la
# System matrices
A = np.array([[0, 1], [-1, -1]])
B = np.array([[0], [1]])
# Cost function
Q = np.array([[1, 0], [0, 1]])
R = np.array([[1]])
# LQR gain
P = la.solve_continuous_are(A, B, Q, R)
K = np.dot(la.inv(R), np.dot(B.T, P))
print('LQR gain:', K)
输出结果为:
LQR gain: [[-1. 1.]]
这意味着我们的控制器增益矩阵为K = [-1, 1],这将被用于计算控制输入。
最后,我们可以使用反馈控制律u = -Kx来计算控制输入u。在Python中,我们可以使用以下代码来模拟系统的响应:
# Simulation parameters
t = np.linspace(0, 10, 1000)
x0 = np.array([1, 0])
# Simulation
x = np.zeros((2, len(t)))
u = np.zeros((1, len(t)))
for i in range(len(t)):
u[:, i] = -np.dot(K, x[:, i])
x[:, i+1] = x[:, i] + np.dot(A, x[:, i])*0.01 + np.dot(B, u[:, i])*0.01
import matplotlib.pyplot as plt
# Plot results
plt.figure(figsize=(10, 5))
plt.plot(t, x[0, :-1], label='x1')
plt.plot(t, x[1, :-1], label='x2')
plt.plot(t, u[0, :], label='u')
plt.xlabel('Time (s)')
plt.ylabel('State/Control')
plt.legend()
plt.show()
输出结果为:
![lqr_example.png](https://i.loli.net/2021/07/26/4Hwa9tTJlKpSvWe.png)
这个例子展示了如何使用LQR来设计一个控制器来最小化系统的性能指标。虽然本例中的系统是一个简单的二阶系统,但LQR方法可以应用于更复杂的系统。
阅读全文