当前位置:   article > 正文

【Matlab】建立最优控制LQR控制器模型_lqr控制算法matlab

lqr控制算法matlab

前言

之前做了有关于系统辨识以及配置极点来控制系统响应的相关内容,那些相当于是打开了一个新世界的大门,在此基础上,一直想学习一下最优控制的相关内容,并应用在项目上,因此,学习了相当长的时间,然后搭建模型,不过越来越感到,我学习到的也只是控制世界的冰山一角,话不多说,开始记录搭建模型的步骤。

传递函数转化到状态空间

首先,我可以辨识出系统的传递函数,需要转化成状态方程,这里我稍微记录了一下由传递函数转换到状态空间的步骤:

以上是随便举了一组数据手算的,之后使用Matlab验证,Matlab是有这种转换函数可以直接调用的:

  1. %*************************************************************************%
  2. %传递函数转化为状态方程
  3. %**********************************************************************%
  4. num = [4,9,14,23];
  5. den = [2,4,6,10];
  6. sys = tf(num,den); %转化为传递函数G
  7. [A,B,C,D]=tf2ss(num,den); %传递函数转化为状态空间

可以看到,与我实际计算出来的是吻合的。当然,如果能够直接建立微分方程的模型,就不需要此步骤了。

建立观测器

接下来,需要建立状态观测器,因为实际的状态变量x,并不容易被测量,或者说,有时候由传递函数转化到状态空间之后,x代表的状态是对应不到实际的物理意义的,因此观测器的设计还是很有必要,这里我参考学习了一些全阶观测器的设计过程,步骤如下:

1.建立状态方程与估计方程:

2.求出状态与估计状态之差的通式

3.引入状态误差变量,求出其特征值,即可得出状态观测器L矩阵的元素值

例:

总体步骤:

求解全阶观测器L矩阵在Matlab也是直接有函数可以计算的,上述的手算过程只是为了来练习一下,了解观测器的原理与步骤。程序如下:

  1. %*************************************************************************%
  2. %计算全阶观测器矩阵L的参数
  3. %**********************************************************************%
  4. %输入状态方程矩阵
  5. A = [0 1;-1 -0.5];
  6. B = [0;1];
  7. C = [1 0];
  8. D = 0;
  9. %输入观测器期望极点 即特征值
  10. V = [-1 -1];
  11. L = (acker(A',C',V))';
  12. L =
  13. 1.5000
  14. -0.7500

建立simulink仿真:

我在积分环节那里设置了初始值,就是为了让实际状态与估计状态初始不一样,这样可以看到收敛效果,从上图中可以看出估计值最终收敛,与实际状态x重合。

求解控制律U

这里设控制律U = -K * X + e ,K即为空置率矩阵,X为状态矩阵,e为目标值与实际值的误差(为了加入跟随性能)

具体求解最优控制率U的问题,设计泛函分析与极小值原理等等,这个我只是看了一部分书上的东西,在没有自己琢磨好之前,还是先留着,以后自己验算完成再发。

因此我就省事了一下,直接用Matlab求解K矩阵。上面那个系统的参数有些简单,为了验证效果,我把传递函数取了一些奇怪的数字:

  1. %*************************************************************************%
  2. %传递函数转化为状态方程
  3. %**********************************************************************%
  4. num = [0 333.1 279.9 358.1];
  5. den = [1 0.5404 0.05445 0];
  6. sys = tf(num,den); %转化为传递函数G
  7. [A,B,C,D]=tf2ss(num,den); %传递函数转化为状态空间
  8. A =
  9. -0.5404 -0.0544 0
  10. 1.0000 0 0
  11. 0 1.0000 0
  12. B =
  13. 1
  14. 0
  15. 0
  16. C =
  17. 333.1000 279.9000 358.1000
  18. D =
  19. 0

可以看到这个系统的矩阵略微复杂了一些,真实的系统参数应该就是这样比较难算的,这里还是得感谢Matlab这个工具,帮我省略了一大波计算过程,我可以直接得到观测器矩阵L的值:

  1. %根据观测器的期望极点计算观测器L矩阵
  2. L = (acker(A',C',V))';
  3. L =
  4. 0.9697
  5. 0.1769
  6. -0.9733

以及得到控制律矩阵K的值:

  1. %指定QR矩阵,计算控制率
  2. Q = [100,0,0;0,1,0;0,0,1];
  3. R = 0.2;
  4. K = lqr(A,B,Q,R); %输出LQR控制器的K矩阵
  5. >> K
  6. K =
  7. 22.2824 10.2930 2.2361

画出Simulink模型:

这里的控制器U的状态输入是使用估计状态 xhat,实际项目中也会是使用估计值。

在simulink设置中设置计算步长:

可以看到观测器的收敛效果以及输出量的跟随效果。点个赞喽!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/689802
推荐阅读
相关标签
  

闽ICP备14008679号