MATLAB初学者入门(25)—— LQR控制器优化设计

        LQR(线性二次调节器)控制器是一种常用的最优控制策略,用于设计系统的状态反馈控制器以最小化性能指标,通常是所有状态的加权平方和与控制输入的加权平方和。在MATLAB中,使用LQR控制器通常涉及定义系统模型、选择适当的权重矩阵,并使用lqr函数来求解最优增益矩阵。

案例分析:使用MATLAB设计LQR控制器优化倒立摆系统

        假设我们需要控制一个简单的倒立摆系统,目标是使倒立摆在受到干扰后能迅速稳定回垂直位置。

步骤 1: 定义系统模型

        首先,定义倒立摆的状态空间模型。倒立摆是一个常见的控制系统示例,可以用线性化的状态空间方程来描述其动态行为。

% 倒立摆系统参数
g = 9.81;   % 重力加速度,m/s^2
l = 0.5;    % 摆长,m
m = 0.15;   % 摆杆质量,kg
b = 0.1;    % 阻尼系数

% 状态空间模型
A = [0 1 0 0;
     g/l 0 0 0;
     0 0 0 1;
     0 0 0 -b/m];
B = [0; 0; 0; 1/m];
C = eye(4);
D = zeros(4,1);

% 创建系统
sys = ss(A, B, C, D);
步骤 2: 设计LQR控制器

        选择状态权重矩阵Q和控制权重矩阵RQR的选择将决定系统响应的性质,如快速性、过冲和稳态误差。

Q = diag([10, 1, 10, 1]);  % 加大对角度误差的惩罚
R = 0.01;  % 控制力矩的权重

% 计算LQR控制器的增益
K = lqr(A, B, Q, R);
步骤 3: 模拟系统响应

        使用设计的LQR控制器模拟倒立摆的响应,查看控制器的性能。

% 新的反馈矩阵A-B*K
sys_cl = ss(A-B*K, B, C, D);

% 初始状态:小角度偏离垂直位置
initialState = [0.1; 0; 0; 0];
t = 0:0.01:10;  % 时间向量

% 模拟闭环系统的响应
[Y, T, X] = initial(sys_cl, initialState, t);

% 绘制角度响应
figure;
plot(T, X(:,1));
title('Pendulum Angle Response with LQR Control');
xlabel('Time (s)');
ylabel('Angle (rad)');

案例分析:增强倒立摆LQR控制器的鲁棒性

        假设倒立摆系统受到外部扰动和部分状态不可测的影响,我们将设计一个观测器增强的LQR控制器来提高系统的性能和鲁棒性。

步骤 1: 定义扩展的系统模型

        在原有的倒立摆模型中引入扰动和部分状态不可测的情况。

A = [0 1 0 0;
     g/l 0 0 0;
     0 0 0 1;
     0 0 0 -b/m];
B = [0; 0; 0; 1/m];
D = zeros(4,1);

% 假设只能测量角度和角速度
C = [1 0 0 0;
     0 1 0 0];

% 系统加入外部扰动
Bd = [0; 1; 0; 0];
步骤 2: 设计LQR控制器和观测器(Luenberger 观测器)

        首先设计LQR控制器,然后设计一个状态观测器来估计不可直接测量的状态。

Q = diag([10, 1, 10, 1]);
R = 0.01;
K = lqr(A, B, Q, R);

