matlab仿真实例100题_输入-输出反馈线性化(Feedback linearization)控制算法Matlab仿真实例...

00de6a6fb31fd8ae9414f5a038c1833a.png

反馈线性化(Feedback linearization)可能是大部分人接触非线性控制之后学习的第一种控制方法,个人认为主要优点有两点:一,它的理解和实现都相对简单,二,它能让非线性系统的转换为线性系统,这样接下来,就可以直接套用线性系统中已有的控制方法;但同时,它的缺点也是明显的:如对于relative degree低于状态维度的系统,线性化后可能有internal dynamics,需要单独分析,并且它时常是不稳定(unstable internal dynamics)的,这时候,就不能使用反馈线性化;此外,反馈线性化的有效性十分依赖非线性模型的准确程度。

虽然如此,反馈线性化还是有价值的,并且,它的思想在其他的非线性控制中(如滑模控制、自适应控制)也有体现。本文将首先介绍输入输出反馈线性化(Input-output linearization)的基本原理,随后给出几个例子,简单地演示了如何将反馈线性化和传统的线性控制器(如LQG)结合使用,以及如何通过解耦MIMO系统,实现消除unstable internal dynamic,实现反馈线性化。

给出了用到的Matlabsimulink仿真模型和代码。

本文目录

  • 基本原理
  • 单输入-单输出系统(SISO)
    • 例子
    • 仿真
    • plant部分
    • controller部分
  • 问题
    • 解决办法
    • Simulink中的求导模块的一些反思
  • MIMO

基本原理

单输入-单输出系统(SISO)

equation?tex=%5Cbegin%7Barray%7D%7Bl%7D+%5Cdot%7BX%7D%3Df%28X%29%2Bg%28X%29+u+%5C%5C+y%3Dh%28X%29+%5Cend%7Barray%7D

其中

equation?tex=X%5Cin+R%5E%7Bn%7D%2C+u%5Cin+R%2C+y+%5Cin+R,这里
equation?tex=X大写是因为系统虽然是SISO,但可以有多个状态参数
  • 1、对
    equation?tex=y+求导
    equation?tex=m次,直到
    equation?tex=y%5E%7B%28m%29%7D的表达式出现
    equation?tex=u,注意是
    equation?tex=u的本体,不是
    equation?tex=%5Cdot%7Bu%7D或者
    equation?tex=%5Cint%7Bu%7D或者其他微分形式
  • 2、此时
    equation?tex=y%5E%7B%28m%29%7D可以写成

equation?tex=y%5E%7B%28m%29%7D%3Df%27%28X%29%2Bg%27%28X%29u

其中的

equation?tex=f%27%28X%29%E3%80%81g%27%28X%29就是求导
equation?tex=m+次累积出来的那些杂项。
  • 3、令
    equation?tex=u%3D%5Cfrac%7B1%7D%7Bg%27%28X%29%7D%28-f%27%28X%29%2Bv%29,此时系统被转换为
    equation?tex=y%5E%7B%28m%29%7D%3Dv,系统也可以写成:

