
反馈线性化(Feedback linearization)可能是大部分人接触非线性控制之后学习的第一种控制方法,个人认为主要优点有两点:一,它的理解和实现都相对简单,二,它能让非线性系统的转换为线性系统,这样接下来,就可以直接套用线性系统中已有的控制方法;但同时,它的缺点也是明显的:如对于relative degree低于状态维度的系统,线性化后可能有internal dynamics,需要单独分析,并且它时常是不稳定(unstable internal dynamics)的,这时候,就不能使用反馈线性化;此外,反馈线性化的有效性十分依赖非线性模型的准确程度。
虽然如此,反馈线性化还是有价值的,并且,它的思想在其他的非线性控制中(如滑模控制、自适应控制)也有体现。本文将首先介绍输入输出反馈线性化(Input-output linearization)的基本原理,随后给出几个例子,简单地演示了如何将反馈线性化和传统的线性控制器(如LQG)结合使用,以及如何通过解耦MIMO系统,实现消除unstable internal dynamic,实现反馈线性化。
给出了用到的Matlabsimulink仿真模型和代码。
本文目录
- 基本原理
- 单输入-单输出系统(SISO)
- 例子
- 仿真
- plant部分
- controller部分
- 问题
- 解决办法
- Simulink中的求导模块的一些反思
- MIMO
基本原理
单输入-单输出系统(SISO)
其中
- 1、对
求导
次,直到
的表达式出现
,注意是
的本体,不是
或者
或者其他微分形式
- 2、此时
可以写成
其中的
- 3、令
,此时系统被转换为
,系统也可以写成:
- 4、针对这个线性系统设计控制率
,如全状态反馈,使系统实现各种目标:如保证稳定、
或
- 5、最后一步:如果
,则需要检查系统的内部动态,确认它并不发散,如果
则不需要。
- 这一步存在的原因,感性的解释:根据(1)式我们只能得到
这
个量的稳定性,而系统的状态
有
个量,我们需要构建一个函数,用
里
个量的稳定性,证明
里的
个量也都稳定,有时候能保证,有时候不能保证。不能保证的时候,我们就说系统有unstable internal dynamics,也就用不了反馈线性化了,这确实挺玄的。
- 例子:倒立摆小车,想让倒立摆保持一个特定角度,实现方法使是让车一直向某个方向匀加速度运动,这个时候角度是稳定了,但是小车的坐标是发散的,这个例子只是用来解释unstable internal dynamics的,可能并不太准确。
- 这一步存在的原因,感性的解释:根据(1)式我们只能得到

- 具体的验证方法:在
的基础上构造一个
,新加的
个变量
全部是
的函数,最终能让
与
间存在可逆的变换,即
,注意这里的可逆是非常重要的性质,然后,对
求导,想法儿证明这些新加变量(也叫internal dynamic)的稳定性。
- 具体的验证方法:在
例子
- 1、对
求导
次,直到
的表达式出现
- 2、这里
,
对应
,
对应
。
- 3、令
,此时系统就被线性化了,等价为
- 4、我们先令
,
满足的动态方程就是一个标准的二阶系统,可以保证收敛。
- 5、因为
,需要研究internal dynamics
令
接下来研究新引入的这个变量的稳定性
因为
仿真

plant部分

- 在积分处设置初值,全部为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部分

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仿真效果

可见系统的三个状态都很好的收敛为0了。
问题
但是,有另外两个问题:
- 这个系统不是SISO么,哪儿来的全状态可用?
- 这个模型里控制器的求导模块会放大观测噪声,结果必然会导致系统性能变差,怎么办?
思考:
- 这里用了全状态输入到控制器中,这的确是不能直接实现的,因为我们假定只有
这一个输出。但是,我们可以设计一个非线性观测器,由系统输入和输出观测得到系统的全状态,这个观测器对系统的影响,可以等价地理解为,输入给控制器的状态量相当于真值+一个逐渐收敛到有界的扰动。非线性观测器的设计不是这一篇的内容,但我们可以仿真模拟一下。
- 这里加了一个模块,作用是给信号加上一个收敛到有界的噪声信号


噪声的设置:power=1e-2 , sample time = 0.1
这个模块的示例:输入黄色,输出蓝色

实际仿真结果

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

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

解决办法
在上面,通过反馈线性化之后的系统等价为
这里使用LQG控制器来计算出
关于LQG可以参考我写的另外一篇文章以及里面提到的参考资料
LQG输出调节控制Matlab仿真实例 - 知乎 (zhihu.com)
LQG控制器是一种面对观测噪声和过程噪声,满足最优标准的观测器线性重构状态反馈的控制器。
被控系统:
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来控制反馈线性化之后的系统,搭建下面的模型

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

代码:
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,控制效果:

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

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

最近学习非线性控制、滑模控制,经常需要用到这个模块,也有了一点关于它的思考。
simulink里的求导模块本身是一个离散的形式[1]
这个模块对于没有噪声的信号,十分精准,但是对于有噪声的信号,会把噪声放大,输出的信号有毛刺,对于理论验证,它往往是准确的,但是对于现实工程的算法实现,应该肯定不会用这个。
让问题的分析变复杂的是,求导模块这是一个离散的模型,而我要验证的控制律和模型是基于连续时间的,同时,simulink的仿真又是使用离散计算来对连续时间微分模型的逼近,所以,正如评论区里指出的,还是应当尽量避免在simulink中使用这个模块,比如采用后一种结合lqg的方式。
连续与离散,控制理论研究和实际工程存在的这种脱节,实在经常让我困惑,或许是学的还不够多,但我觉得在未来的学校里的控制理论课程设计上,还是最好以连续时间引入,以离散时间分析为主。这样,对于绝大多数情况,理论、模拟、实践都是一致的,或许会少很多问题。
MIMO的例子见
MIMO反馈线性化(Feedback linearization)控制算法Matlab仿真实例 - 知乎 (zhihu.com)
参考
- ^https://www.mathworks.com/help/simulink/slref/derivative.html