% 设计观测器增益
P = lyap(A', Q);  % 解Lyapunov方程
L = lqr(A', C', P, R)';  % 观测器增益
步骤 3: 模拟带观测器的闭环系统

        结合LQR控制器和观测器来模拟系统响应。

% 状态空间模型,包括观测器
sys_obs = ss(A-L*C, [B L], eye(4), zeros(4,2));

% 初始状态和扰动
initialState = [0.1; 0; 0; 0];
initialEstimate = [0; 0; 0; 0];  % 观测器的初始状态估计
t = 0:0.01:10;

% 模拟系统响应
[Y, T, X] = lsim(sys_obs, [zeros(length(t),1), Bd*ones(length(t),1)], t, [initialState; initialEstimate]);

% 绘制实际和估计的状态
figure;
subplot(2,1,1);
plot(T, X(:,1), T, X(:,3));
title('Actual and Estimated States');
legend('Actual Angle', 'Estimated Angle');

subplot(2,1,2);
plot(T, X(:,2), T, X(:,4));
legend('Actual Angular Rate', 'Estimated Angular Rate');
xlabel('Time (s)');
ylabel('States');

案例分析:整合模型预测控制(MPC)与LQR控制器

        假设倒立摆系统的参数如长度和质量可能会改变,或系统需要适应不同的操作条件,使用MPC可以在保持LQR优化目标的基础上,实时调整控制策略以应对这种变化。

步骤 1: 定义系统模型与MPC设置

        首先,我们需要定义倒立摆系统的状态空间模型,并设定MPC控制器的基本参数。   

% 系统参数
g = 9.81;   % 重力加速度,m/s^2
l = 0.5;    % 摆长,m
m = 0.15;   % 摆杆质量,kg
b = 0.1;    % 阻尼系数

% 状态空间模型
A = [0 1 0 0;
     g/l 0 0 0;
     0 0 0 1;
     0 0 0 -b/m];
B = [0; 0; 0; 1/m];
C = eye(4);
D = zeros(4,1);

% 创建连续时间系统
sys = ss(A, B, C, D);

% 转换为离散时间系统,假设采样时间为0.1秒
Ts = 0.1;
sysd = c2d(sys, Ts);

% 设定MPC控制器
predictionHorizon = 20;
controlHorizon = 5;
mpcController = mpc(sysd, Ts, predictionHorizon, controlHorizon);

% 定义MPC的成本函数(相似于LQR成本)
mpcController.Weights.OutputVariables = [1 0 1 0];
mpcController.Weights.ManipulatedVariablesRate = 0.1;

     

步骤 2: 模拟MPC控制效果

        使用MPC控制器来模拟倒立摆的动态响应,并对比不同参数变化下的控制效果。

% 初始状态和模拟时间
initialState = [0.1; 0; 0; 0];
Tf = 10;
options = mpcsimopt();
options.RefLookAhead = 'off';
options.MDLookAhead = 'off';
options.Constraints = 'on';
options.OpenLoop = 'off';

% 运行MPC控制仿真
[~,~,u,y,t] = sim(mpcController, Tf, [], [], initialState, options);

% 绘制响应
figure;
subplot(2,1,1);
plot(t, y);
title('MPC Controlled Pendulum Responses');
legend('Angle', 'Angular Rate');
ylabel('States');

subplot(2,1,2);
stairs(t, u);
xlabel('Time (s)');
ylabel('Control Input');
title('Control Effort');

结论

(1)使用LQR控制器,倒立摆系统能够有效地从初始偏移角度快速稳定到垂直位置。通过调整QR中的参数,可以进一步优化系统的性能,例如减少过冲或达到更快的响应时间。LQR控制器的优点在于它提供了一种系统性的方法来平衡状态误差与控制能耗之间的权衡,使得控制器设计既系统化又具有理论支持。然而,实际应用中需要注意,LQR假设系统模型完全已知且系统线性,对于非线性或模型不确定性较高的系统,可能需要更复杂的控制策略或对LQR设计进行适当的修改。

(2)通过整合LQR控制器和状态观测器,我们不仅可以对倒立摆系统进行有效控制,还能处理外部扰动和不完全可测的状态。这种方法提高了系统的鲁棒性,确保了在实际应用中的可靠性和稳定性。在实践中,正确调整观测器和控制器的设计参数对于实现最佳性能至关重要。此外,应考虑系统模型的精确度和可能的模型误差,以便进一步优化系统设计和性能。

(3)通过整合模型预测控制(MPC)技术,我们能够使LQR控制器更加灵活和适应性强,尤其是在面对系统参数变化或外部扰动时。MPC提供了一种优化控制输入的方法,通过在每个时间步解决一个有限时间范围内的优化问题,可以预测并调整控制行为,从而实现更优的控制性能。这种控制策略的主要优点是它能够实时地处理和适应系统的动态变化,非常适合于需要严格控制性能和安全性的应用,如自动驾驶车辆、航空航天控制系统以及工业自动化过程。然而,MPC的计算负担较重,需要高性能的计算硬件来满足实时控制的要求。在设计和实施MPC策略时,选择合适的预测和控制范围至关重要,以保证控制系统的实用性和经济性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/595171.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AI适老化!10秒一张的AI姓氏头像,居然要卖9块9?中老年用户都说好!

看短视频的你,一定会刷到过这样的直播间: 现在大家明白了,这是一个做姓氏图像的直播间。我刚开始刷到的时候也觉得这种头像好看,高大上,也想做一个这样的图像,来当自己的微信头像。 做这样的图像需要排队刷…

迅饶科技 X2Modbus 网关 AddUser 任意用户添加漏洞复现

0x01 产品简介 X2Modbus是上海迅饶自动化科技有限公司Q开发的一款功能很强大的协议转换网关, 这里的X代表各家不同的通信协议, 2是T0的谐音表示转换, Modbus就是最终支持的标准协议是Modbus协议。用户可以根据现场设备的通信协议进行配置,转成标准的Modbus协议。在PC端仿真…

代码随想录算法训练营DAY43|C++动态规划Part5|1049.最后一块石头的重量II、494.目标和、474.一和零

文章目录 1049.最后一块石头的重量II思路CPP代码 ⭐️494.目标和回溯算法抽象成01背包问题CPP代码本题总结 474.一和零思路CPP代码 1049.最后一块石头的重量II 力扣题目链接 文章链接:1049.最后一块石头的重量II 视频链接:这个背包最多能装多少&#xff…

高中数学-三角函数之常见题型总结

相关公式 新教材,取消了和差化积与积化和差的三角函数题目 例题1 解析 根据条件tanθ -2,我们应该就要想到,把待求式的角向θ靠拢 所以要想到如何降角,将2θ化成θ,那么,想到的公式就是:正弦…

【C++第三阶段】Set Map容器 员工分组案例

以下内容仅为当前认识,可能有不足之处,欢迎讨论! 文章目录 Set容器构造和赋值大小和交换插入和删除一次性迭代器(可能迅速失效的迭代器)长久保留的迭代器如何判断迭代器是否一次性 查找和统计set和multiset的区别pari对…

【notes2】并发,IO,内存

文章目录 1.线程/协程/异步:并发对应硬件资源是cpu,线程是操作系统如何利用cpu资源的一种抽象2.并发:cpu,线程2.1 可见性:volatile2.2 原子性(读写原子):AtomicInteger/synchronized…

239 基于matlab的EKF(扩展卡尔曼滤波)_UKF(无迹卡尔曼滤波)_PF(粒子滤波)三种算法的估计结果比较

基于matlab的EKF(扩展卡尔曼滤波)_UKF(无迹卡尔曼滤波)_PF(粒子滤波)三种算法的估计结果比较,输出估计误差,并单独对粒子滤波进行估计及其置信区间可视化。程序已调通,可直接运行。 239 EKF(扩展卡尔曼滤波) - 小红书 …

Unity | Shader基础知识(第十三集:编写内置着色器阶段总结和表面着色器的补充介绍)

目录 前言 一、表面着色器的补充介绍 二、案例viewDir详解 1.viewDir是什么 2.viewDir的作用 3.使用viewDir写shader 前言 注意观察的小伙伴会发现,这组教程前半部分我们在编写着色器的时候,用的是顶点着色器和片元着色器的组合。 SubShader{CGPRO…

Java转Kotlin

Kotlin 是一种静态编程语言 2011JetBrains开始开发Kotlin,用于多平台应用(能脱离虚拟机,直接编译成可以在win,mac,linux运行的二进制代码) 2017获得谷歌官方支持 语法简洁(减少了大量的样板代码,语法糖&…

【Python深度学习(第二版)(2)】深度学习之前:机器学习简史

文章目录 一. 深度学习的起源1. 概率建模--机器学习分类器2. 早期神经网络--反向传播算法的转折3. 核方法 -- 忽略神经网络4. 决策树、随机森林和梯度提升机5. 神经网络替代svm与决策树 二. 深度学习与机器学习有何不同 可以这样说,当前工业界所使用的大部分机器学习…

服务器端口怎么查,服务器端口查看方法详解

服务器端口是网络通信的关键组件,对于网络管理员和系统管理员来说,了解和掌握如何查看服务器端口是非常重要的。接下来介绍两种常用的方法来查看服务器端口。 方法一:使用命令提示符(CMD) 1. 首先,点击电脑…

JavaScript百炼成仙自学笔记——12

函数七重关之五(自执行函数) 什么时候用它? 很多时候,我们只想执行一个函数,却无所谓这个函数叫什么名字。那么这种情况下就可以考虑使用自执行函数。 {function(){console.log(123);} }(); 这就是一个简单的自执行的…

视频剪辑:视频文件元数据修改工具,批量操作提升效率和准确性

在视频剪辑和后期处理的过程中,除了对视频本身的编辑和修改,元数据的管理和修改同样重要。元数据,如标题、艺术家、专辑封面等,不仅提供了视频文件的基本信息,还有助于更好地组织、搜索和共享视频内容。而针对视频文件…

dumpsys meminfo 流程中细节

源码基于:Android U 参考: dumpsys meminfo 详解(R) dumpsys meminfo 详解(U) 1. 命令入口 MemBinder frameworks/base/services/core/java/com/android/server/am/AMS.javastatic class MemBinder extends Binder {ActivityManagerService mActivity…

原型模式和建造者模式

1、原型模式 1.1 概念 用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型对象相同的新对象。 1.2 结构 原型模式包含如下角色: 抽象原型类:规定了具体原型对象必须实现的的 clone() 方法。 具体原型类:实现抽…

链表经典面试题01

目录 引言 面试题01:返回倒数第k个节点 题目描述: 思路分析: 代码展示: 面试题02:链表的回文结构 题目描述: 描述 思路分析: 代码展示: 面试题03:相交链表 题目描述: 思路分析: 代码展示: 小结: 引言 这次的题均来自力扣和牛客有关链表的经典面试题,代码只会展示…

二.Django--创建多个APP路由映射

目录 1-创建项目 2-创建多个APP 3-注册APP 4-创建"前端页面"并做路由映射 各个APP里面的views.py写视图函数等等 1-创建项目 django-admin startproject 项目名 django-admin startproject my_project 2-创建多个APP python manage.py startapp app名 pyth…

HttpCilent进行Post请求form-data接口,服务方接收不到参数

结论先行 生成分隔标识boundary在HttpPost中设置Header时带上boundary创建MultipartEntity时需要设置boundary 实现代码如下 /*** param url 调用接口的地址* param paramMap 调用接口传入的方法体参数*/ public static String postDataByFormData(String url, Map<Strin…

【参赛总结】第二届云原生编程挑战赛-冷热读写场景的RocketMQ存储系统设计 - Nico

关联比赛: 2021第二届云原生编程挑战赛1&#xff1a;针对冷热读写场景的RocketMQ存储系统设计 引子 在一个浑浑噩噩的下午&#xff0c;百无聊赖的我像往常一样点开了划水交流群&#xff0c;细细品味着老哥们关于量子力学的讨论。嬉戏间&#xff0c;平常水不拉几的群友张三忽…

【毕业设计】基于SSM的运动用品商城的设计与实现

1.项目介绍 在这个日益数字化和信息化的时代&#xff0c;随着人们购物习惯的转变&#xff0c;传统的实体商店已经无法满足人们日益增长的在线购物需求。因此&#xff0c;基于SSM&#xff08;Spring Spring MVC MyBatis&#xff09;框架的运动用品商城项目应运而生&#xff0…