equation?tex=%5Cleft%5B%5Cbegin%7Barray%7D%7Bl%7D+%5Cdot%7By%7D%5C%5C+%5Cddot%7By%7D%5C%5C+%5Cvdots%5C%5C+y%5E%7B%28m%29%7D+%5Cend%7Barray%7D%5Cright%5D%3D%5Cleft%5B%5Cbegin%7Barray%7D%7Bl%7D+0%261%260%26%5Ccdots%260%5C%5C+0%260%261%260%260%5C%5C+%5Cvdots%26%5Cvdots%26%5Cvdots%26%5Cvdots%260%5C%5C+0%260%26%5Ccdots%260%260+%5Cend%7Barray%7D%5Cright%5D%5Cleft%5B%5Cbegin%7Barray%7D%7Bl%7D+y%5C%5C+%5Cdot%7By%7D%5C%5C+%5Cvdots%5C%5C+y%5E%7B%28m-1%29%7D+%5Cend%7Barray%7D%5Cright%5D%2B%5Cleft%5B%5Cbegin%7Barray%7D%7Bl%7D+0%5C%5C+0%5C%5C+%5Cvdots%5C%5C+1+%5Cend%7Barray%7D%5Cright%5Dv+%5Ctag%7B1%7D
  • 4、针对这个线性系统设计控制率
    equation?tex=v,如全状态反馈,使系统实现各种目标:如保证稳定、
    equation?tex=y%5Cto+r
    equation?tex=y%5Cto+0
  • 5、最后一步:如果
    equation?tex=m%3Cn,则需要检查系统的内部动态,确认它并不发散,如果
    equation?tex=m%5Cgeq+n则不需要。
    • 这一步存在的原因,感性的解释:根据(1)式我们只能得到
      equation?tex=Y%3D%5By%2C%5Cdot%7By%7D%2C%5Ccdots%2Cy%5E%7B%28m-1%29%7D%5D
      equation?tex=m个量的稳定性,而系统的状态
      equation?tex=X%3D%5Bx_1%2C%5Ccdots%2Cx_n%5D
      equation?tex=n个量,我们需要构建一个函数,用
      equation?tex=Y
      equation?tex=m个量的稳定性,证明
      equation?tex=X里的
      equation?tex=n个量也都稳定,有时候能保证,有时候不能保证。不能保证的时候,我们就说系统有unstable internal dynamics,也就用不了反馈线性化了,这确实挺玄的。
    • 例子:倒立摆小车,想让倒立摆保持一个特定角度,实现方法使是让车一直向某个方向匀加速度运动,这个时候角度是稳定了,但是小车的坐标是发散的,这个例子只是用来解释unstable internal dynamics的,可能并不太准确。

4ff9c522a14d73a4c9735b0e48c96b6d.png
    • 具体的验证方法:在
      equation?tex=Y+的基础上构造一个
      equation?tex=%5Cbar%7BY%7D%3D%5BY%2C%5Cbar%7By%7D_1%2C%5Ccdots%2C%5Cbar%7By%7D_%7Bm-n%7D%5D,新加的
      equation?tex=m-n个变量
      equation?tex=%5Cbar%7By%7D_i全部是
      equation?tex=X的函数,最终能让
      equation?tex=%5Cbar%7BY%7D
      equation?tex=X间存在可逆的变换,即
      equation?tex=%5Cbar%7BY%7D%3D%5Cvarphi%28X%29%2CX%3D%5Cvarphi%5E%7B-1%7D%28%5Cbar%7BY%7D%29,注意这里的可逆是非常重要的性质,然后,对
      equation?tex=%5Cbar%7By%7D_i求导,想法儿证明这些新加变量(也叫internal dynamic)的稳定性。

例子

equation?tex=%5Cbegin%7Barray%7D%7Bl%7D+%5Cdot%7Bx%7D_%7B1%7D%3Dx_%7B2%7D%2Bx_%7B3%7D+%5Csin+%5Cleft%28x_%7B1%7D%5Cright%29+%5C%5C+%5Cdot%7Bx%7D_%7B2%7D%3Dx_%7B3%7D%5E%7B2%7D%2B%5Ccos+%5Cleft%28x_%7B1%7D%5Cright%29+u+%5C%5C+%5Cdot%7Bx%7D_%7B3%7D%3D-%5Cleft%7C%5Ccos+%5Cleft%28x_%7B1%7D%5Cright%29%5Cright%7C+x_%7B3%7D+%5C%5C+y%3Dx_%7B1%7D+%5Cend%7Barray%7D
  • 1、对
    equation?tex=y+求导
    equation?tex=m次,直到
    equation?tex=y%5E%7B%28m%29%7D的表达式出现
    equation?tex=u

