LQR要点
新的“A”变成着了这样:Ac = A - KB
基于对象:状态空间形式的系统
能量函数J:也称之为目标函数
Q:半正定矩阵,对角阵(允许对角元素出现0)
R:正定矩阵,QR其实就是权重
下面这段话可能会加深对LQR的理解:
当x是一维的,J就变成
我们的目的是使能量函数J最小,那么Qx^2和Ru^2都要最小,则t趋近无穷时,x要趋近0,要保证Qx^2为一个最小定值那么Q要很大,Q越大x衰减速度也就越快;同理增大R,u就会变小,对系统的控制变弱,x衰减速度将会变慢
如何选取QR?
无一般规律可寻,一般取决设计者的经验,在这提供几个选择的原则:
1 Q、R都是对称矩阵,Q为正半定矩阵,R为正定矩阵
2 通常选取Q、R为对角矩阵,实际应用,通常将R值固定,通过改变Q的值来调制最优,当控制量只有一个,R就变成一个标量,一般取值1
为了更好的选取Q/R,我进行了一些尝试,发现如下:
假设我们的状态量是x1,x2,现在改变系数,观察对x1的影响
关于Q与R的
1 同时Q=>kQ,R=>kr,对x1无影响;
2 单取Q=>kQ或R=>R/k,产生的影响相同;
3 增大Q,对x1的控制力加强;
关于Q内部的
1 增大x1的系数,对x1的控制力加强;
2 增大x2的系数,x1基本不变;
3 减小x2的系数,对x1控制力减弱,以至到达目标状态的时间变长;(试验中对x1的第一步控制较强,但之后控制力明显减弱,可能是由于我给的初始量不太符合客观现实)
计算反馈矩阵K的步骤:
1 选择QR矩阵
2 求解Riccati方程的P(P是公式推导过程中设的矩阵,目的就是方便求K,在这求出P就能求出K)
3 计算(在matlab中给定A,B,Q,R用lqr函数可直接计算出K)
(实际控制中我们无法调用lqr函数,求解K本质上属于求解Riccati方程,详见我的随笔:Riccati方程迭代法求解)
u(k)=-K*x(k),u(k)控制完将会得到一个新的x(k+1),周而复始可不断求出u
调节目标:将状态调节到零,而不是系统误差为零
下面有一个倒立摆控制器的例子
其状态变量是[p p' Θ Θ‘],p是小车位移。Θ是倒立摆角度
A = [0 1 0 0
0 0 -1 0
0 0 0 1
0 0 9 0];
B = [0;0.1;0;-0.1];
C = [0 0 1 0]; %观测角度
D = 0;
Q = [1 0 0 0
0 1 0 0
0 0 10 0
0 0 0 10 ];
R = 0.1;
%由上面这个系统,可以计算出K
K = lqr(A,B,Q,R);
Ac = A - B*K;
%对系统进行模拟
x0 = [0.1;0;0.1;0]; %初始状态
t = 0:0.05:20;
u = zeros(size(t));
[y,x]=lsim(Ac,B,C,D,u,t,x0);
plot(t,y);
系统的控制效果与系统状态空间的准确度、QR的选取有极大关系!!!
也可采用u(k+1) = -K_lqr * x(k)和x(k+1) = A * x(k) + B * u的方式尝试跑自己的例子
LQR要点的更多相关文章
- LQR算法如何跟随变化的期望状态
开门见山,通过LQR的能量函数可以看出,LQR算法是将状态量控制到零(关于能量函数请看我的随笔:LQR要点),但实际控制中我们希望状态量能够跟随期望值 下面将会解决如何用LQR算法跟随变化的期望值: ...
- C++常见笔试面试要点以及常见问题
1. C++常见笔试面试要点: C++语言相关: (1) 虚函数(多态)的内部实现 (2) 智能指针用过哪些?shared_ptr和unique_ptr用的时候需要注意什么?shared_ptr的实现 ...
- 《高性能javascript》一书要点和延伸(上)
前些天收到了HTML5中国送来的<高性能javascript>一书,便打算将其做为假期消遣,顺便也写篇文章记录下书中一些要点. 个人觉得本书很值得中低级别的前端朋友阅读,会有很多意想不到的 ...
- [php]laravel框架容器管理的一些要点
本文面向php语言的laravel框架的用户,介绍一些laravel框架里面容器管理方面的使用要点.文章很长,但是内容应该很有用,希望有需要的朋友能看到.php经验有限,不到位的地方,欢迎帮忙指正. ...
- 基础笔记(一):C#编程要点
前言 来源于手中日常摘录的资料和书籍,算是对看过的东西的总结,部分注有阅读心得,也有部分只提出大纲或结论.(备注:本篇文章中大部分要点需要有实际的开发经验,有助于阅读理解.) 目录 const ...
- CORS基础要点:关于dataType、contentType、withCredentials
事实上,面试时我喜欢问跨域,因为多数开发者都知道它并且常用,而我希望能从面试者的回答中知道他在这个问题的深入程度,进一步看看面试者研究问题的思维方式及钻研精神,然而确实难到了很多人,当然这也不是面试通 ...
- 漫谈C++:良好的编程习惯与编程要点
以良好的方式编写C++ class 假设现在我们要实现一个复数类complex,在类的实现过程中探索良好的编程习惯. ① Header(头文件)中的防卫式声明 complex.h: # ifndef ...
- 推荐Linux管理员不可不知十大PHP安全要点 - SCutePHP
PHP是使用最广泛的脚本编程语言之一.市场份额颇能说明其主导地位.PHP 7已推出,这个事实让这种编程语言对当前的开发人员来说更具吸引力.尽管出现了一些变化,但是许多开发人员对PHP的未来持怀疑态度. ...
- PHPCMS与UCenter整合要点
要点一: PHPCMS不能直接与UCenter整合,而是要经过 PHPSSO 适配,因此应用主URL应是 http://phpcms_url/phpsso_server 这种模式的. 要点二: 因为 ...
随机推荐
- Rocket - tilelink - FIFOFixer
https://mp.weixin.qq.com/s/JS4Pguwa6LXjPsMq6nW8HA 简单介绍FIFOFixer的实现. 1. 基本介绍 按照一定的策略把某一部分m ...
- float:left的妙用
在html页面中,我们总是会遇到这样的情况: 当然,这是比较简单的情况,用ul内包li就可以, <ul> <li><img src="logo.jpg" ...
- Java实现 LeetCode 324 摆动排序 II
324. 摆动排序 II 给定一个无序的数组 nums,将它重新排列成 nums[0] < nums[1] > nums[2] < nums[3]- 的顺序. 示例 1: 输入: n ...
- Java实现 洛谷 P1601 A+B Problem(高精)
import java.util.*; import java.math.*; public class Main { public static void main(String args[]) { ...
- mac下使用VMVARE安装win10虚拟机的一些坑
最近Mac上安装windows踩到了几个坑: 坑一:启动虚拟机后,提示找不到CD-ROM中找不到对应的ISO文件 硬盘格式请选择 在虚拟机->设置中选择启动磁盘为CD_ROM,然后重新启动. 坑 ...
- org.openqa.selenium.WebDriverException: It is impossible to create a new session because 'createSession' which takes HttpClient, InputStream and long was not found or it is not accessible 异常
检查项目配置的jdk版本是否过低,修改一下配置就解决了.如果是jdk版本过低的就升级一下jdk.
- 彻底搞懂 etcd 系列文章(三):etcd 集群运维部署
0 专辑概述 etcd 是云原生架构中重要的基础组件,由 CNCF 孵化托管.etcd 在微服务和 Kubernates 集群中不仅可以作为服务注册与发现,还可以作为 key-value 存储的中间件 ...
- [leetcode] 股票问题
参考文章: [1] 团灭 LeetCode 股票买卖问题 [2] Most consistent ways of dealing with the series of stock problems 其 ...
- Vue3 新特性
一.vue3 为什么要重写 两个主要原因考虑重写vue新版本主要功能: 1.主流浏览器对新的JavaScript语言特性的普遍支持. 2.当前Vue代码库随着时间的推移而暴露出来的设计和体系架构问题. ...
- 前端技术 - SeaJS学习
SeaJS 是一个模块加载器,模块加载器需要实现两个基本功能: 实现模块定义规范,这是模块系统的基础. 模块系统的启动与运行. define参数 在 CMD 规范中,一个模块就是一个文件.代码的书写格 ...