• LQR 控制器


    LQR(Linear Quadratic Regulator)控制器

    LQR(Linear Quadratic Regulator)是一种经典的线性控制器设计方法,用于设计线性时不变系统的状态反馈控制器,以最小化系统性能指标,通常是二次代价函数。下面,将详细推导LQR算法,并提供MATLAB应用示例。

    推导LQR控制器:

    考虑一个离散时间线性时不变系统的状态空间表达式:

    x [ k + 1 ] = A x [ k ] + B u [ k ] x[k+1] = A x[k] + B u[k] x[k+1]=Ax[k]+Bu[k]

    其中, x [ k ] x[k] x[k] 是系统状态, u [ k ] u[k] u[k] 是控制输入, A A A B B B 是系统矩阵。

    LQR的目标是找到一个状态反馈控制器,它具有以下形式:

    u [ k ] = − K x [ k ] u[k] = -K x[k] u[k]=Kx[k]

    其中, K K K 是控制器增益矩阵,它需要优化。控制器的目标是最小化以下代价函数:

    J = ∑ k = 0 ∞ ( x [ k ] T Q x [ k ] + u [ k ] T R u [ k ] ) J = \sum_{k=0}^{\infty} (x[k]^T Q x[k] + u[k]^T R u[k]) J=k=0(x[k]TQx[k]+u[k]TRu[k])

    其中, Q Q Q 是状态权重矩阵, R R R 是控制输入权重矩阵。

    我们首先需要解出Riccati方程来找到最优控制器增益 K K K和最小的代价函数 J J J

    1. 首先,我们定义代价函数的无穷时间累积:

    J = lim ⁡ N → ∞ ∑ k = 0 N ( x [ k ] T Q x [ k ] + u [ k ] T R u [ k ] ) J = \lim_{N\to\infty}\sum_{k=0}^{N} (x[k]^T Q x[k] + u[k]^T R u[k]) J=Nlimk=0N(x[k]TQx[k]+u[k]TRu[k])

    1. 接下来,我们定义一个有限时间的代价函数,称为 J N J_N JN,并将其表示为与无穷时间代价函数的差值:

    J N = ∑ k = 0 N ( x [ k ] T Q x [ k ] + u [ k ] T R u [ k ] ) − x [ N + 1 ] T Q x [ N + 1 ] J_N = \sum_{k=0}^{N} (x[k]^T Q x[k] + u[k]^T R u[k]) - x[N+1]^T Q x[N+1] JN=k=0N(x[k]TQx[k]+u[k]TRu[k])x[N+1]TQx[N+1]

    这里,我们假设 x [ N + 1 ] x[N+1] x[N+1]是一个零向量,这是因为我们在有限时间内考虑代价。

    1. 然后,我们通过对 J N J_N JN u [ k ] u[k] u[k]求偏导,并令其等于零来找到最小值:

    ∂ J N ∂ u [ k ] = 2 R u [ k ] + 2 B T P x [ k ] = 0 \frac{\partial J_N}{\partial u[k]} = 2R u[k] + 2B^T P x[k] = 0 u[k]JN=2Ru[k]+2BTPx[k]=0

    其中, P P P是状态权重矩阵的解,它满足离散时间的Riccati方程:

    P = A T P A − A T P B ( R + B T P B ) − 1 B T P A + Q P = A^T P A - A^T P B (R + B^T P B)^{-1} B^T P A + Q P=ATPAATPB(R+BTPB)1BTPA+Q

    1. 一旦我们找到了 P P P,我们可以计算最优控制器增益 K K K

    K = ( R + B T P B ) − 1 B T P A K = (R + B^T P B)^{-1} B^T P A K=(R+BTPB)1BTPA

    步骤4:使用MATLAB实现LQR控制器和仿真

    以下是针对一个二阶系统的MATLAB代码示例,包括控制器设计和性能仿真。假设我们有以下系统参数:

    A = [ 1 1 0 1 ] , B = [ 0 1 ] , Q = [ 1 0 0 1 ] , R = 1 A =

    [1101]" role="presentation">[1101]
    , \quad B =
    [01]" role="presentation">[01]
    , \quad Q =
    [1001]" role="presentation">[1001]
    , \quad R = 1 A=[1011],B=[01],Q=[1001],R=1

    % 定义系统矩阵
    % 系统矩阵
    A = [1, 1; 0, 1];
    B = [0; 1];
    
    % 权重矩阵
    Q = [1, 0; 0, 1];
    R = 1;
    
    % 求解Riccati方程
    P = dare(A, B, Q, R);
    
    % 计算最优控制器增益矩阵 K
    K = (R + B' * P * B)^(-1) * B' * P * A;
    
    % 仿真系统响应
    x0 = [100; 0]; % 初始状态
    N = 100; % 仿真步数
    x = zeros(2, N);
    u = zeros(1, N);
    x(:,1) =x0;
    
    for k = 1:N
        u(k) = -K * x(:, k); % 计算控制输入
        x(:, k+1) = A * x(:, k) + B * u(k); % 更新状态
    end
    
    % 绘制状态和控制输入
    figure(Color='w')
    t = 0:N;
    subplot(2, 1, 1);
    plot(t, x(1, :), 'b', 'LineWidth', 2);
    ylabel('状态 x_1');
    title('LQR控制器仿真');
    set(gca,'FontSize',18);
    subplot(2, 1, 2);
    stairs(t(1:end-1), u, 'r', 'LineWidth', 2);
    xlabel('时间步骤');
    ylabel('控制输入 u');
    set(gca,'FontSize',18);
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42

    在这里插入图片描述

    在这个示例中,我们首先定义了系统的 A A A B B B矩阵,然后设置了状态权重矩阵 Q Q Q和控制输入权重矩阵 R R R。接下来,我们使用dare函数来解Riccati方程,找到状态权重矩阵 P P P,然后计算最优控制器增益矩阵 K K K。这个矩阵 K K K可以用于状态反馈控制系统。

  • 相关阅读:
    创新的营销模式与线上商城的完美结合
    vue2.x版本中computed和watch的使用入门详解-watch篇
    Floyd 最短路径【学习算法】
    Nginx的安装使用----反向代理服务器
    struct uclass_driver
    Spring异步核心@Async注解的前世今生
    ubuntu 20.04 搭建crash dump问题分析环境
    redis实战篇之导入黑马点评项目
    Unity 利用Cache实现边下边玩
    英雄联盟|王者|穿越火线 bgm AI配乐大赛分享
  • 原文地址:https://blog.csdn.net/weixin_41146894/article/details/132735507