equation?tex=%5Cbegin%7Baligned%7D+%5Cdot%7By%7D%3D%5Cdot%7Bx%7D_%7B1%7D%3D%26+x_%7B2%7D%2Bx_%7B3%7D+%5Csin+x_%7B1%7D+%5C%5C+%5Cddot%7By%7D%3D%5Cdot%7Bx%7D_%7B1%7D%3D%26+%5Cdot%7Bx%7D_%7B2%7D%2B%5Cdot%7Bx%7D_%7B3%7D+%5Csin+x_%7B1%7D%2B%5Cdot%7Bx%7D_%7B1%7D+x_%7B3%7D+%5Ccos+x_%7B1%7D+%5C%5C+%3D%26+x_%7B3%7D%5E%7B2%7D%2B%5Ccos+x_%7B1%7D+u-x_%7B3%7D%5Cleft%7C%5Ccos+x_%7B1%7D%5Cright%7C+%5Csin+x_%7B1%7D++%2B%5Cleft%28x_%7B2%7D+%2Bx_%7B3%7D+%5Csin+x_%7B1%7D%5Cright%29+x_%7B3%7D+%5Ccos+x_%7B1%7D+%5Cend%7Baligned%7D
  • 2、这里
    equation?tex=m%3D2
    equation?tex=+x_%7B3%7D%5E%7B2%7D-x_%7B3%7D%5Cleft%7C%5Ccos+x_%7B1%7D%5Cright%7C+%5Csin+x_%7B1%7D++%2B%5Cleft%28x_%7B2%7D+%2Bx_%7B3%7D+%5Csin+x_%7B1%7D%5Cright%29+x_%7B3%7D+%5Ccos+x_%7B1%7D+对应
    equation?tex=f%27%28X%29
    equation?tex=%5Ccos+x_1对应
    equation?tex=g%27%28X%29
  • 3、令
    equation?tex=u%3D%5Cfrac%7B1%7D%7Bg%27%28X%29%7D%28-f%27%28X%29%2Bv%29,此时系统就被线性化了,等价为
    equation?tex=%5Cddot%7By%7D%3Dv
  • 4、我们先令
    equation?tex=v%3D-2%5Cdot%7By%7D-y
    equation?tex=y满足的动态方程就是一个标准的二阶系统,可以保证收敛。
  • 5、因为
    equation?tex=m%3D2%3Cn%3D3,需要研究internal dynamics

equation?tex=%5Cbar%7BY%7D%3D%5By%2C%5Cdot%7By%7D%2Cx_3%5D,这个
equation?tex=%5Cbar%7BY%7D
equation?tex=X之间存在可逆的变换

equation?tex=%5Cbegin%7Barray%7D%7Bl%7D+%5Cbar%7BY%7D_1%3Dy_%7B%7D%3Dx_%7B1%7D+%5C%5C+%5Cbar%7BY%7D_2%3D%5Cdot%7By%7D%3Dx_%7B2%7D%2Bx_%7B3%7D+%5Csin+%5Cleft%28x_%7B1%7D%5Cright%29+%5C%5C+%5Cbar%7BY%7D_3%3Dx_%7B3%7D%3Dx_%7B3%7D+%5C%5C+%5CDownarrow%5C%5C+%7BX%7D_1%3Dx_%7B1%7D%3Dy_%7B%7D+%5C%5C+%7BX%7D_2%3Dx_%7B2%7D%3D%5Cdot%7By%7D-x_%7B3%7D+%5Csin+%5Cleft%28y%5Cright%29+%5C%5C+%7BX%7D_3%3Dx_%7B3%7D%3Dx_%7B3%7D+%5Cend%7Barray%7D

接下来研究新引入的这个变量的稳定性

equation?tex=%5Cbegin%7Baligned%7D++%5Cdot%7Bx%7D_%7B3%7D%3D-%5Cleft%7C%5Ccos+%5Cleft%28x_%7B1%7D%5Cright%29%5Cright%7C+x_%7B3%7D+%5Cend%7Baligned%7D

因为

equation?tex=y%3Dx_1可以确认收敛到0,所以这里
equation?tex=x_3也可以保证收敛。因此我们可以使用反馈线性化来进行控制。

仿真

c1f5be76ae36a07ba341c55f0219ad84.png

plant部分

0eb77085d26efa6b38f236e87f2dbdbe.png
  • 在积分处设置初值,全部为1
  • 系统的仿真使用matlab function模块,这个模块很适合仿真非线性系统,效率很高。
function [x1d,x2d,x3d] = fcn(x1,x2,x3,u)

x1d = x2+x3*sin(x1);
x2d = x3^2+cos(x1)*u;
x3d = -abs(cos(x1))*x3;

end 

controller部分

b258a7ea5e4807e7ccb8110050873631.png
function u = fcn(x1,x1d,x2,x3)

g = cos(x1);
f = x3^2-x3*abs(cos(x1))*sin(x1)+(x2+x3*sin(x1))*x3*cos(x1);

