一、什么是特征值和特征向量二、什么是特征值和特征函数三、什么是状态方程四、如何求解状态方程五、可控性和可观性六、如何用状态反馈进行极点配置七、如何进行跟踪控制八、全状态观测器九、缩减状态观测器十、小结
一、什么是特征值和特征向量
相信大家都学过矩阵,这是大学最基本的课程,矩阵里面有一个核心的概念,叫特征值和特征向量,怎么定义的呢?大概就长这个样子:
其中 是一个 的矩阵, 是一个 的向量, 是一个标量。可不要小看这个方程,它蕴藏着巨大的宝藏,要深入理解这式子并不简单。我们先从方程的左半部分 说起,即什么是矩阵的乘法,举个简单的例子,假设我们现在有一个向量在 轴上,
![]()
同时有一个矩阵
那两者乘积是什么呢?很容易得到;
可以看到,在 轴上的向量 通过矩阵 的乘积,变成了在 轴上的向量 。
因此,我们可以得出第一个结论:矩阵代表着某种变换,可以将空间中的一个向量变成另外一个向量。
好,现在我们要从另外一个角度来看,我们知道两个向量 , 的内积定义为:
矩阵的乘法是怎么定义的呢?
可以看到,矩阵的乘法其实就是内积,而内积代表什么?——投影啊!所以,我们就可以得到第二个结论:矩阵可以看成是一个坐标系,矩阵和向量的乘积,就是该向量在坐标系的投影。
矩阵一会是坐标系,一会又变成了变换,那到底是怎么一回事?——这就有点像波粒二象性了,光到底是粒子还是波?——物理学家是怎么解决这个问题的?——在经典物理学里面,光既是粒子,又是波,看你怎么观测它。矩阵也一样,站在不同的角度,它的作用就不一样。
怎么说?——假如我们现在有一个向量 ,我们想变成向量 ,怎么办?——两种方式,第一:坐标系不变,把向量 转换到 ,对应第一条矩阵的解释;第二:向量不变,把坐标系变换了,向量 在另一个坐标系下就变成了 。两个完全等价的,因为矩阵描述的变换,而变换是相对的。
好了,我们费了好大的劲,终于把 的左半部分说完了,现在我们再看一下完整的方程又代表什么意思,有了前面的铺垫,我们解释起来就简单多了。这个方程啥意思呢?——向量 通过 的变换,幅值变化了 倍,方向未发生变化;换个说法,存在向量 ,其在坐标系 中的投影,方向和 相同,幅值变化了 倍。也就是说,我们可以用很多 来对 进行测试,结果发现,坐标系 不再是一团乱麻,在某些方向上出现了一些特殊的结果。比如在向量 的方向,出现了方向和数值的解耦,这就给我们提供了某种坐标系 的信息,这些信息是 的内部固有结构决定的,所以称之为特征值和特征向量。
那我们该怎样利用这些信息呢?可以证明,特征值和特征向量都不止一个,不妨假设它的特征向量别为 ,
对应的特征值分别为:
则有:
两边左边同时乘以 ,就可以得到:
也就是说,通过特征向量组成的矩阵,我们顺藤摸瓜,顺便就把矩阵 变成了一个对角矩阵,而对角矩阵是一个性质非常好的矩阵,尤其适合当坐标系使用,比如最常用的三维欧式空间的坐标系就可以表示为:
总结一下:矩阵为我们提供了一种描述“变化”的方法,而特征变换则是利用矩阵本身具有的固有特性,将矩阵代表的坐标系转换到更简单的坐标系(或者是基)来进行研究,从而使“变化”这种现象变得更加简单。
二、什么是特征值和特征函数
前面我们说了,矩阵的特征向量有如下特性:
矩阵 代表某种转换,把变量 变成 。现在我们从一个更数学的角度来看一下。假设 代表某种映射, 也不再是向量,而是函数,即
映射可以有很多种,不同的映射规则可以得到不同的结果,比如说,映射 代表微分算子 ,那会是怎么样呢?我们不妨简单推导一下看看:
两边同时乘以 可以得到:
两边积分就可以得到:
也就是说,对于微分算子 , 是其天然的特征函数,因为对于指数函数来说, ,对于微分运算来说,运算的结果只是幅值变化了。当然,我还可以对 的数量进行扩展,比如:
则得到:
写成展开的形式更容易看一些:
很容易得到,微分方程组的解为:
也就说,假设所有满足 的函数组成一个空间,则这个空间的变量 是由仅由特征函数 叠加组成。换句话说, 是 解空间的“基”或者“坐标系”,而 则可以看成是坐标值。
特征函数和特征向量一样,就是利用“变换”本身的特性,寻找一种更简单的“坐标(或者说基)”来解决问题。而对于微分这种运算来说,指数函数 就是最简单的一种“坐标”。
当然,对于坐标而言, 只要求独立,不要求一定正交,因此矩阵 不再是对角矩阵,可以是更一般的矩阵,我们不妨用 表示,这样我们就得到:
眼尖的童鞋可能已经看到,这不就是状态方程吗?——没错!
三、什么是状态方程
前面我们已经基本得到了状态方程了,可是仔细一看呢,这个方程和输入貌似没有关系,那可以看成是零输入,现在我们要把输入加上:
我们说了, 可以看成是变量,导数 代表变化,整个式子放在一起,就是系统在在输入 的作用下,变量 在坐标系 中是如何变化的。
当然我们还关心在坐标系下的输出是啥,可以这么定义:
称之为输出方程,矩阵 可以看成是坐标值, 可以看成是前馈,即输入直接到输出了。画成框图的形式如下:
![]()
很多系统没有前馈,也就是 ,这个时候可简化为:
![]()
这种通过状态方程来描述系统的方式,我们一般称现代控制理论,那和经典控制理论有什么区别呢?首先先说相同点:那就是这两者应该是等价的,因为都是对自然现象的描述。区别就是现代控制理论更精细。啥意思呢?——打个比方,我们现在面前有一栋楼,经典控制理论会说:这栋楼有9层,在1楼有一个入口,一个出口,入口流量是xx,出口流量是xx,即SISO(single input single output);而现代控制理论会怎么说呢?它会说,这栋楼有9层,每层都有一个入口和出口,第一层的出、入口流量是xx,第二层出、入口的流量是xx,...第9层出、入口的流量是xx,即MIMO(multiple input multiple output)。也就是说,现代控制理论的状态方程,用矩阵刻画了系统的内部结构,将系统的变化轨迹投影到更简单的坐标系上,从而可以在各个维度上进行描述。
先以简单的直流电机为例,一个典型的直流电机的数学模型如下:
![]()
其中 为力矩系数, 为反电势系数, 为线圈电感, 为线圈电阻, 为转子转动惯量, 为转子阻尼系数, 为负载, 为转子速度, 为转子位置, 为端部电压,这就是理想直流电机的数学模型,注意这是开环的电机模型。
电压平衡方程式为: ![]()
反电势方程为: ![]()
力矩方程为: ![]()
转子的力矩平衡方程为: ![]()
如果都采用SI单位制,则 ,假定状态变量为转角 (代表位置),转速 (代表速度)以及电流 (代表加速度),则于是可以获得直流电机的状态方程为:
![]()
输出方程为:
在MATLAB里面构造状态方程也很简单,只要定义 , , , 四个矩阵就行了。
J = 3.2284E-6;%inetia
Kf = 3.5077E-6; %damping
K = 0.0274; % torque constant
R = 4; %resistance
L = 2.75E-6; %inductance
A = [0 1 0
0 -Kf/J K/J
0 -K/L -R/L];
B = [0 ; 0 ; 1/L];
C = [1 0 0];
D = 0;
motor= ss(A,B,C,D);我们也可以用simulink建模,具体如下:
![]()
当然,最简单的还是simulink的自带模块state space。
四、如何求解状态方程
方程我们有了,接下来就是如何求解了,我们先来审视一下状态方程:
很遗憾,这个方程不是很好解,我们先来个简化版的,如果输入为零, ,会是怎么样呢?此时 ,借鉴我们我们在第二节的思路,我们知道, 的解为: ,类比一下, 的解为:
当然这可以通过严谨的数学求解得到。可见,在零输入条件下,系统的输出由初始条件 以及矩阵 决定。这个结论非常重要,是线性状态方程的核心概念,后续状态反馈以及观测器模型处理方式都是将有输入的方程转化成零输入的方程。
我们自来看一下 时状态方程的解,这个稍微复杂一点,解的过程不重要,我们直接给结论:
第一项我们称之为通解,它是自由方程(无输入) 的解,它取决于初始状态 以及系统的模态( 等,即 对应的特征函数),这个好理解,我们前面说过了。第二项是特解,也就是系统初始条件为零时( )剩余的那部分解,它取决于系统的输入 以及系统的模态 。
把 代入状态方程 可得:
即
两边积分:
于是我们可以求得状态方程总的解为:
同样的方法,不难求得输出方程的解为:
可见,对于状态方程,无论是特解还是通解, 都是非常重要的组成部分,那这个函数又是什么样的呢?我们知道, 的泰勒展开为:
类比一下, 则可以展开为:
又 ,所以 ,代入上面泰勒展开:
可见,状态方程的解就是矩阵 特征值 对应的模态 的叠加,因此,想要系统的稳定,特征值 必须位于复平面的负半部分,否则,对应的模态将会发散。
举个简单的例子,假设 , , , ,这就是一个最简单一阶单输入单输出系统,假如这个系统的输如为阶跃信号,即
系统的初始状态为零,即 ,那么这个系统的响应是啥呢?直接代入上面的公式就行了:
非常简单,而且最重要的是,我们不需要进行拉普拉斯变换了,直接在时域就可以求解。因此,这种方法也称之为时域法。
很多时候,我们都是零初始条件,因此只剩特解为(单位阶跃响应):
求解结果为:
还是前面直流电机的例子,假设我们要观察速度输出,即将 改为 ,我们直接在时域计算输出,就可以的到电机的在单位阶跃下的速度响应了。
![]()
由 解的方程可以看出,假定系统是稳定的,在零初始条件下,解分成两部分,一部分瞬态解,随时间变化,逐渐衰减到零,另外一部分为稳态解。显然,稳态解是我们想要的,而瞬态解,我们则希望它尽快衰减到零,这就要求系统的模态 要尽快衰减,这可以通过设定矩阵 的特征值来实现,那为什么很多书上都写要通过系统的极点配置来实现呢?——两者本质一回事,我们来推导一下。
我们先来看看状态方程和传递函数的关系。老办法,还是拉普拉斯变换。因为前馈比较容易分析,我们先忽略 。对状态方程两边同时进行拉普拉斯变换:
适当的变形可以得到:
由于我们计算传递函数时一般忽略初始条件的,所以:
对输出方程两边同时进行拉普拉斯变换:
所以系统的传递函数为:
其中 为 伴随矩阵, 为 行列式。而矩阵 的特征值怎么计算呢?
把特征值 换成 两个样子就一样了,也就是说矩阵 的特征值是传递函数的极点。在小潘的另一篇文章J Pan:如何入门自动控制理论中,我们分析了,传递函数的极点,就代表了系统的一种模态( ),而这与本文中所说的微分算子 特征函数就是一回事,因此是统一的。因此,对于控制系统,合理的极点配置,对于系统的动态响应是非常重要的。
五、可控性和可观性
假设我们一个状态方程如下:
很显然,这个系统有3个模态将会在瞬态响应中出现,分别为 , 和 ,显然, 和 是衰减的模态,而 则是发散的模态。由于矩阵 的第一行为 ,因此这个模态是不受输入 和 控制的,可以想象的到,这个系统会很危险——发散的!
通过前面我们分析,直觉告诉我们,是不是有模态不可控,貌似和矩阵 (确定模态)即矩阵 (确定输入)有关,那怎么才能通过这两个矩阵来判断系统是否可控呢?经过数学推导,我们发现可以这样进行简单的判断,构造矩阵:
当这个矩阵的秩为 时,系统是可控的,否则不可控。当然,我们一般不用手算,MATLAB代码为:
Co = ctrb(A,B);
rank(Co)我们再来看看可观性,这要从输出方程来看:
状态方程还和前面一致,系统有三个模态 , 和 ,因为矩阵 中第一列为零,也就是说 对应的模态 ,它既未在输出变量 中出现,也未在 中出现,因此 状态变量 是不可观测的。
同样,系统的可观性也可通过矩阵的秩来判断:
如果矩阵 的秩为 ,则系统可观,否则不可观。MATLAB代码为:
O = obsv(A,C);
rank(O)六、如何用状态反馈进行极点配置
前面我们在说到状态方程的时域解时说到了,无论是通解还是特解,都取决于 ,保证系统的稳定,就要求矩阵 的特征值也就是极点位于复平面的左半部分。当然,要想系统有更好的响应,需要对极点做更优化的配置,这就需要用到状态反馈了。
具体做法就是将系统的全状态引入到输入里面去,见下图。
![]()
其中, 所在的支路就是提供状态反馈,由于该条之路的存在,状态方程发生了改变。此时
则状态方程变为:
因此,闭环控制系统的极点分布为:
因此,我们想要把极点配置在任何位置,只需要改变矩阵 即可。
还是前面DC motor的例子,假设我们想把极点配置在 ,我们借助MATLAB函数place帮我们计算一下,具体代码如下:
p1 = -100+100i;
p2 = -100-100i;
p3 = -200;
K = place(A,B,[p1, p2, p3])
t = 0:0.001:0.05;
sys_cl = ss(A-B*K,B,C,D);
step(sys_cl,t)此时,MATLAB给出的状态反馈增益为:
我们再搭个Simulink模型验证一下:
![]()
位置响应曲线如下。可见,瞬态部分最终完全衰减,最终只剩下稳态的部分。但注意:此时系统的输出和输入还有较大的差别,该如何解决?
![]()
可见,单位阶跃信号的响应样子和阶跃信号差不多了,但是幅值差了很多倍,我们需要通过一个增益调整过来,我们把框图改成如下形式,在指令通道上增加了 ,那该如何计算这个增益呢?
![]()
我们从稳态入手,当系统到达稳态的时候,会出现什么呢?——什么是稳态呢?就是状态量不再变化,换个说法,也就是状态量的导数为零。我们来看一下状态方程:
当 时,我们把 称之为平衡点,这时可以得到:
所以
如果我们想要输入输出一致,则有 ,代入上式就可以得到;
我们搭个模型试一下:
![]()
输出曲线如下,可见,输出基本跟随输入,但是放大了看,还是有稳态误差。
![]()
七、如何进行跟踪控制
前面一节我们看到了,只进行状态反馈,只能调整系统模态的衰减快慢,虽然能保证输入输出一致,但仍存在在稳态误差,而且因为没有对输出进行反馈控制,系统的抗干扰能力很差,也就是说,还不能算是一个很好的控制系统。那怎么办呢?——在经典控制理论里面,我们是怎么消除静态误差的呢?——用积分,那有什么借鉴意义呢?——我们是不是可以增加一个新状态变量(state)来表征输出和输入之间误差?如果这个状态变量为零,那输入和输出就一致了。
状态变量定义如下:
两边都微分一下,就是:
把这个新变量扩充到原来的状态方程
可以得到:
我们把扩展的矩阵起个新的名字,分别为 , , 。还拿前面的DC motor的例子,我们把误差状态变量增加进去,就可以得到新的状态方程:
以及新的输出方程:
式中 就是前面的 。
画成框图就容易多了:
![]()
接下来的任务就是该如何去确定反馈增益 。
根据上面的框图,可以得到输入 的表达式为:
![]()
令 以及 ![]()
则可以得到有输出反馈的系统状态方程:
以及输出方程
因此,闭环控制系统的极点分布为:
也就是说,我们只要配置矩阵 的极点就可以了,具体代码如下:
Aa = [0 1 0 0
0 -Kf/J K/J 0
0 -K/L -R/L 0
1 0 0 0];
Ba = [0 ; 0 ; 1/L ; 0 ];
Br = [0 ; 0 ; 0; -1];
Ca = [1 0 0 0];
Da = [0];
p4 = -300;
Ka = place(Aa,Ba,[p1,p2,p3,p4]);
Kc=Ka(1:3);
Ki=Ka(4);
t = 0:0.001:0.1;
sys_cl = ss(Aa-Ba*Ka,Br,Ca,Da);
step(sys_cl,t)Simulink模型为:
![]()
系统的输出为:
![]()
可见,位置信号的动态响应能快速跟随单位阶跃信号,实现了很好的闭环控制。
注意,可能细心的童鞋可能注意到了,用积分的方式增加一个状态变量,此时系统的等效状态方程为:
此时等效系统并不是我们熟悉的零输入系统,也就是说,系统稳定时,状态变量 并不会衰减到零——这个没有关系,因为当输入 是阶跃信号时,如果 的极点都在复平面左半边,那 最终会稳定到一个恒定值,也就是 ,所以 ,也就是 ,因此,能够实现伺服跟踪控制。
注:这种处理方式只能保证被控对象Type 0型系统时阶跃激励( )稳态误差为零,至于Type 1及以上系统或者激励为斜坡( )等系统,反馈部分的结构设计略有不同,感兴趣的请阅读相关专著。
八、全状态观测器
通过前面的介绍我们已经知道,状态反馈是一个强大的工具,能够实现任何预定的极点配置。但是如果仔细观察反馈状态变量
就会发现仍有问题,那就是不是所有的变量都是可测量的,比如:
- 如果状态变量过多,比如有
,这会需要大量的传感器;
- 很多时候
是从 微分得到的,会有很大的噪音;
- 有些工况无法使用传感器,比如说核反应堆。
那怎么办呢?——用观测器,那怎么样观测呢?一个很自然的想法就是我把原模型copy一份啊,来个一模一样的计算模型,这样各个变量不都可以算出来了吗?
比如我们可以把状态方程和输出方程复制一份
![]()
然后就可以得到如下的示意图:
![]()
从框图可以看出,假如我们给两个模型(物理模型和数学模型)同样的输入,如果初始状态也相同,理论上两个模型的状态变量和输出应该是完全一样的。
实际上不可能这么完美,因为我们不可能知道完整的初始条件是什么样,因此不可能完全一样,而且两个模型也不可能完全一样,那输出有可能会差别很大。
控制的核心思想就是反馈,因此,当开环的模型存在较大误差,我们可以尝试一下是不是可以闭环控制,比如采用如下的形式:
![]()
这个框图啥意思呢?——就是将两个模型的输出量的误差反馈到观测模型的输入,这样只要输出有差别,观测器的状态就会进行跟随调整,保证两个模型的状态一致,进而保证输出也一致。这样观测器的方程就变为:
将两个模型的输出方程带入到状态方程,就可以得到:
将观测器的状态方程与物理模型的状态方程相减:
即
所以,只要合理配置 的极点即可。
还是之前的DC motor模型,因为观测器的数值作为反馈信号,这就要求观测的响应更快,为此,我们一般将 的极点取到 极点的10倍左右,具体MATLAB代码如下:
p1 = -100+100i;
p2 = -100-100i;
p3 = -200;
L = place(A',C',[p1*10, p2*10, p3*10])完整的simulink模型为(考虑到实际情况,我们取 ):
![]()
各状态变量及其观测值的响应为:
![]()
可见,观测值在很快的时间内收敛到真实值。整个系统的阶跃响应如下:
![]()
九、缩减状态观测器
无论需不需要,全状态观测器是对所有的状态进行观测。但是在有些系统中,很多状态是可以测量的,这是时候就有两个选择,要么用全状态观测器,然后选择用测量值或者观测值或者两者都用。另一个选择。使用缩减观测器,只对不能进行测量的状态进行观测。这部分公式比较多,但是推导过程展现的处理方式有很大的借鉴意义,有兴趣的建议按照思路自己推演一遍。
我们先要将状态分为可测量 和不可测量 两部分,然后用分块矩阵将状态方程改为:
(1)
输出方程为:
上一节我们说了,全状态观测器的方程为:
(2)
缩减状态观测器处理方式基本一致,就是要找到自己的等效表达式,假设 ,缩减观测器的等效形式为:
将状态方程(1)下半部分展开,得到:
(3)
可见,这和我们想要的缩减状态观测器基本一致,于是我们得到缩减状态观测器的 和等效输出 。再将状态方程(1)的上半部分展开,得到:
我们稍微改写一下形式:
上式右半部分取决于状态变量 ,因此可以看成是输出 ,这样我们就有了输出方程。因此,我们就可以得到缩减状态观测器:
(4)
将
以及
代入缩减状态观测器可以得到:
重新整理一下,合并同类项,得到:
仔细观察上式,我们发现 和 都是可测量或已知的,都没问题,但是 未测量啊,怎么办?我们不妨把它归到 里面,也就是说可以把这两个变量合成一个新变量:
这样,缩减状态观测器就变为:
控制框图如下:
![]()
下一个问题是,我们该如何设计状态反馈矩阵 ?
代入缩减转台估计方程(4)可以得到:
与状态方程(3)相减,可以得到;
即
因此,只需要按照要求配置矩阵 的极点即可。
还是 以之前说的DC motor为例,假设 ,即位置和速度是可观测的, ,电流是需要观测的。同样假设观测器模型是有误差的, 的具体数值如如下代码:
A11=A(1:2,1:2)*0.9;
A12=A(1:2,3)*0.9;
A21=A(3,1:2)*0.95;
A22=A(3,3)*0.9;
p5 = -200;
L = place(A22',A12',[p5*10])'搭建完整的simulink模型为:
![]()
电流的观测值和实际值曲线见下图,可见即使观测器模型我们设置了较大的误差,电流仍得到了较好的估计。
![]()
整个系统的阶跃响应为:
![]()
十、小结
正所谓横看成岭侧成峰,无论是经典控制理论,还是现代控制理论,都是用来求解微分方程,因此在本质上应该是相通的。现代控制理论提供了一个非常强大的工具去解决控制问题,已经成为现代控制领域的理论基石,但是大多数教材过分强调其计算过程,现代控制理论背后的思想反而湮没在矩阵来回的变换中,最终导致大家始终不得要领。写这个文章的目的主要是梳理一下自己学习这们课程的思路,如果能对大家有一点帮助,那就善莫大焉了。当然,这一篇文章是不可能说明白所有的事,还有很多非常重要的内容,可能会需要一些的数学基础,比如稳定性问题,最优控制,kalman滤波,这些都需要在熟悉这篇文章的基础上才能有较好的体会,如果大家感兴趣,后续还可以再整理一些。 |
|