新的“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要点的更多相关文章

  1. LQR算法如何跟随变化的期望状态

    开门见山,通过LQR的能量函数可以看出,LQR算法是将状态量控制到零(关于能量函数请看我的随笔:LQR要点),但实际控制中我们希望状态量能够跟随期望值 下面将会解决如何用LQR算法跟随变化的期望值: ...

  2. C++常见笔试面试要点以及常见问题

    1. C++常见笔试面试要点: C++语言相关: (1) 虚函数(多态)的内部实现 (2) 智能指针用过哪些?shared_ptr和unique_ptr用的时候需要注意什么?shared_ptr的实现 ...

  3. 《高性能javascript》一书要点和延伸(上)

    前些天收到了HTML5中国送来的<高性能javascript>一书,便打算将其做为假期消遣,顺便也写篇文章记录下书中一些要点. 个人觉得本书很值得中低级别的前端朋友阅读,会有很多意想不到的 ...

  4. [php]laravel框架容器管理的一些要点

    本文面向php语言的laravel框架的用户,介绍一些laravel框架里面容器管理方面的使用要点.文章很长,但是内容应该很有用,希望有需要的朋友能看到.php经验有限,不到位的地方,欢迎帮忙指正. ...

  5. 基础笔记(一):C#编程要点

    前言 来源于手中日常摘录的资料和书籍,算是对看过的东西的总结,部分注有阅读心得,也有部分只提出大纲或结论.(备注:本篇文章中大部分要点需要有实际的开发经验,有助于阅读理解.)     目录 const ...

  6. CORS基础要点:关于dataType、contentType、withCredentials

    事实上,面试时我喜欢问跨域,因为多数开发者都知道它并且常用,而我希望能从面试者的回答中知道他在这个问题的深入程度,进一步看看面试者研究问题的思维方式及钻研精神,然而确实难到了很多人,当然这也不是面试通 ...

  7. 漫谈C++:良好的编程习惯与编程要点

    以良好的方式编写C++ class 假设现在我们要实现一个复数类complex,在类的实现过程中探索良好的编程习惯. ① Header(头文件)中的防卫式声明 complex.h: # ifndef ...

  8. 推荐Linux管理员不可不知十大PHP安全要点 - SCutePHP

    PHP是使用最广泛的脚本编程语言之一.市场份额颇能说明其主导地位.PHP 7已推出,这个事实让这种编程语言对当前的开发人员来说更具吸引力.尽管出现了一些变化,但是许多开发人员对PHP的未来持怀疑态度. ...

  9. PHPCMS与UCenter整合要点

    要点一: PHPCMS不能直接与UCenter整合,而是要经过 PHPSSO 适配,因此应用主URL应是 http://phpcms_url/phpsso_server 这种模式的. 要点二: 因为 ...

随机推荐

  1. 概念辨析-Description Language还是Description Library?

    https://mp.weixin.qq.com/s/p7eyD6GkniFGHrnr8t2SZQ   概念辨析-Description Language还是Description Library? ...

  2. ASP.NET中使用Entity Framework开发登陆注册Demo

    这里更多的是当作随身笔记使用,记录一下学到的知识,以便淡忘的时候能快速回顾 当前步骤是该项目的第一部分 第一部分(当前) 第二部分 大完结版本 直接上步骤,有类似的开发登陆注册也可以参考. 登陆注册的 ...

  3. Java实现 LeetCode 732 我的日程安排表 III(暴力 || 二叉树)

    732. 我的日程安排表 III 实现一个 MyCalendar 类来存放你的日程安排,你可以一直添加新的日程安排. MyCalendar 有一个 book(int start, int end)方法 ...

  4. Java实现 LeetCode 324 摆动排序 II

    324. 摆动排序 II 给定一个无序的数组 nums,将它重新排列成 nums[0] < nums[1] > nums[2] < nums[3]- 的顺序. 示例 1: 输入: n ...

  5. Java实现 LeetCode 278 第一个错误的版本

    278. 第一个错误的版本 你是产品经理,目前正在带领一个团队开发新的产品.不幸的是,你的产品的最新版本没有通过质量检测.由于每个版本都是基于之前的版本开发的,所以错误的版本之后的所有版本都是错的. ...

  6. Java基础(十一)

    一.连接到服务器 telnet是一种用于网络编程的非常强大的测试工具,你可以在命令shell中输入telnet来启动它. 二.实现服务器 服务器循环体: 1.通过输入数据流从客户端接收一个命令. 2. ...

  7. 4k壁纸

    4k

  8. 深度学习在高德ETA应用的探索与实践

    1.导读 驾车导航是数字地图的核心用户场景,用户在进行导航规划时,高德地图会提供给用户3条路线选择,由用户根据自身情况来决定按照哪条路线行驶. 同时各路线的ETA(estimated time of ...

  9. 构建自己的jar包上传至Mvaen中央仓库和版本更新

    构建自己的jar包上传至Mvaen中央仓库和版本更新 一直羡慕别人制造轮子,开源项目,供别人使用:我也想这样,可以自己才疏学浅,本次就将自己写小工具上传到Maven的中央仓库. 一步一步详细教程演示如 ...

  10. virtualbox 基于nat模式搭建局域网并且和宿主机通信

    1.VIRTUALbox 2.两台虚拟机,设置网络为DHCP方式 检查文件确认是dhcp模式不是的百度搜索修改:/etc/sysconfig/network-scripts/ifcfg-enps3(网 ...