v = -2*x1d-2*x1;
u = 1/g*(-f+v);

end

仿真效果

54e5fac10a77f597807f6dde840818d4.png

可见系统的三个状态都很好的收敛为0了。

问题

但是,有另外两个问题:

  • 这个系统不是SISO么,哪儿来的全状态可用?
  • 这个模型里控制器的求导模块会放大观测噪声,结果必然会导致系统性能变差,怎么办?

思考:

  • 这里用了全状态输入到控制器中,这的确是不能直接实现的,因为我们假定只有
    equation?tex=y%3Dx_1这一个输出。但是,我们可以设计一个非线性观测器,由系统输入和输出观测得到系统的全状态,这个观测器对系统的影响,可以等价地理解为,输入给控制器的状态量相当于真值+一个逐渐收敛到有界的扰动。非线性观测器的设计不是这一篇的内容,但我们可以仿真模拟一下。
  • 这里加了一个模块,作用是给信号加上一个收敛到有界的噪声信号

90e4dc32edda5c59daa0099ff6fafa28.png
加了噪声之后的系统

b7bb6c5334776a723f61080d8bcc7237.png
模块的功能是为输入信号加上两部分:一部分是常有的噪声,另一部分代表逐渐收敛为0的观测误差

噪声的设置:power=1e-2 , sample time = 0.1

这个模块的示例:输入黄色,输出蓝色

33b20b203787bdf8ab0f60ddc63b93f8.png

实际仿真结果

2622b055e2d6f7a626ec05371ea546e7.png
  • 可见加了噪声之后的系统(模拟用观测器给出的状态估计计算控制量u的大小的系统),状态还是能够收敛到有界的。但是这并不意味着所有的系统都能有这种鲁棒性,只是这里研究的系统性质比较好,还需要结合具体系统进行分析。
  • 此外,可以看到蓝色的
    equation?tex=x_2+抖得比另外两个状态多,这是因为控制器中的求导模块有放大噪声的问题,也就是上面谈到的第二个问题。

1e7ef71ca838fa37368d95429717c34e.png

这个求导模块会把白噪声放大几百倍,并且这不能通过求导模块里的那个参数c的设置来得到改善。

b7840d98c21637008382532eb6085ded.png
黄色:噪声信号,蓝色:经过求导模块之后的输出

解决办法

在上面,通过反馈线性化之后的系统等价为

equation?tex=%5Cddot%7By%7D%3Dv,我们又令
equation?tex=v%3D-2%5Cdot%7By%7D-y,最终得到的等价系统是
equation?tex=%5Cddot%7By%7D%3D-2%5Cdot%7By%7D-y,这是一个标准的二阶系统,能保证收敛,但是由于
equation?tex=%5Cdot%7By%7D+一项的存在,我们需要对
equation?tex=y进行求导,而求导又会放大噪声。因此,考虑设计另外一种
equation?tex=v的控制策略,
此时
equation?tex=v不再只是
equation?tex=y
equation?tex=%5Cdot%7By%7D%2C%5Cddot%7By%7D%2C%5Ccdots的线性组合了,而是存在传递函数
equation?tex=H%28s%29,
equation?tex=v%3DH%28s%29y,该滤波的设计目标是使系统对于观测噪声具有一定的鲁棒性。

这里使用LQG控制器来计算出

equation?tex=H%28s%29

关于LQG可以参考我写的另外一篇文章以及里面提到的参考资料

LQG输出调节控制Matlab仿真实例 - 知乎 (zhihu.com)

LQG控制器是一种面对观测噪声和过程噪声,满足最优标准的观测器线性重构状态反馈的控制器。

被控系统:

equation?tex=%5Cleft%5B%5Cbegin%7Barray%7D%7Bl%7D+%5Cdot%7By%7D%5C%5C+%5Cddot%7By%7D%5C%5C+%5Cend%7Barray%7D%5Cright%5D%3D%5Cleft%5B%5Cbegin%7Barray%7D%7Bl%7D+0%261+%5C%5C+0%260++%5Cend%7Barray%7D%5Cright%5D+%5Cleft%5B%5Cbegin%7Barray%7D%7Bl%7D+y%5C%5C+%5Cdot%7By%7D%5C%5C%5Cend%7Barray%7D%5Cright%5D%2B%5Cleft%5B%5Cbegin%7Barray%7D%7Bl%7D+0%5C%5C+1+%5Cend%7Barray%7D%5Cright%5Dv+%5C%5C+%E8%BE%93%E5%87%BA%3Dy%3D%5Cleft%5B%5Cbegin%7Barray%7D%7Bl%7D+1%260+++%5Cend%7Barray%7D%5Cright%5D+%5Cleft%5B%5Cbegin%7Barray%7D%7Bl%7D+y%5C%5C+%5Cdot%7By%7D%5C%5C%5Cend%7Barray%7D%5Cright%5D
A = [ 0 1  ; 0 1 ];
B = [ 0 1 ].';
C = [ 1 0 ];
D = 0;

可控性和可观测性检查

obsv(A,C)
ctrb(A,B)

可见系统可观也可控,因此LQG是可以设计出来的

sys = ss(A,B,C,D);

%这里的性能指标和噪声信息并没有仔细调,
QXU = blkdiag(eye(2),0.1);
QWV = blkdiag(eye(2),0.1);
reg = lqg(sys,QXU,QWV);

使用这个得到的regulator来控制反馈线性化之后的系统,搭建下面的模型

5e8d61be64a969fb2e4c719965a30ec4.png

其中plant模型没变,controller模型:

a6c21822810aa6a87e846455be6e1e1f.png
reg使用的是LTI System模块,参数设置为reg即可

代码:

function u = fcn(x1,x2,x3,v)

g = cos(x1);
f = x3^2-x3*abs(cos(x1))*sin(x1)+(x2+x3*sin(x1))*x3*cos(x1);


u = 1/g*(-f+v);

end

即把原来在函数中计算的v改为了外源输入

观测噪声Power设置为1e-3,控制效果:

6999b0559ffc2e9499ad557e7fab655e.png
上:原来的方案(使用求导),下:使用LQG的方案

可以看到使用LQG的方案也抖,甚至蓝色在负的峰值还变差了,但是如果我们看控制输入

89889ef2cab87ac3e0f7d646568662a0.png
上:原来的方案(使用求导),下:使用LQG的方案

可以看到使用求导的方案,因为信号中有噪声,所以控制输入有毛刺,而且波动大,而使用LQG的方案对噪声有一定抗性,控制更加平滑,波动较小。

Simulink中的求导模块的一些反思

c444e74c21f4b7bd8cd5433dede9164b.png

最近学习非线性控制、滑模控制,经常需要用到这个模块,也有了一点关于它的思考。

simulink里的求导模块本身是一个离散的形式[1]

equation?tex=y%28t%29%3D%5Cfrac%7B%5CDelta+u%7D%7B%5CDelta+t%7D%3D%5Cfrac%7Bu%28t%29-u%5Cleft%28T_%7B%5Ctext+%7Bprevious+%7D%7D%5Cright%29%7D%7Bt-T_%7B%5Ctext+%7Bprevious+%7D%7D%7D+%5Cmid+t%3ET_%7B%5Ctext+%7Bprevious+%7D%7D

这个模块对于没有噪声的信号,十分精准,但是对于有噪声的信号,会把噪声放大,输出的信号有毛刺,对于理论验证,它往往是准确的,但是对于现实工程的算法实现,应该肯定不会用这个。

让问题的分析变复杂的是,求导模块这是一个离散的模型,而我要验证的控制律和模型是基于连续时间的,同时,simulink的仿真又是使用离散计算来对连续时间微分模型的逼近,所以,正如评论区里指出的,还是应当尽量避免在simulink中使用这个模块,比如采用后一种结合lqg的方式。

连续与离散,控制理论研究和实际工程存在的这种脱节,实在经常让我困惑,或许是学的还不够多,但我觉得在未来的学校里的控制理论课程设计上,还是最好以连续时间引入,以离散时间分析为主。这样,对于绝大多数情况,理论、模拟、实践都是一致的,或许会少很多问题。

MIMO的例子见

MIMO反馈线性化(Feedback linearization)控制算法Matlab仿真实例 - 知乎 (zhihu.com)

参考

  1. ^https://www.mathworks.com/help/simulink/slref/derivative.html

版权声明:本文为weixin_42508905原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。